替换 3d 模型 (json)
Replace 3d model (json)
我在网上找到了一个例子,在这个例子中显示了一个放置在停车场上的 3D 模型(摩天轮),背景是 Google 街景全景图。
现在我想用另一个 3d 对象(一颗小行星)替换摩天轮,我将其下载为 3DS 和 OBJ。文件。我通过 Blender 将 3DS 文件转换为 JSON,但是当我替换文件时它只显示一个空白屏幕。
我该怎么做?这是我的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Street View Overlay - EINA</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
margin: 0px;
overflow: hidden;
}
p {
font-family:sans-serif;
font-size:11px;
font-weight:bold;
color:#111111;
}
</style>
</head>
<body>
<div id="streetviewpano" style="position: absolute; top:0; bottom:0; left:0; right:0; z-index: 0">
</div>
<div id="container" style="position: absolute; top:0; bottom:100px; left: 0; right: 0; z-index: 100;">
</div>
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script src="lib/jquery-2.0.3.js"></script>
<script src="lib/jquery.mousewheel.js"></script>
<script src="lib/three.min.js"></script>
<script src="lib/Detector.js"></script>
<script src="src/streetviewoverlay.js"></script>
<script>
var METERS2DEGREES = 0.0000125;
var objectPosition = [48.804828,2.1203071];
function hackMapProjection(lat, lon, originLat, originLon) {
var lonCorrection = 1.5;
var rMajor = 6378137.0;
function lonToX(lon) {
return rMajor * (lon * Math.PI / 180);
}
function latToY(lat) {
if (lat === 0) {
return 0;
} else {
return rMajor * Math.log(Math.tan(Math.PI / 4 + (lat * Math.PI / 180) / 2));
}
}
var x = lonToX(lon - originLon) / lonCorrection;
var y = latToY(lat - originLat);
return {'x': x, 'y': y};
}
function latLon2ThreeMeters(lat, lon) {
var xy = hackMapProjection(lat, lon, objectPosition[0], objectPosition[1]);
return {'x': xy.x, 'y': 0, 'z': -xy.y};
}
var jsonLoader = new THREE.JSONLoader();
jsonLoader.load( "model3d/wheel.js", loadWheel );
function loadWheel(geometry, materials) {
var mesh;
mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
meshPos = latLon2ThreeMeters(objectPosition[0], objectPosition[1]);
mesh.geometry.computeBoundingBox();
var xsize = mesh.geometry.boundingBox.max.x - mesh.geometry.boundingBox.min.x;
var ysize = mesh.geometry.boundingBox.max.y - mesh.geometry.boundingBox.min.y;
var zsize = mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z;
var desiredXSize = 10;
var desiredYSize = 10;
var desiredZSize = 10;
mesh.scale.x = desiredXSize / xsize;
mesh.scale.y = desiredYSize / ysize;
mesh.scale.z = desiredZSize / zsize;
mesh.position.x = meshPos.x;
mesh.position.y = meshPos.y - 2; // the parking lot is sligthly under the street level
mesh.position.z = meshPos.z;
mesh.rotation.y = Math.PI/2;
mesh.castShadow = true;
var streetViewOverlay = StreetViewOverlay();
streetViewOverlay.load({streetView: true, objects3D: true, webGL:true}, mesh,48.8049084,2.120357);
}
</script>
</body>
</html>
事情是这样的..你可以转换为 three.json 格式,这很好,但是你的转换工具的版本必须与你正在使用的三个版本相匹配..你还想接近最新的 three.js 版本..
但一个大问题是 three.json 格式在版本之间仍然有些变化,所以我过去曾遇到过以前导出的模型变得陈旧的情况。
如果我是你.. 我会使用 OBJLoader 并直接加载你的 OBJ,或者使用像 GLTF 或 Collada 这样的格式,以及它们各自的加载器。这些格式不太可能老化。特别是 GTLF 看起来正朝着被广泛支持的方向发展,并且有很多不错的功能,使其对于实时 3d 非常有效。
r.e。您的具体问题:首先,我会问您在加载模型时是否在控制台中看到任何错误。其次,我会在加载程序内部的行上放置一个调试断点,并目视检查场景及其 .children,
或者在代码中使用 scene.traverse((elem)=>{console.log(elem.type,elem);});
如果至少没有显示一个 "Mesh",则表示您的转换可能有问题。.如果确实显示,则可能表示网格太小而无法看到,或者太大而无法看到,或者 material 可能是意外透明或许多其他可能性。那时,您可以查看 mesh.geometry 并确保其中包含顶点和元素...
失败了:
如果您尝试使用 OBJLoader 或其他一些加载程序,但仍然无法正常工作.. 请与我们联系。 :)
我在网上找到了一个例子,在这个例子中显示了一个放置在停车场上的 3D 模型(摩天轮),背景是 Google 街景全景图。
现在我想用另一个 3d 对象(一颗小行星)替换摩天轮,我将其下载为 3DS 和 OBJ。文件。我通过 Blender 将 3DS 文件转换为 JSON,但是当我替换文件时它只显示一个空白屏幕。
我该怎么做?这是我的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Street View Overlay - EINA</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
margin: 0px;
overflow: hidden;
}
p {
font-family:sans-serif;
font-size:11px;
font-weight:bold;
color:#111111;
}
</style>
</head>
<body>
<div id="streetviewpano" style="position: absolute; top:0; bottom:0; left:0; right:0; z-index: 0">
</div>
<div id="container" style="position: absolute; top:0; bottom:100px; left: 0; right: 0; z-index: 100;">
</div>
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script src="lib/jquery-2.0.3.js"></script>
<script src="lib/jquery.mousewheel.js"></script>
<script src="lib/three.min.js"></script>
<script src="lib/Detector.js"></script>
<script src="src/streetviewoverlay.js"></script>
<script>
var METERS2DEGREES = 0.0000125;
var objectPosition = [48.804828,2.1203071];
function hackMapProjection(lat, lon, originLat, originLon) {
var lonCorrection = 1.5;
var rMajor = 6378137.0;
function lonToX(lon) {
return rMajor * (lon * Math.PI / 180);
}
function latToY(lat) {
if (lat === 0) {
return 0;
} else {
return rMajor * Math.log(Math.tan(Math.PI / 4 + (lat * Math.PI / 180) / 2));
}
}
var x = lonToX(lon - originLon) / lonCorrection;
var y = latToY(lat - originLat);
return {'x': x, 'y': y};
}
function latLon2ThreeMeters(lat, lon) {
var xy = hackMapProjection(lat, lon, objectPosition[0], objectPosition[1]);
return {'x': xy.x, 'y': 0, 'z': -xy.y};
}
var jsonLoader = new THREE.JSONLoader();
jsonLoader.load( "model3d/wheel.js", loadWheel );
function loadWheel(geometry, materials) {
var mesh;
mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
meshPos = latLon2ThreeMeters(objectPosition[0], objectPosition[1]);
mesh.geometry.computeBoundingBox();
var xsize = mesh.geometry.boundingBox.max.x - mesh.geometry.boundingBox.min.x;
var ysize = mesh.geometry.boundingBox.max.y - mesh.geometry.boundingBox.min.y;
var zsize = mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z;
var desiredXSize = 10;
var desiredYSize = 10;
var desiredZSize = 10;
mesh.scale.x = desiredXSize / xsize;
mesh.scale.y = desiredYSize / ysize;
mesh.scale.z = desiredZSize / zsize;
mesh.position.x = meshPos.x;
mesh.position.y = meshPos.y - 2; // the parking lot is sligthly under the street level
mesh.position.z = meshPos.z;
mesh.rotation.y = Math.PI/2;
mesh.castShadow = true;
var streetViewOverlay = StreetViewOverlay();
streetViewOverlay.load({streetView: true, objects3D: true, webGL:true}, mesh,48.8049084,2.120357);
}
</script>
</body>
</html>
事情是这样的..你可以转换为 three.json 格式,这很好,但是你的转换工具的版本必须与你正在使用的三个版本相匹配..你还想接近最新的 three.js 版本..
但一个大问题是 three.json 格式在版本之间仍然有些变化,所以我过去曾遇到过以前导出的模型变得陈旧的情况。
如果我是你.. 我会使用 OBJLoader 并直接加载你的 OBJ,或者使用像 GLTF 或 Collada 这样的格式,以及它们各自的加载器。这些格式不太可能老化。特别是 GTLF 看起来正朝着被广泛支持的方向发展,并且有很多不错的功能,使其对于实时 3d 非常有效。
r.e。您的具体问题:首先,我会问您在加载模型时是否在控制台中看到任何错误。其次,我会在加载程序内部的行上放置一个调试断点,并目视检查场景及其 .children,
或者在代码中使用 scene.traverse((elem)=>{console.log(elem.type,elem);});
如果至少没有显示一个 "Mesh",则表示您的转换可能有问题。.如果确实显示,则可能表示网格太小而无法看到,或者太大而无法看到,或者 material 可能是意外透明或许多其他可能性。那时,您可以查看 mesh.geometry 并确保其中包含顶点和元素...
失败了:
如果您尝试使用 OBJLoader 或其他一些加载程序,但仍然无法正常工作.. 请与我们联系。 :)