我有一个应用于位置的方向向量给了我相机应该看的点。为了正确使用glRotatef,我如何从偏航,俯仰和滚动中获得?
提前致谢
答案 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)
假设音高: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;