如何在threejs中移动gltf模型?

Posted

技术标签:

【中文标题】如何在threejs中移动gltf模型?【英文标题】:How move a gltf model in threejs? 【发布时间】:2019-09-10 14:53:50 【问题描述】:

如何将threejs中的gltf模型从定义的场景中独立移动?

在我的代码中,我更新了一个 gltf 模型,并尝试使用 KeyboardState.js 移动它。使用的控件是 OrbitControl.js。

KeyboardState.js:https://searchcode.com/codesearch/view/69477532/

这是我使用的加载函数:

function loadGLTF(x,y,z,mesh,url)
            var loader = new THREE.GLTFLoader();
                // model
                loader.load(
                        // resource URL
                        url,
                        // called when the resource is loaded
                        function ( gltf ) 

                            mesh = gltf.scene;
                            mesh.position.set(x,y,z);
                            scene.add(mesh);
                        ,
                        // called while loading is progressing
                        function ( xhr ) 

                            console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );

                        ,
                        // called when loading has errors
                        function ( error ) 
                            console.log(error);
                            console.log( 'An error happened' );

                        
                    );

        

这是我用于键盘输入的更新功能:

function update()
        
            keyboard.update();

            var moveDistance = 50 * clock.getDelta(); 

            if ( keyboard.down("W") ) 
                mesh.translateY( moveDistance );

            if ( keyboard.down("S") ) 
                mesh.translateY(   -moveDistance );

            if ( keyboard.down("A") )
                console.log("entered in A");
                mesh.translateX( -moveDistance );
            

            if ( keyboard.down("D") )
                console.log("entered in D");
                mesh.translateX(  moveDistance );
            


            controls.update();
            stats.update();
        

但实际上发生的是对象随着整个场景移动,而不是独立于场景移动。如果我使用相同的代码来移动例如球体,它就可以工作。为什么?也许 gltf 文件在内部以隐式方式依赖于场景,而不是简单的 THREE.SphereGeometry?

【问题讨论】:

不是您问题的答案,但您可能会发现 this article 有用 【参考方案1】:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo</title>
  </head>
  <body>
    <script src="https://rawcdn.githack.com/mrdoob/three.js/d9f87fb1a2c5db1ea0e2feda9bd42b39b5bedc41/build/three.min.js
"></script>
    <script src="https://unpkg.com/three@0.85.0/examples/js/controls/OrbitControls.js"></script>
    <script src="https://unpkg.com/three@0.87.1/examples/js/loaders/GLTFLoader.js"></script>

    <script>
      var scene, camera, renderer;

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

        scene.background = new THREE.Color(0xefefef);
        camera.position.set(5, 5, 5);

        renderer = new THREE.WebGLRenderer( antialias: true );
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
   
        var car;
        var loader = new THREE.GLTFLoader();
        loader.load(
          "https://rawcdn.githack.com/siouxcitizen/3DModel/a1c2e47550ca20de421f6d779229f66efab07830/yuusha.gltf",
          function (gltf) 
            car = gltf.scene;
            scene.add(car);
          
        );

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

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

        animate();
      

      init();
    </script>
  </body>
</html>

试试这个例子

【讨论】:

请在您的回答中添加一些解释 这个例子展示了如何使用 gltf 加载器以及如何在该模型上应用轨道控制。【参考方案2】:

您似乎没有正确使用KeyboardState。这个想法是使用pressed() 方法来验证是否按下了某个键。您还可以在下面的实时示例中看到,只有 glTF 模型被平移,而不是整个场景(因为轴助手保持在中心)。

https://jsfiddle.net/kd41ejua/1/

【讨论】:

以上是关于如何在threejs中移动gltf模型?的主要内容,如果未能解决你的问题,请参考以下文章

surfer如何导出三维gltf文件

如何在threejs或react-three-fiber中加载相同的gltf模型

如何在加载到场景之前将 OBJ/FBX 转换为 GLTF(使用 Threejs)

ThreeJS 加载gltf模型过暗问题解决

GIS开发:Threejs加载gltf模型

threejs 低级技巧