繁体   English   中英

如何从 3D 向量中获取偏航、俯仰和滚动

[英]How to get Yaw, Pitch and Roll from a 3D vector

我有一个应用到 position 的方向向量给了我相机应该看的点。 为了正确使用 glRotatef,我怎样才能从偏航、俯仰和滚动中获得?

提前致谢

您无法从方向向量获得偏航,俯仰和滚动,因为方向向量只会告诉您要看哪个方向(偏航和俯仰)

要获得偏航角和俯仰角,您可以使用三角学-我假设您已掌握一些工作知识。 此Wiki页面上查看一些有用的图表以可视化角度。

令Y =偏航,P =俯仰。

首先要获得偏航:

tan(Y) = x/(-y)

现在开始推销:

tan(P) = sqrt(x^2 + y^2)/z

为了获得Y和P的实际值,您需要使用反正切,我已经在上面使用tan编写了它,以使推导更清晰。

请注意,减号取决于您定义角度和轴的方式,但是您应该明白这一点。

然后,您可以将roll设置为0或任意设置。

这些方程式都不是“错误的”,但都有些笨拙。 Ryder052,您的示例并未说明您所评论的某些情况。 为什么不使用atan2?

给定单位(规范化)方向矢量d

pitch = asin(-d.Y);
yaw = atan2(d.X, d.Z)

您可能实际上并不想要偏航,俯仰和滚动。 您只需要正确的转换即可。 尝试使用gluLookAt构建它。 文件资料

菲利克斯的方程式是错误的。 亲爱的未来的Google员工,您在这里工作了:

假设俯仰:X轴旋转,偏航:Y轴旋转,侧倾:Z轴旋转。 方向向量V(x,y,z)

pitch = asin(V.y / length(V));
yaw = asin( V.x / (cos(pitch)*length(V)) ); //Beware cos(pitch)==0, catch this exception!
roll = 0;

好吧,我不确定这些答案是关于什么的,因为我无法让它们中的任何一个起作用。

我创建了自己的解决方案...

// get world target offset
// convert world target offset to world direction normal
// get my world transposed (inverted)
// rotate world direction normal to my space normal

Vector3D lWorldTargetOffset = gWorldTargetLocation - gWorldMyLocation;
Vector3D lWorldTargetDirection = lWorldTargetOffset.Normalize();
MatrixD lMyWorldTransposed = MatrixD.Transpose(MyWorldMatrix);
Vector3D lMySpaceTargetDirection = Vector3D.Rotate(lWorldTargetDirection, lMyWorldTransposed);

你现在在我的空间中拥有正常的世界目标方向

lMySpaceTargetDirection.X = pitch
lMySpaceTargetDirection.Y = yaw.
lMySpaceTargetDirection.Z = <0 infront >0 behind.

根据方向法线,所有值都是-1到1,所以如果你想要度数只是* 90。

并不是说这是最好的解决方案,但它是我花费数小时在网上搜索并涉足大量迟钝和模糊不清的杂物后唯一可以开始工作的解决方案。

我希望您、某人或任何人会喜欢简单地将目标方向正常旋转,使其相对于 myspace,并发现它既简单又有用:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM