opengl 先旋轉後平移和先平移後旋轉解惑

2021-10-14 17:06:54 字數 2326 閱讀 9286

我們知道,在opengl中,如果模型中點不在原點,先平移後旋轉會導致模型的位移發生變化。但在專案中遇到這麼乙個問題,如果不知道模型中點,或者知道模型中點一定不在原點,但我們也只需要模型方向,那麼我們直接將模型旋轉會得到我們想要的方向嗎?即如果先平移後旋轉能不能得到想要的方向?

這個地方我疑惑了很久,因為軸只有方向沒有位置,預設的旋轉會朝著原點計算,當時的想法是不能,想著可能整個模型會繞著原點旋轉,相當於位移了,而本身形狀不會變化,但結果顯然是錯的。

首先做了乙個demo,乙個中心在原點的正方形(灰色)先繞z軸旋轉30度,再沿x軸平移0.5個單位(紅色),另乙個正方形則相反(藍色):

glclear(gl_color_buffer_bit | gl_depth_buffer_bit);

//原圖

glmatrixmode(gl_modelview);

glloadidentity();

glbegin(gl_quads);

glcolor3f(0.5,0.0,0.0);

glvertex3f(-0.1,0.1,0.0);

glvertex3f(0.1,0.1,0.0);

glvertex3f(0.1,-0.1,0);

glvertex3f(-0.1,-0.1,0);

glend();

//先旋轉再平移

glmatrixmode(gl_modelview);

glloadidentity();

gltranslatef(0.5,0.0,0.0);

glrotatef(30.0,0.0,0.0,1.0);

glbegin(gl_quads);

glcolor3f(0.5,0.0,0.0);

glvertex3f(-0.1,0.1,0.0);

glvertex3f(0.1,0.1,0.0);

glvertex3f(0.1,-0.1,0);

glvertex3f(-0.1,-0.1,0);

glend();

//先平移再旋轉

glmatrixmode(gl_modelview);

glloadidentity();

glrotatef(30.0,0.0,0.0,1.0);

gltranslatef(0.5,0.0,0.0);

glbegin(gl_quads);

glcolor3f(0.0,0.0,0.5);

glvertex3f(-0.1,0.1,0.0);

glvertex3f(0.1,0.1,0.0);

glvertex3f(0.1,-0.1,0);

glvertex3f(-0.1,-0.1,0);

glend();

//座標軸

glmatrixmode(gl_modelview);

glloadidentity();

glbegin(gl_lines);

glcolor3f(1.0,1.0,1.0);

glvertex3f(0.0,1.0,0.0);

glvertex3f(0.0,-1.0,0.0);

glvertex3f(1.0,0.0,0.0);

glvertex3f(-1.0,0.0,0.0);

glend();

demo結果:

我們可以看到,兩種行為的正方形都成功繞著z軸旋轉了30度,僅是位移不同。

我們來看看為什麼?

在文章中講解了乙個原因,看著很有道理,但是他這個原理起點有點歧義,他是以矩陣乘法的先後順序來標定模型動作的先後,也就是說,在上面例子中,他認為是紅色圖形先做了平移,再做了旋轉。我查了一些資料,這種看法也有,但主流還是本文這麼認為,因為最先與頂點接觸的是右邊的矩陣:

好了,那如果先旋轉再平移,從數學上怎麼解釋這個現象呢?

我們設旋轉矩陣為r,位移為t,原位置為p,那麼先旋轉再平移,就可以表示為:res=r*p+t; 同理,先平移再旋轉結果表示式為:res=r*(p+t)=r*p+r*t;

從表示式可以看出:最終兩種結果模型本身都一樣地旋轉了r,但是先平移的結果位移也繞原點旋轉了r。也就是說,如果只考慮模型方向,兩種結果並沒有差別。

最後再做乙個筆記,也是以前理解的乙個錯誤(以前我認為四元數旋轉就直接以模型中點旋轉了),以此為鑑。旋轉有三種表達形式:旋轉矩陣,尤拉角和四元數,但這三種僅是在數學上表達不一樣,也有各自的優劣,但本質上還是一樣的,歸根到底,最終都轉換到了旋轉矩陣和頂點的乘法運算。

世界座標變換要先縮放 後旋轉 再平移的原因

乙個三維場景中的各個模型一般需要各自建模,再通過座標變換放到乙個統一的世界空間的指定位置上。這個過程在 3d 圖形學中稱作 世界變換 世界變換有三種,平移 旋轉和縮放 實際還有不常用的扭曲和映象,它們不是affine變換 這三種變換按各種順序執行,結果是不同的。可是實際的應用中一般按照 縮放 旋轉 ...

OpenGL與旋轉 縮放 平移

2018 05 09 旋轉看起來挺費勁的,其實非常簡單。我們只需要給shader傳入mvp矩陣即可。旋轉分為兩類 camera旋轉 物體旋轉。當指定mvp矩陣時,model矩陣是每個物體攜帶的資料,projection矩陣是由camera 的fov aspect near far距離決定的,對於ca...

SVG平移和旋轉

在svg中可以對所畫的形狀進行平移 translate 運動,下面是乙個平移的例子 在上面的例子中通過把矩形元素的transform屬性值設定為translate 75,25 使得原來的正方形 紅色 向右平移75畫素,向下平移25畫素,得到乙個新的正方形 藍色 在svg中也可以對所畫的形狀進行旋轉 ...