簡體   English   中英

使用OpenGL在C ++中同時圍繞(x,y&z)軸旋轉對象

[英]Roatating an Object around its (x,y&z) axis contemporaneously in C++ using OpenGL

我想編寫一個函數,使對象繞其軸同時旋轉,同時使每個角度繞其x,y和z軸傳遞; 在這里閱讀但我並不完全理解。 例如,要繞形狀軸旋轉,必須將哪些參數傳遞給glTranslatef(),以及如何創建與[0 1 0]相乘的矩陣(用於計算新的y軸)?

我不明白為什么當我多次調用glRotatef()時,只看到輸出中的第一個調用;為什么? 在代碼之前和之后,我測試了gltranslatef和glPushMatrix和glPopMatrix; 但是他們都沒有幫助我。 對我來說,了解此主題的解決方案非常重要。

這是我的代碼,但是不起作用!

glPushMatrix();
glRotatef(90,1,0,0); // rotate around X Axis
glPopMatrix();

glPushMatrix();
glRotatef(90,0,1,0); // rotate around Y Axis
glPopMatrix();

glPushMatrix();
glRotatef(90,0,0,1); // rotate around Z Axis
glPopMatrix();

如果您這樣做的話,請告訴我您的方式。

您上面的代碼實際上並沒有執行任何可見的操作,因為在更改當前活動的矩陣之后,您不會呈現任何內容。 以下代碼段的作用如下(假定當前堆棧為MODELVIEW ):

glPushMatrix();      // push the stack down one matrix and copy the current matrix
glRotatef(90,1,0,0); // multiply the current matrix M by a rotation matrix R -> M' = M * R

// usually you would render stuff here using the current model-view matrix

glPopMatrix();       // pop the top matrix off the stack

如您所見,通過將新矩陣推入堆棧,可以保留推入之前矩陣在頂部的內容。 然后,您可以以某種方式處理當前的頂部矩陣,進行渲染,然后彈出頂部矩陣以恢復先前的狀態。

我想您現在可以理解為什么上面的代碼絕對沒有做任何實質性的事情-除了會導致不必要的開銷。

如果您堅持使用舊版GL,那么使用矩陣堆棧在這里通常是正確的,因為您不希望所做的修改會影響隨后渲染的幾何圖形。 但是,您真正想要的是簡單的矩陣連接。 假設您要進行外在旋轉 ,即圍繞zyxworld-space的固定基礎旋轉,您需要執行以下操作:

glPushMatrix();
glRotatef(90,1,0,0);
glRotatef(90,0,1,0);
glRotatef(90,0,0,1);

// render camera

glPopMatrix();

以上在數學上等效於通過級聯各個旋轉R_zR_yR_x來計算旋轉矩陣RR' = R_x * R_y * R_z

我建議您也閱讀此書 ,以更好地了解自己在做什么以及輪換的潛在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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