【问题标题】:Three.js Scene utils detach / attach for character weaponsThree.js 场景工具分离/附加角色武器
【发布时间】:2018-03-07 11:10:07
【问题描述】:

我正在尝试使用 Three.js 构建 FPS,但我无法克服使用 THREE.SceneUtils.detach()THREE.SceneUtils.attach() 时遇到的一些重大故障(老实说,我什至不确定我应该使用他们)

我的机甲角色两边各有两支枪,两支枪之间有足够的空间,一个小敌人可以夹在两支枪之间,永远不会被击中。我能想到的唯一解决方案是让枪“锁定”并在敌人进入相机中心时跟随他们。这解决了我的问题,即敌人可能在枪口之间溜走,但为了解决这个问题,我遵循了 WestLangley 的想法:Three.js Rotate objects inside of moving Object3D to always face the camera

所以现在,我的(转述的)代码如下所示:

autoTarget: function ( target ) {

    THREE.SceneUtils.detach( gunRootObject, characterRootObj, scene );
    gunRootObject.lookAt( target );
    gunRootObject.updateMatrix();


    this.direction = new THREE.Vector3( 0, 0, 1 );
    this.direction.applyQuaternion( gunRootObject.quaternion );
    THREE.SceneUtils.attach( gunRootObject, scene, characterRootObj);
}

这大约有 50% 的时间有效。相对于characterRootObj,另外 50% 的两支枪最终都停留在 [0,0,0]

我做错了什么吗?我是否使用正确的方法来解决我最初的问题?

我将不胜感激任何想法。谢谢!

【问题讨论】:

  • 这对你有用吗?
  • @zehelvion 我最终报废了整个系统。我最终做的是假装大量的行为——结果更令人愉快。归根结底是为了大大简化我的代码,同时尝试呈现一种视觉上令人满意的体验,而不是感觉像是“作弊”。

标签: javascript three.js


【解决方案1】:

所以,最后,我采取了完全不同的方法:我意识到我不需要lookAt() 函数,而我只需要相对于移动对象旋转一个固定对象。所以,现在我正在使用基本的三角函数来计算我需要根据敌人与相机的距离以及其他几个固定点来旋转我的枪的角度。

由于枪相对于相机处于固定位置,我认为现在就可以了。

【讨论】:

    【解决方案2】:

    我用那个方法也有同样的问题,似乎函数打乱了孩子的位置,所以你不能依赖循环它,对我有用的是

        while (this.scalerSphere.children.length) {
            THREE.SceneUtils.detach(this.scalerSphere.children[0], this.scalerSphere, scene)
            this.scalerSphere.updateMatrixWorld()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2016-09-12
      • 2012-11-01
      • 1970-01-01
      相关资源
      最近更新 更多