簡體   English   中英

在現代的OpenGL中移動形狀/對象

[英]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 ++代碼中,您可能有一個槳類,其中應包含以下內容:

  • 3個浮點的位置向量
  • 更新方法
  • 渲染方法

在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM