我正在製作一個OpenGL的第一人稱射擊遊戲,我試圖抵消創建一個物理剛體(使用子彈庫),以便剛體始終創建在相機看的地方,而不是總是在相機前面的設定點。在OpenGL中計算相機的正常?
顯然,做到這一點的一種方法是從視圖矩陣創建一個3x3旋轉矩陣或四捨五入矩陣,並將其乘以前向矢量以獲得指向相機外觀的法線。但是,我不確定如何獲取這些值(從視圖矩陣中的四元數,前向矢量是什麼,是否必須對乘法結果進行歸一化等)。我試過看教程,但我仍然不確定要獲取這些值。
我正在製作一個OpenGL的第一人稱射擊遊戲,我試圖抵消創建一個物理剛體(使用子彈庫),以便剛體始終創建在相機看的地方,而不是總是在相機前面的設定點。在OpenGL中計算相機的正常?
顯然,做到這一點的一種方法是從視圖矩陣創建一個3x3旋轉矩陣或四捨五入矩陣,並將其乘以前向矢量以獲得指向相機外觀的法線。但是,我不確定如何獲取這些值(從視圖矩陣中的四元數,前向矢量是什麼,是否必須對乘法結果進行歸一化等)。我試過看教程,但我仍然不確定要獲取這些值。
你其實很接近,cameraPos
應該是正確的。假設你有反向視圖矩陣,那麼相機的法向/方向就是相機位置之前的列。
這裏的一些僞GLSL狀代碼:
mat4 inv = inverse(view);
vec3 pos = vec3(inv[3]);
vec3 dir = -vec3(inv[2]);
凡view
是攝像機的視圖矩陣(mat4
)。
啊,我明白了,謝謝。那麼正常的「vec3 norm = dir * pos;」?如果是這樣,那麼你知道我將如何使用法線來抵消剛體的創建嗎?目前只是給出相機的位置(x,y,z),但我需要在相機前面始終創建剛體(無論它的方向如何),這就是我使用正常的原因。 –
如果通常情況下您指的是相機所面對的方向,那麼在這種情況下就是'dir'。所以如果你想創建一個偏移位置,你可以執行'new_pos = pos + dir * offset',其中偏移量的長度是'10'。然後''new_pos'將會在'dir'方向離開'pos' 10個單位。 – Vallentin
太棒了,你剛剛幫我解決了一個長期存在的問題。我嘗試使用vec3來抵消它,因爲我希望它被(0.3,0,2)抵消,但這是我可能弄清楚的。非常感激。 –
你應該爲你的相機存儲一個3x3矩陣,然後你想要的矢量就是第三列。這正是我所做的,因爲相機是場景的一部分,並且像場景中的任何其他物體一樣組成對象變換。 – Krum