我需要计算 3D 对象面对任意 3D 点的 2 个角度(偏航角和俯仰角)。这些旋转被称为“欧拉”旋转,因为在第一次旋转之后(假设 Z,基于下图),Y 轴也随着对象旋转。
这是我正在使用的代码,但它不能完全工作。当在地平面 (Y = 0) 上时,对象正确旋转以面向该点,但是一旦我在 Y 中向上移动该点,旋转看起来就不正确。
// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards
yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )
您知道如何计算给定点的 2 个欧拉角吗?
下图显示了我旋转的方式。这些是我需要计算的角度。
(唯一的区别是我按照 X、Y、Z 而不是 Z、Y、X 的顺序旋转对象)
这是我的系统。
最佳答案
以下是我的工作假设:
(术语偏航、俯仰和滚转可能会令人困惑,所以我想避免使用它,但粗略地说,对应关系是 x=pitch, y=yaw, z=roll。)
鉴于此设置,这是我尝试解决您的问题的尝试:
rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )
希望这是正确的迹象。我认为修复这些标志的最简单方法是反复试验。确实,您似乎已经收到了
rotx
上的标志。和 roty
正确——包括一个关于 z 的微妙问题——所以你只需要修复 rotz
上的标志.我希望这不是微不足道的(可能取决于您所在的八分圆),但请尝试几种可能性,然后再说它是错误的。祝你好运!
这是最终对我有用的代码。
我注意到当物体从任何前象限(正 Z)移动到任何后象限时会发生“翻转”效应。在前象限 前台对象总是面向点。在后象限 返回 物体始终面向点。
此代码纠正了翻转效果,因此对象的正面 总是 正视点。我通过反复试验遇到了它,所以我真的不知道发生了什么!
rotx = Math.atan2( y, z );
if (z >= 0) {
roty = -Math.atan2( x * Math.cos(rotx), z );
}else{
roty = Math.atan2( x * Math.cos(rotx), -z );
}
关于math - 计算旋转以查看 3D 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1251828/