javascript - 在 Three.js 中使用二进制加载器加载对象不起作用

标签 javascript json three.js

我正在尝试修改 Three.js 示例的代码以加载在 .js 中转换的 .obj。它使用 BinaryLoader.js 来加载对象。该对象没有显示在我修改的代码中。到目前为止我的代码如下

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>home</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 {
                background:#000;
                color:#fff;
                padding:0;
                margin:0;
                overflow:hidden;
                font-family:georgia;
                text-align:center;
            }

        </style>
    </head>

    <body>

        <script src="js/three.min.js"></script>

        <script src="js/loaders/BinaryLoader.js"></script>

        <script src="js/Detector.js"></script>

        <script>

            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

            var CARS = {

                "Porsche":  {

                    name:   "Bugatti Veyron",
                    url:    "obj/car/Porsche_911_GT2.js",
                //  author: '<a href="http://artist-3d.com/free_3d_models/dnm/model_disp.php?uid=1129" target="_blank">Troyano</a>',
                    init_rotation: [ 0, 0, 0 ],
                    scale: 5.5,
                    //init_material: 4,
                    //body_materials: [ 2 ],

                    object: null,
                    buttons: null,
                    materials: null

                }


            };

            var container, stats;

            var camera, scene, renderer;

            init();
            animate();

            function init() {

                container = document.createElement( 'div' );
                document.body.appendChild( container );


            var loader = new THREE.BinaryLoader( true );
            document.body.appendChild( loader.statusDomElement );
                // CAMERAS

                camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 100000 );

                // SCENE

                scene = new THREE.Scene();

                    // LIGHTS

                var ambient = new THREE.AmbientLight( 0x050505 );
                scene.add( ambient );

                renderer = new THREE.WebGLRenderer();
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                renderer.setFaceCulling( THREE.CullFaceNone );
                renderer.autoClear = false;

                container.appendChild( renderer.domElement );

                loader.load( CARS[ "Porsche" ].url, function( geometry ) { createScene( geometry, "Porsche" ) } );

            }

            function animate() {

            requestAnimationFrame( animate );

            render();

            }

            function render() {

                var timer = -0.0002 * Date.now();

                camera.position.x = 1000 * Math.cos( timer );
                camera.position.y += ( - mouseY - camera.position.y ) * .05;
                camera.position.z = 1000 * Math.sin( timer );

                camera.lookAt( scene.position );
                    renderer.render( scene, camera );


            }



    </script>
    </body>
</html>

有人知道这个问题吗?

最佳答案

你有一个 JSON 模型,所以你需要一个 JSONLoader 而不是 BinaryLoader,另一个问题是你的模型很小,所以你必须将其缩放 200 才能从初始化的相机中查看(fov=70) 。我将使用以下代码:

var loader = new THREE.JSONLoader(true);

loader.load(CARS[ "Porsche" ].url, function (geometry)
{
    /*createScene( geometry, "Porsche" )*/
    var material = new THREE.MeshBasicMaterial({color: 0xff0000});
    var mesh = new THREE.Mesh(geometry, material);
    mesh.scale.set(200,200,200);
    scene.add(mesh);
});

更新:此处有完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <title>home</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 {
            background: #000;
            color: #fff;
            padding: 0;
            margin: 0;
            overflow: hidden;
            font-family: georgia;
            text-align: center;
        }

    </style>
</head>

<body>

<script src="js/three.min.js"></script>

<script src="js/loaders/BinaryLoader.js"></script>

<script src="js/Detector.js"></script>

<script>

    if (!Detector.webgl) {
        Detector.addGetWebGLMessage();
    }
    var mouseY = 0;
    var CARS = {

        "Porsche": {

            name: "Bugatti Veyron",
            url: "obj/car/Porsche_911_GT2.js",
            //  author: '<a href="http://artist-3d.com/free_3d_models/dnm/model_disp.php?uid=1129" target="_blank">Troyano</a>',
            init_rotation: [ 0, 0, 0 ],
            scale: 5.5,
            //init_material: 4,
            //body_materials: [ 2 ],

            object: null,
            buttons: null,
            materials: null

        }


    };

    var container, stats;

    var camera, scene, renderer;

    init();
    animate();

    function init()
    {

        container = document.createElement('div');
        document.body.appendChild(container);

        var loader = new THREE.JSONLoader(true);
        document.body.appendChild(loader.statusDomElement);
        // CAMERAS

        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100000);

        // SCENE

        scene = new THREE.Scene();

        // LIGHTS

        var ambient = new THREE.AmbientLight(0x050505);
        scene.add(ambient);

        renderer = new THREE.WebGLRenderer();
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setFaceCulling(THREE.CullFaceNone);
        renderer.autoClear = false;

        loader.load(CARS[ "Porsche" ].url, function (geometry)
        {
            /*createScene( geometry, "Porsche" )*/
            var material = new THREE.MeshBasicMaterial({color: 0xff0000});
            var mesh = new THREE.Mesh(geometry, material);
            mesh.scale.set(200,200,200);
            scene.add(mesh);
        });

        container.appendChild(renderer.domElement);

    }

    function animate()
    {

        requestAnimationFrame(animate);

        render();

    }

    function render()
    {

        var timer = -0.0002 * Date.now();

        camera.position.x = 1000 * Math.cos(timer);
        camera.position.y += ( -mouseY - camera.position.y ) * .05;
        camera.position.z = 1000 * Math.sin(timer);

        camera.lookAt(scene.position);
        renderer.render(scene, camera);

    }


</script>
</body>
</html>

关于javascript - 在 Three.js 中使用二进制加载器加载对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29120273/

相关文章:

javascript - 我如何简化这段代码?有更好的方法吗?

javascript - 3DS Max => ThreeJs。导出场景

javascript - 为什么 (x^0===x) 输出 x 而不是 true/false?

javascript - Angular 4 : can't update the query string of URL

jquery - 相当于这个 html 表单提交的 jQuery ajax 是什么?

c++ - JSONcpp 遍历对象内的列表

javascript - 如何在 Three.js 上添加两个向量?

three.js - 轮廓对象(正常比例+模板掩模)三.js

javascript - 将Http Header 添加到静态文件解决 "Script Error"

javascript - 如何在 JSON 中接收字节数组