Three.js 角色武器的场景实用程序分离/附加
Three.js Scene utils detach / attach for character weapons
我正在尝试使用 Three.js 构建 FPS,但我无法克服使用 THREE.SceneUtils.detach()
和 THREE.SceneUtils.attach()
时遇到的一些主要故障(老实说,我我什至不确定我应该使用它们)
我的机甲角色两边各有 2 支枪,两支枪之间有足够的 space,一个小敌人可以夹在两支枪之间而不会被击中。我能想到的唯一解决办法是让枪 "lock on" 并在敌人进入摄像机中心时跟随他们。这解决了我的问题,即敌人可能会从枪口之间溜走,但为了解决这个问题,我遵循了 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]
我做错了什么吗?我是否使用了正确的方法来解决我原来的问题?
如果有任何想法,我将不胜感激。谢谢!
所以,最后,我采用了完全不同的方法:我意识到我不需要 lookAt()
函数,因为我需要的只是相对于移动的对象旋转一个固定的对象。所以,现在我正在使用基本的三角函数来计算我需要根据敌人与相机的距离和其他几个固定点的距离来旋转我的枪支的角度。
由于枪支相对于相机处于固定位置,我认为现在就可以了。
我用那个方法遇到了同样的问题,似乎该函数打乱了 children 的位置,所以你不能依靠它进行循环,对我有用的是
while (this.scalerSphere.children.length) {
THREE.SceneUtils.detach(this.scalerSphere.children[0], this.scalerSphere, scene)
this.scalerSphere.updateMatrixWorld()
}
我正在尝试使用 Three.js 构建 FPS,但我无法克服使用 THREE.SceneUtils.detach()
和 THREE.SceneUtils.attach()
时遇到的一些主要故障(老实说,我我什至不确定我应该使用它们)
我的机甲角色两边各有 2 支枪,两支枪之间有足够的 space,一个小敌人可以夹在两支枪之间而不会被击中。我能想到的唯一解决办法是让枪 "lock on" 并在敌人进入摄像机中心时跟随他们。这解决了我的问题,即敌人可能会从枪口之间溜走,但为了解决这个问题,我遵循了 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
我做错了什么吗?我是否使用了正确的方法来解决我原来的问题?
如果有任何想法,我将不胜感激。谢谢!
所以,最后,我采用了完全不同的方法:我意识到我不需要 lookAt()
函数,因为我需要的只是相对于移动的对象旋转一个固定的对象。所以,现在我正在使用基本的三角函数来计算我需要根据敌人与相机的距离和其他几个固定点的距离来旋转我的枪支的角度。
由于枪支相对于相机处于固定位置,我认为现在就可以了。
我用那个方法遇到了同样的问题,似乎该函数打乱了 children 的位置,所以你不能依靠它进行循环,对我有用的是
while (this.scalerSphere.children.length) {
THREE.SceneUtils.detach(this.scalerSphere.children[0], this.scalerSphere, scene)
this.scalerSphere.updateMatrixWorld()
}