Math 欧拉角到OpenGL方向向量?

Math 欧拉角到OpenGL方向向量?,math,opengl,vector,game-physics,euler-angles,Math,Opengl,Vector,Game Physics,Euler Angles,我目前正在一个Minecraft克隆中进行破片工作。为此,我希望使用摄影机的Euler角度来确定摄影机光线的方向向量 我有两个角度:俯仰和偏航。 俯仰沿X轴旋转,当玩家向下看时为正值,当玩家向上看时为负值。它不能大于90度(向下看),也不能小于-90度(向上看) 偏航沿Y轴旋转。它可以是负数,也可以是正数,这取决于玩家转向的次数和方向。例如,玩家产生(yaw=0)并立即逆时针旋转360度。在这种情况下,偏航=-360 如问题中所述,我使用的是OpenGL,因此当yaw=0时,播放器向下看负Z轴

我目前正在一个Minecraft克隆中进行破片工作。为此,我希望使用摄影机的Euler角度来确定摄影机光线的方向向量

我有两个角度:俯仰和偏航。 俯仰沿X轴旋转,当玩家向下看时为正值,当玩家向上看时为负值。它不能大于90度(向下看),也不能小于-90度(向上看)

偏航沿Y轴旋转。它可以是负数,也可以是正数,这取决于玩家转向的次数和方向。例如,玩家产生(
yaw=0
)并立即逆时针旋转360度。在这种情况下,
偏航=-360

如问题中所述,我使用的是OpenGL,因此当
yaw=0
时,播放器向下看负Z轴


如何仅使用具有上述限制的欧拉角生成方向矢量(必须是单位矢量)?

根据您对俯仰和偏航的描述,我假设您使用的是左手参考(俯仰=0,偏航=0给出了相机矢量(0.0,0.0,1.0)

“俯仰”参数在YZ平面中移动摄影机矢量:

Y = cos(pitchInRadians)
Z = sin(pitchInRadians)
偏航参数在XZ平面中移动摄影机矢量:

X = sin(yawInRadians)
Z = cos(yawInRadians)
将这两者结合起来,可以得到最终的相机矢量:

Cv = (sin(yaw), cos(pitch), sin(pitch)*cos(yaw))
正如你应该注意到的,角度是以弧度为单位的。因为你的帖子提到的角度是以度为单位的,所以你必须先将度角转换为弧度:

radians = (degrees * PI) /180

如果您在OpenGL中并拥有相机矩阵,则可以直接从中提取z轴方向向量…请参见…请记住相机矩阵在本机OpenGL符号中是反向的(
MVP=model*inverse(view)*projection
)因此,您需要分离非反转
视图
矩阵,并从中提取方向向量(或通过应用负角度和反向顺序的旋转/平移来构造非反转矩阵).无论如何,由于您最有可能选择屏幕中心位置的体素,我会改为使用:@Spektre由于我还没有找到解决方案,您能写出一个正确的答案吗?还有,您的意思是什么“您很可能希望选择屏幕中心位置的体素:,因为这似乎是我的主要问题?回答什么?1.从
MVP
MV*P
获取中心方向(在透视投影的情况下,投影也必须居中)(您是否有单独的
M,V,P
MV,P
MVP
…是否使用OpenGL本机符号?)我可以构造一个简单的C++/OpenGL示例,但是最好看看你如何设置矩阵,如果你不标准地变换变换方程/代码,那么我可以精确地模拟你的情况……2.使用光线拾取(前面评论中的链接答案)或多或少地覆盖了它,所以我认为创建另一个答案没有意义。只需将体素渲染到两个缓冲区(或两次渲染到同一个缓冲区)一次使用索引而不是颜色,然后使用颜色,只需在屏幕中心位置选择索引。请注意,这些天您不能使用模具作为其唯一的8位,因此请使用FBO或直接帧缓冲区…这样您可以直接获得命中体素索引,而不需要计算/光线投射光线和体素网格之间的交点。。。