2017-03-25 35 views
0

我正在制作一个OpenGL的第一人称射击游戏,我试图抵消创建一个物理刚体(使用子弹库),以便刚体始终创建在相机看的地方,而不是总是在相机前面的设定点。在OpenGL中计算相机的正常?

显然,做到这一点的一种方法是从视图矩阵创建一个3x3旋转矩阵或四舍五入矩阵,并将其乘以前向矢量以获得指向相机外观的法线。但是,我不确定如何获取这些值(从视图矩阵中的四元数,前向矢量是什么,是否必须对乘法结果进行归一化等)。我试过看教程,但我仍然不确定要获取这些值。

+0

你应该为你的相机存储一个3x3矩阵,然后你想要的矢量就是第三列。这正是我所做的,因为相机是场景的一部分,并且像场景中的任何其他物体一样组成对象变换。 – Krum

回答

1

你其实很接近,cameraPos应该是正确的。假设你有反向视图矩阵,那么相机的法向/方向就是相机位置之前的列。

这里的一些伪GLSL状代码:

mat4 inv = inverse(view); 

vec3 pos = vec3(inv[3]); 
vec3 dir = -vec3(inv[2]); 

view是摄像机的视图矩阵(mat4)。

+0

啊,我明白了,谢谢。那么正常的“vec3 norm = dir * pos;”?如果是这样,那么你知道我将如何使用法线来抵消刚体的创建吗?目前只是给出相机的位置(x,y,z),但我需要在相机前面始终创建刚体(无论它的方向如何),这就是我使用正常的原因。 –

+0

如果通常情况下您指的是相机所面对的方向,那么在这种情况下就是'dir'。所以如果你想创建一个偏移位置,你可以执行'new_pos = pos + dir * offset',其中偏移量的长度是'10'。然后''new_pos'将会在'dir'方向离开'pos' 10个单位。 – Vallentin

+1

太棒了,你刚刚帮我解决了一个长期存在的问题。我尝试使用vec3来抵消它,因为我希望它被(0.3,0,2)抵消,但这是我可能弄清楚的。非常感激。 –