如何从手动矩阵运算中推断平移、剪切等
How to infer translate, shear, etc from manual matrix operations?
本文关键字:运算 更新时间:2023-10-16
在阅读UCMerced的TriPath Toolkit中的一些代码时,我遇到了这些
float xmin, xmax, ymin, ymax;
float mat[16] = { 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1 };
TheLct->get_bounds ( xmin, xmax, ymin, ymax );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ();
float width = xmax-xmin;
float height = ymax-ymin;
mat[0]=mat[5]=mat[10]= 1.8f * (1 / (width > height ? width : height));
glMultMatrixf ( mat );
mat[0]=mat[5]=mat[10]= 1;
mat[12]=-(xmin+w/2);
mat[13]=-(ymin+h/2);
glMultMatrixf ( mat );
在第一个变换中,矩阵中的前三个对角线1
乘以一个因子。根据我对单位矩阵的有限了解,这似乎是按一个因子缩放的。
然而,我并不真正理解第二个转变:
mat[12]=-(xmin+w/2);
mat[13]=-(ymin+h/2);
glMultMatrixf ( mat );
首先,我甚至不知道在这样的矩阵中改变索引12
和13
意味着什么。我正试图通过阅读关于转换的维基百科页面来弄清楚这一点,但我想我没有足够的数学相关领域知识来理解它
尽管我能找到的OpenGL资源似乎并没有以这种方式修改矩阵,但它们使用了glScaleF
之类的函数。
如何将上述手动矩阵转换与缩放、剪切、平移和旋转关联起来?
正如您正确猜测的那样,第一个矩阵是一个统一比例矩阵。第二个矩阵只是一个平移(沿着x和y轴)。注意(的固定函数矩阵堆栈)GL使用列主内存布局,其中转换部分始终位于m[12]
、m[13]
、m[14]
中(另请参阅旧GL FAQ中的答案9.005)。组合变换不是透视投影(需要(m[3], m[7], m[11])
不是零向量),而是正交变换。
为了简单地解释如何对所有这些数字进行几何解释,您可能会发现这篇文章很有用。
最后一个是透视投影。看见http://en.wikipedia.org/wiki/Transformation_matrix
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- GCC本机矩阵运算库
- 位阵列上的快速AND运算
- 字符串中int的加法运算
- 算术运算的结果类似于:C浮点变量中的1/3
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 如何在 vtk Poly 数据上进行布尔运算?
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 避免指针运算,修复叮当整齐错误
- 使用双精度的浮点运算
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 更快的C++算术运算
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 两个字符串之间的数学运算
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 何时使用按位运算而不是算术替代方法?
- Arduino 上数学运算的计时速度 - 异常
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度