如何从3D矢量获得偏航,俯仰和滚动

时间:2010-05-06 16:18:29

标签: math opengl 3d vector

我有一个应用于位置的方向向量给了我相机应该看的点。为了正确使用glRotatef,我如何从偏航,俯仰和滚动中获得?

提前致谢

4 个答案:

答案 0 :(得分:16)

你不能从方向向量得到偏航,俯仰和滚动,因为方向向量只会指出要查看的方向(偏航和俯仰)

为了获得偏航和俯仰你使用三角学 - 我假设你有一些工作知识。查看this wiki page以获取一些有用的图表以可视化角度。

让Y =偏航,P =俯仰。

首先得到你想要的偏航:

tan(Y) = x/(-y)

现在要投球:

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

要获得Y和P的实际值,您需要使用反褐色,我使用tan将其写在上面以使推导更清晰。

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

然后你可以将roll设置为0或任何你喜欢的颜色。

答案 1 :(得分:13)

None of these equations are 'wrong' but all are a little clumsy. Ryder052, you example does not account certain cases as you've commented. Why not use atan2?

Given unit (normalized) direction vector d

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

答案 2 :(得分:8)

你可能实际上并不想要偏航,俯仰和翻滚。你只需要正确的转换。尝试使用gluLookAt来构建它。 Documentation

答案 3 :(得分:2)

pheelicks的方程是错误的。亲爱的未来googlers,在这里你得到的是:

假设音高: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;