【问题标题】:Problem in Mesh Rotation around another Mesh of imported FBX model in Three.jsThree.js 中导入的 FBX 模型的另一个网格周围的网格旋转问题
【发布时间】:2020-09-01 19:38:10
【问题描述】:

出于学习目的,我从一个网站下载了一个免安装的 FBX 模型,它恰好是一架直升机。我想在 Three.js 中以编程方式模拟直升机叶片的旋转。我通过FBXLoader成功导入了mod,没有任何问题。我在 Blender 中检查了它的网格,它有 50 多个网格。我查明了刀片的网格并将其写在 load() 函数中:

      pivotPoint = new THREE.Object3D();
      const loader = new THREE.FBXLoader();
      group = new THREE.Object3D();

  loader.load(
    'Apache.fbx',
     object => {
          scene.add(object);

         const twentyFive = scene.getObjectByName('Mesh25'); //This is the shaft which the blades should rotate around
         console.log(twentyFive); //x: 685.594482421875, y: 136.4067840576172, z: -501.9534606933594
         twentyFive.add(pivotPoint);

         const twentyEight = scene.getObjectByName('Mesh28');//These four are the blades
         const twentyNine = scene.getObjectByName('Mesh29');
         const twentySeven = scene.getObjectByName('Mesh27');
         const twentySix = scene.getObjectByName('Mesh26');

         group.add(twentyEight);
         group.add(twentyNine);
         group.add(twentySeven);
         group.add(twentySix);

         pivotPoint.add(group);
         scene.add(pivotPoint);
         scene.add(twentyFive);

      },
        progress => ...,
        error => ...
       );

以及循环渲染函数中的以下内容:

pivotPoint.rotation.y += 0.01;

但是,当我添加嵌套的 Object3D 或将代码更改为具有大量突变的上述版本时,四个叶片会消失,这四个叶片会奇怪地围绕天空中的某个其他点旋转,除了机身,而敬畏- 受灾的飞行员目睹了这场灾难,对上述代码感到惊讶,仿佛直升机即将坠毁! 我尝试了对代码的许多更改。基本上,我曾经在另一个场景中对一些光源使用过 Object3D 父级,但现在不知道问题出在哪里。此外,叶片围绕 Mesh25(我希望的枢轴)的旋转是围绕一个不与机身接触的大圆圈,尽管所有四个都围绕它们的质心旋转。 我非常感谢任何帮助,因为我真的需要学习与类似的进口模型搏斗。

【问题讨论】:

    标签: three.js rotation pivot axis mesh


    【解决方案1】:

    在适当的地方使用attach 而不是add

             const twentyFive = scene.getObjectByName('Mesh25');
    
             // add the pivot and group first so they are in the scene
             pivotPoint.add(group);
             twentyFive.add(pivotPoint);
    
             const twentyEight = scene.getObjectByName('Mesh28');
             const twentyNine = scene.getObjectByName('Mesh29');
             const twentySeven = scene.getObjectByName('Mesh27');
             const twentySix = scene.getObjectByName('Mesh26');
    
             // use attach to move something in the scene hierarchy without
             // changing its position
             group.attach(twentyEight);
             group.attach(twentyNine);
             group.attach(twentySeven);
             group.attach(twentySix);
    
    

    这假设首先正确创建模型并且轴的位置Mesh25 位于轴的中心。

    注意:如果轴的原点在正确的位置,并且刀片已经是轴的子级,则可以旋转轴。

    【讨论】:

    • 非常感谢 gman。我用attach 替换了add 方法,并且发现行为没有变化。但是,在仔细测试了您关于正确创建模型的警告之后,我怀疑模型是否处于良好状态。从技术上讲,无论我如何更改代码,甚至使用四元数和许多其他巫术,任何网格都会围绕模型下方空间中的固定位置旋转。所以我更换了我的模型并完全改变了我的加载代码,甚至加入了更多扩展的嵌套层次结构,新的直升机使用attach 方法就像一个魅力。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2016-05-17
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多