2016-10-01 40 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