所以,这里有一个向量,矩阵,旋转,四元数的问题给three.js大师!
我在position(0,0,275)有一个父对象,带有direction(0,0,-1),+y up和rotation(0,0,0)。
附加到父对象的是一个具有关系的子对象:
rel_position(.5, 0, 0)
rel_rotation(0, 0, 0)我在场景中也有一个目标:
position(0, 100, 0)考虑一艘有俯仰、偏航和横摇的船(父船)。它有一个带有俯仰和偏航的炮塔(子塔)。炮塔需要以给定的转速(rad/s)跟踪目标。
我花了5天的时间试图得到一个合适的跟踪算法。我能做的最好的事情就是删除父元素和子元素上的matrixAutoUpdate特性,手动更新矩阵。然后使用child.matrixWorld为当前子旋转创建旋转矩阵或四元数。然后,我可以创建一个从子位置查看目标的辅助Object3D。我可以求出子Object3D和次rad之间的差值,并以rad/s为基础对四元数进行slerp。但是,当我将滚动添加到父对象或目标旋转到八分(+, +, +)之外时,子旋转(或四元数)计算崩溃,导致疯狂旋转。
对于子Object3D的跟踪算法的任何方向都将非常感谢。你的努力将在我即将到来的项目中被引用。
谢谢您抽时间见我!
发布于 2013-03-28 22:04:21
所以这就是答案!@Stemkoski,谢谢你的指导。我采取了类似的方法来解决昨天曝光的最终解决方案。由于矩阵求逆,这在计算能力上有点昂贵,但它工作得很好。首先,创建一个新矩阵,如下所示:
var m = new THREE.Matrix4().getInverse(parent.matrix).multiply(target.matrix); 这将基于父对象的旋转将XYZ轴的参考系旋转到新坐标X'Y'Z‘。结果是目标在X'Y'Z‘参照系中的Object3D矩阵。现在,通过从矩阵'm‘创建一个新的Vector3,我们可以使用以下命令获得相对位置:
var rel_pos = new THREE.Vector3().getPositionFromMatrix(m, 'XYZ');现在创建一个人造对象,以便从子对象(转塔)的位置直接观察目标。
var child_faux = new THREE.Object3D(); //can be created outside the loop
child_faux.position.copy(child.position); //copy the child local position
child_faux.lookAt(rel_pos); //look at the target
child_faux.updateMatrix(); //Update the Matrix4 element for use in a second最后,通过将child_fuax设置为lookAt一个对象,我们已经自动设置了child_faux.rotation。我们可以使用以下方法获得当前child.rotation和child_faux.rotation之间的相对旋转:
var diff = turret_target.rotation.sub(turret.rotation);从这里我们可以设置一个简单的算法来旋转转塔(+或-)(x和y),直到diff (x和y)变为0。
var trackrate = .2 * delta;
var diff = turret_target.rotation.sub(turret.rotation);
turret.rotation.x += diff.x/Math.abs(diff.x) * trackrate;
turret.rotation.y += diff.y / Math.abs(diff.y) * trackrate;
turret.updateMatrix();这就是……在父组中旋转的子对象的目标跟踪算法!感谢您的阅读!
发布于 2013-03-28 12:07:23
也许lookAt和worldToLocal方法的某种组合可以起作用?由于您需要将目标对象的位置转换为转塔的局部坐标,然后相应地更改转塔的旋转,这样如何:
turret.lookAt( turret.worldToLocal( target.position.clone() ) )https://stackoverflow.com/questions/15664436
复制相似问题