[英]Moving a shape / object in modern opengl
我正在研究用C ++ / SFML / OpenGL開發Breakout游戲。 這是我第一次涉足現代opengl。
我的問題是我不知道如何使槳運動(或與此相關的球)。 現在,我平移整個視圖,使相機移動,但形狀保持在原始位置。 我一直在關注某些在線教程(主要是Arcsysnthesis和open.gl),但是我只是不了解某些內容,因此我想知道是否可以得到反饋。 我知道我需要平移槳葉的位置,目前我正在使用MVP矩陣設置。
在我的頂點着色器中
gl_Position = MVP * vec4(position, 1.0);
其中MVP是統一的mat4變量。 我使用glm :: perspective和glm :: lookAt函數來生成MVP的P * V部分。 最后,當我在update()函數中收集鍵盤輸入時,我使用glm :: translate並生成一個Model。 我知道乘法順序必須是P * V * M(根據我在閱讀教程中收集的信息),並且我使用結果來修改頂點着色器中的均勻變量。 結果是屏幕/攝像機平移位置,但是形狀顯然不會移動。 我想我理解為什么會這樣,但是我無法弄清楚如何僅轉換形狀並從根本上控制形狀的移動。
編輯-下面的評論是正確的-我所需要的全部都是更改我的更新/渲染順序,因為我在所有形狀上都使用了相同的變換!
在您的C ++代碼中,您可能有一個槳類,其中應包含以下內容:
在調用update方法之前,您可以使用glm :: lookAt或類似的東西從相機生成View矩陣。 然后,您調用球拍的更新方法並根據您的游戲邏輯更改位置。 渲染球拍時,您必須使用制服將視圖/模型視圖矩陣上載到着色器。 在設置制服之前,您可以使用以下數學方法更改模型視圖矩陣並轉換對象:
glm::mat4 mvp = glm::translate(orgModelView, glm::vec3(x,y,z));
這將轉換所有應用此模型視圖矩陣的對象。
這背后的數學原理是:
TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;
以下是一個Modelview矩陣
[ R T ]
0 0 0 1
R是旋轉矩陣,T是平移矢量。 如果您不想旋轉對象,則R為標識,如果您不希望平移該對象,則T為(0,0,0)
將其應用於對象的所有頂點,即可旋轉和平移對象(注意矩陣乘法的順序很重要)。
如果要移到不同的對象,例如第一個在右邊,第二個在左邊,則需要兩個不同的Modelview矩陣。
在我的着色器中,我這樣做是這樣的:
in vec3 pos;
uniform mat4 modelview;
uniform mat4 projection;
void main(){
gl_Position = projection * modelview * vec4(pos,1.0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.