应用多个转换来查看
Apply multiple transformations to view
我正在使用 C++ 开发 OpenGL ES 应用程序。我 运行 iOS 上的代码带有一些包装器 Obj-c 类 使我能够使用手势(如平移、捏合、旋转)。
我使用正交投影。该代码目前只绘制一个简单的四边形,我希望能够使用用户手势对其应用任何转换。这意味着移动它、放大和缩小、旋转(一些其他派生的手势,例如使用双击缩放等)。
我想如果我简单地存储原点、比例和角度浮点数并使用它们中的每一个构造矩阵,然后相乘就可以了。这适用于简单的平移和缩放,但是,我不能围绕任何点旋转。现在我不知道我需要什么才能绕着某个点旋转、平移、绕着不同的点旋转更多。
这是我如何初始化矩阵的示例
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);
}
如何使用矩阵对 OpenGL(ES) 中的 2D 视图应用任意数量的变换?这些变换是由手势(平移、捏合、旋转)引起的。对于捏和旋转,我知道屏幕坐标中的数量和中心点。
绕任意点的旋转是通过将点平移到原点,绕原点旋转然后平移回来完成的。
我相信你的问题归结为找出你定义变换的参考系。
实际上,您可以将任何变换(即 3D 中的平移和旋转)指定为 4x4 矩阵,就像您在示例中所做的那样。如果它们是根据对象的当前姿势定义的,那么您可以通过在右侧乘以新矩阵来应用一个新的。如果它们是相对于固定参考系指定的(例如,您的屏幕原点不会移动),那么您可以预乘它们。
假设您应用了两个旋转,由 T_rot_1 和 T_rot_2
定义
如果转换是根据附加到对象的参考框架定义的:
T_final_wrt_fixed = T_rot_1_wrt_obj * T_rot_2_wrt_obj
如果根据固定框架定义变换:
T_final_wrt_fixed = T_rot_2_wrt_fixed * T_rot_1_wrt_fixed
有关详细信息,请查看 these slides。
我正在使用 C++ 开发 OpenGL ES 应用程序。我 运行 iOS 上的代码带有一些包装器 Obj-c 类 使我能够使用手势(如平移、捏合、旋转)。
我使用正交投影。该代码目前只绘制一个简单的四边形,我希望能够使用用户手势对其应用任何转换。这意味着移动它、放大和缩小、旋转(一些其他派生的手势,例如使用双击缩放等)。
我想如果我简单地存储原点、比例和角度浮点数并使用它们中的每一个构造矩阵,然后相乘就可以了。这适用于简单的平移和缩放,但是,我不能围绕任何点旋转。现在我不知道我需要什么才能绕着某个点旋转、平移、绕着不同的点旋转更多。
这是我如何初始化矩阵的示例
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);
}
如何使用矩阵对 OpenGL(ES) 中的 2D 视图应用任意数量的变换?这些变换是由手势(平移、捏合、旋转)引起的。对于捏和旋转,我知道屏幕坐标中的数量和中心点。
绕任意点的旋转是通过将点平移到原点,绕原点旋转然后平移回来完成的。
我相信你的问题归结为找出你定义变换的参考系。
实际上,您可以将任何变换(即 3D 中的平移和旋转)指定为 4x4 矩阵,就像您在示例中所做的那样。如果它们是根据对象的当前姿势定义的,那么您可以通过在右侧乘以新矩阵来应用一个新的。如果它们是相对于固定参考系指定的(例如,您的屏幕原点不会移动),那么您可以预乘它们。
假设您应用了两个旋转,由 T_rot_1 和 T_rot_2
定义如果转换是根据附加到对象的参考框架定义的:
T_final_wrt_fixed = T_rot_1_wrt_obj * T_rot_2_wrt_obj
如果根据固定框架定义变换:
T_final_wrt_fixed = T_rot_2_wrt_fixed * T_rot_1_wrt_fixed
有关详细信息,请查看 these slides。