javascript - Three.js 中的基本 Collada 加载

标签 javascript three.js

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

unhandled Surface prop: format_hint
Can not convert Transform of type lookat

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);
}

最佳答案

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

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

init();
animate();

scenecamerarenderer 变量应该全局化。

关于javascript - Three.js 中的基本 Collada 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996941/

相关文章:

javascript - 当字符串中只有一个元素时,如何在 jQuery 中将字符串拆分为数组?

javascript - jQuery $.each() 超出一个索引太多

javascript - 两个选择器在另一个中不显示所选值

javascript - 告诉我为什么我不应该这样做 : Sinatra API with Full JS/HTML Frontend

javascript - Tapestry 5 - 在客户端字段验证成功/失败时运行 javascript 函数

3d - 如何将纬度和经度映射到 3D 球体

javascript - DZI Openseadragon和三个js球形图像

javascript - threejs如何在没有给出任何坐标的情况下将网格放置到场景中?

three.js - 是否可以使用 2d Canvas 作为立方体的纹理?

javascript - Three.js 非全屏时的光线转换