【问题标题】:Basic Collada Loading in Three.jsThree.js 中的基本 Collada 加载
【发布时间】:2015-11-06 22:26:47
【问题描述】:

我正在尝试使用 three.js 和 collada 加载程序加载 collada 文件。我正在利用three.js 文档,但似乎无法让文件在屏幕上呈现。我想要实现的是一个非常基本的 collada 文件导入场景,不需要动画。我收到的错误如下:

未处理的 Surface 属性:format_hint
无法转换类型为lookat的Transform

XHR 输出显示 .dae 文件的 100% 负载,我可以在浏览器中浏览到存储文件的位置并将其查看为 XML。我目前在 IIS 中将 mime 类型设置为 application/xml。

这是我当前的代码。我错过了什么?:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>three.js webgl - loaders - collada loader</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <script src="scripts/three.min.js"></script>
    <script src="scripts/ColladaLoader.js"></script>
    <script src="scripts/jquery-2.1.4.min.js"></script>
    <script src="scripts/bootstrap.min.js"></script>
    <link href="css/bootstrap.min.css" rel="stylesheet" />
</head>

<body>
    <h1>Box Example</h1>
    <p>This example loads an collada file</p>

    <div id="webGL-container"></div>

    <script>
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        var renderer = new THREE.WebGLRenderer();

        renderer.setClearColor(0xff0000);
        renderer.setSize(window.innerWidth, window.innerHeight);

        camera.position.x = 40;
        camera.position.y = 40;
        camera.position.z = 40;

        // instantiate a loader
        var loader = new THREE.ColladaLoader();

        loader.load(
            // resource URL
            'models/box.dae',

            // Function when resource is loaded
            function (collada) {
                scene.add(collada.scene);
            },
            // Function called when download progresses
            function (xhr) {
                console.log((xhr.loaded / xhr.total * 100) + '% loaded');
            }
        );

        camera.lookAt(scene.position);

        renderer.render(scene, camera);
        $("#webGL-container").append(renderer.domElement);
    </script>
</body>
</html>

根据提供的建议,这是第 2 版:

    var scene;;
    var camera;
    var renderer;
    var loader;

    function init() {
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    renderer = new THREE.WebGLRenderer();


    renderer.setClearColor();
    renderer.setSize(window.innerWidth, window.innerHeight);

    camera.position.x = 40;
    camera.position.y = 40;
    camera.position.z = 40;

    // instantiate a loader
    loader = new THREE.ColladaLoader();


        loader.load(
            // resource URL
            'models/box.dae',

            // Function when resource is loaded
            function (collada) {
                scene.add(collada.scene);
            },
            // Function called when download progresses
            function (xhr) {
                console.log((xhr.loaded / xhr.total * 100) + '% loaded');
            }
        );

        camera.lookAt(scene.position);
        $("#webGL-container").append(renderer.domElement);

    };



    function animate() {
        requestAnimationFrame(animate);

        renderer.render(scene, camera);
    }

    init();
    animate();

更新 3:我已经能够获取要渲染的核心 .DAE 文件,但它缺少纹理(当前将框显示为全黑):

    var scene;
    var camera;
    var renderer;
    var box;

    // instantiate a loader
    var loader = new THREE.ColladaLoader();
    loader.options.convertUpAxis = true;
    loader.load('models//box.dae', function (collada) {

        box = collada.scene;

        box.traverse(function (child) {

            if (child instanceof THREE.SkinnedMesh) {

                var animation = new THREE.Animation(child, child.geometry.animation);
                animation.play();

            }
        });

        box.scale.x = box.scale.y = box.scale.z = .2;
        box.updateMatrix();

        init();
        animate();
    });


    function init() {
        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        renderer = new THREE.WebGLRenderer();

        renderer.setClearColor(0xdddddd);
        renderer.setSize(window.innerWidth, window.innerHeight);

        scene.add(box);

        camera.position.x = 40;
        camera.position.y = 40;
        camera.position.z = 40;

        camera.lookAt(scene.position);
    }

    function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
        $("#webGL-container").append(renderer.domElement);
    }

【问题讨论】:

  • 文件是否加载到threejs.org/editor 中?
  • 它会加载,就像“Monster” Collada 3D 示例一样,但我需要一个更基本的示例来说明如何加载。

标签: javascript three.js


【解决方案1】:

您遇到了 javascript 的异步加载。当您致电renderer.render() 时,您的场景仍然是空的,因为模型尚未下载。将您拥有的代码放入 init() 函数中,然后创建一个 animate() 函数并这样调用它们:

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

init();
animate();

变量 scene、camera、renderer 你应该设为全局变量。

【讨论】:

  • 有没有办法在没有全局变量的情况下实现这一点?或者你的意思是声明像 var scene 之类的东西;然后场景 = new Three.Scene();
  • 我的意思是这三个变量必须在init() 和animate() 函数之外定义(即全局)。
  • 感谢您的澄清。将立即进行测试。
  • animate() 中的第三行应该在 init() 中。您只需要添加一次容器(不是每一帧)。也对你为动画所做的纹理做同样的事情。
  • 我没有看到你的纹理调用
猜你喜欢
  • 2013-06-26
  • 2016-03-26
  • 2013-05-08
  • 2017-02-05
  • 2012-11-01
  • 2012-08-18
  • 2015-10-12
  • 2012-10-06
  • 2015-12-04
相关资源
最近更新 更多