我试图使用Three.js构建一个FPS,但我无法通过THREE.SceneUtils.detach()
和THREE.SceneUtils.attach()
遇到一些重大故障(老实说)我甚至不确定我应该使用它们吗?
我的机械角色两边都有2支枪,两者之间有足够的空间,两个枪之间可以装上一个小敌人,从不射击。我能想到的唯一解决方案是让枪支锁定"当他们进入相机中心时跟随敌人。这解决了我的问题,敌人可以在枪支之间滑动,但为了解决这个问题,我遵循了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%的时间都有效。另外50%的两支枪最终都相对于characterRootObj
我做错了什么吗?我甚至使用正确的方法来解决我的原始问题吗?
我非常感谢任何想法。谢谢!
答案 0 :(得分:1)
所以,最后,我采用了完全不同的方法:我意识到当我需要的是相对于移动的一个固定对象旋转时,我不需要lookAt()
函数。所以,现在我正在使用基本的三角函数来计算我需要根据敌人与相机的距离来旋转枪支所需的角度。其他一些固定点。
由于枪支相对于相机处于固定位置,我认为现在这样做。
答案 1 :(得分:0)
我对那个方法有同样的问题,似乎这个函数扰乱了孩子们的位置,所以你不能再依次循环,对我有用的是
while (this.scalerSphere.children.length) {
THREE.SceneUtils.detach(this.scalerSphere.children[0], this.scalerSphere, scene)
this.scalerSphere.updateMatrixWorld()
}