2016-10-01 53 views
0

我正在使用C++的OpenGL ES應用程序。我使用幾個包裝Obj-c類在iOS上運行代碼,使我能夠使用手勢(如平移,捏合,旋轉)。應用多個轉換來查看

我使用正射投影。該代碼現在只繪製了一個簡單的四邊形,我希望能夠使用用戶手勢對其應用任何轉換。這意味着移動它,放大和縮小,旋轉(一些其他派生的手勢,如使用雙擊等縮放)。

我認爲這將是好的,如果我只是存儲起源,規模和角度浮動和構造矩陣使用其中的每一個,然後乘。這適用於簡單的翻譯和縮放,但是,我無法圍繞任何一點旋轉。現在我無法弄清楚我需要什麼才能圍繞某個點旋轉,翻譯,圍繞不同點旋轉更多。

下面是例子,我如何初始化我的矩陣

Mat4 Mat4::translation(float tx, float ty) 
{ 
    float a[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1 }; 
    return Mat4(a); 
} 

Mat4 Mat4::rotation(float angle) 
{ 
    float a[16] = { cosf(angle), sinf(angle), 0, 0, -sinf(angle), cosf(angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; 
    return Mat4(a); 
} 

如何申請任意數量轉換爲2D視圖在OpenGL(ES),使用矩陣?這些轉換是由手勢(平移,捏,旋轉)引起的。對於捏和旋轉,我知道屏幕座標中的數量和中心點。

回答

0

我相信你的問題歸結爲找出你定義你的轉換的參考框架。

實際上,您可以將任何轉換(即3D中的平移和旋轉)指定爲4x4矩陣,就像您在示例中所做的那樣。如果它們是根據對象的當前姿態進行定義的,則可以通過將新矩陣與右側相乘來應用新的對象。如果它們是針對固定參考框架(例如,您的屏幕原點不移動)進行指定的,則您將它們預先相乘。

說您應用兩次旋轉,通過T_rot_1和T_rot_2

定義。如果轉換被定義WRT參考幀附加到對象:

T_final_wrt_fixed = T_rot_1_wrt_obj * T_rot_2_wrt_obj 

如果轉換被定義WRT參考固定幀:

T_final_wrt_fixed = T_rot_2_wrt_fixed * T_rot_1_wrt_fixed 

欲瞭解更多信息,請查看these slides

0

圍繞任意點的旋轉是通過將點轉換爲原點,圍繞原點旋轉然後平移回來完成的。

+0

感謝您的回答。我已經知道這一點,但如果我以後需要再做這件事,該怎麼辦?我應該把這個操作的結果保存在一個矩陣中,然後再乘以另一個旋轉?我不知道這是否會起作用。 – davidv