Three.JS OBJ 模型未显示

问题描述 投票:0回答:3

我有 .obj 模型,比我在 c4d 中制作(找到)的模型并以米为单位的比例 1 导出。我尝试使用 OBJLoader 在 Three.js 中加载它,没有错误,但模型未显示。这是什么问题

<script src="http://threejs.org/build/three.js"></script>
<script src="http://threejs.org/examples/js/loaders/OBJLoader.js"></script>
<body style="margin:0;padding:0;">
</body>
<script>
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 1, 2000);
    var render = new THREE.WebGLRenderer();
    camera.position.set(0, 0, 53);

    render.setSize(innerWidth, innerHeight);
    document.body.appendChild(canvas = render.domElement);

    render.setClearColor(0x111111, 1);

    function loadScene() {
        var loader = new THREE.OBJLoader();
        loader.load("./fox.obj", function(model) {
            model.traverse(function(child) {
                if (child instanceof THREE.Mesh) {
                    child.material.color = 0xffb830;
                }
            });
            model.position.set(0, 0, -53);
            scene.add(model);
            window.model = model;
        });
        render.render(scene, camera);
    }

    window.onload = loadScene;
</script>
javascript three.js
3个回答
5
投票

我通过以下方式使其工作:(下面更简单的更正,在更新中)

1 - 删除此行:

render.render(scene, camera);

2 - 在初始化后添加这段代码:

function animate() {
    requestAnimationFrame( animate );
    render.render( scene, camera );
}
animate();

3 - 还可以为 Three.js 库使用不同的源。我将当前在另一个项目中使用的本地副本包含在内,并且它有效。可能您从过时的来源获取它...尝试直接从下载链接下载文件:https://github.com/mrdoob/ Three.js/archive/master.zip

您还应该尝试将 OrbitControls 添加到场景中,以便您可以在场景中进行轨道/导航,因为该对象可能比您预期的大并且因此不会(显然)显示。 您可以通过包含 Three.js 源中提供的 OrbitControls.js 并将以下行添加到代码中来添加轨道控件:

var controls = new THREE.OrbitControls( camera, render.domElement );

更新:

只需在 load 方法的函数中调用 render 即可,就像 ManoDestra 建议的那样:

loader.load("./fox.obj", function(model) {
    model.traverse(function(child) {
        if (child instanceof THREE.Mesh) {
            child.material.color = 0xffb830;
        }
    });
    model.position.set(0, 0, -53);
    scene.add(model);
    window.model = model;
    render.render(scene, camera);
});

1
投票

问题是您在对象加载之前渲染场景。

以仅在模型加载后才调用的方式放置 render.render(scene, camera) 调用。例如

function loadScene() {
    var loader = new THREE.OBJLoader();
    loader.load("./fox.obj", function(model) {
        model.traverse(function(child) {
            if (child instanceof THREE.Mesh) {
                child.material.color = 0xffb830;
            }
        });
        model.position.set(0, 0, -53);
        scene.add(model);
        window.model = model;
        render.render(scene, camera);
    });
}

我还会确保您的所有源代码都存在于头部(或 HTML 的尾部,如果这是您的偏好)。然后,只需在窗口的加载事件上调用初始化代码即可。并且,如上所述,仅在加载所有资源后才首次渲染场景。

您可能还需要打电话来查看您的场景,例如......

camera.lookAt(scene.position);

哦,还有,child.material.color 是一个对象,例如

child.material.color = { r:1, g:1, b:1 }


1
投票
  1. THREE.MeshBasicMaterial({color:'red'})
    应用于所有加载的网格,以消除诸如丢失法线、丢失灯光、丢失纹理等的情况 (此材质不需要这些即可工作)
  2. 查看
    model.children[N].geometry.vertices
    看看那里是否有有效值
© www.soinside.com 2019 - 2024. All rights reserved.