660 likes | 1.05k Views
第 6 章 图形几何变换. 本章目标. 学习如何使图形运动 平移变换、旋转变换和放缩 学会复杂变换的分解与合成 学会使用 OpenGL 的几何变换函数. 主要内容. 数学基础 二维几何变换 齐次坐标 复合变换 其它变换 三维几何变换 图形对象的几何变换 OpenGL 的几何变换函数. 6.1 数学基础. 矢量( vector ) 连接两个点的有向线段。又称向量 行向量和列向量两种表示 矢量和. 6.1 数学基础. 矢量的数乘 矢量的点积 运算 性质. 6.1 数学基础. 矢量的长度 单位矢量 矢量间的夹角 矢量的叉积.
E N D
本章目标 • 学习如何使图形运动 • 平移变换、旋转变换和放缩 • 学会复杂变换的分解与合成 • 学会使用OpenGL的几何变换函数
主要内容 • 数学基础 • 二维几何变换 • 齐次坐标 • 复合变换 • 其它变换 • 三维几何变换 • 图形对象的几何变换 • OpenGL的几何变换函数
6.1 数学基础 • 矢量(vector) • 连接两个点的有向线段。又称向量 • 行向量和列向量两种表示 • 矢量和
6.1 数学基础 • 矢量的数乘 • 矢量的点积 • 运算 • 性质
6.1 数学基础 • 矢量的长度 • 单位矢量 • 矢量间的夹角 • 矢量的叉积 右手法则
6.1 数学基础 • 矩阵(Matrix) • m×n阶矩阵 • n阶方阵(m=n) • 单位矩阵 n阶方阵,对角线元素为1, 其它元素为0
6.1 数学基础 • 矩阵(续) • 行向量与列向量 • 当m=1时,A退化为行向量[a11, a12, …, a1n] • 当n=1时, A退化为列向量[a11, a21, …, am1]T • 矩阵的加法 • A=(aij)m×n,B=(bij) m×n • A与B的和记为A+B • 性质:结合律和交换律
6.1 数学基础 • 矩阵(续) • 矩阵的数乘 • 矩阵的乘法 • 性质:结合律和分配律(不满足交换律)
6.1 数学基础 • 矩阵(续) • 矩阵的转置 • 矩阵的逆 • n阶方阵A是可逆的,若存在另一个n阶方阵B,使得 AB=BA=In,称B是A的逆阵,记为B=A-1
6.2 二维几何变换 • 平移变换 (translation transformation) • 将点P(x, y)在x轴方向、y轴方向分别平移距离tx,ty,得到点P´(x׳, y׳),则 矩阵表示: 记为:T(tx , ty)
6.2 二维几何变换 • 旋转变换(rotation transformation) • 如 • 点P(x, y)的极坐标表示 (r为P 到原点的距离) • 绕坐标原点(称为参照点,基准点)旋转角度θ(逆时针为正,顺时针为负)
矩阵表示为: 记为:R(θ) 6.2 二维几何变换 • 旋转变换(续)
6.2 二维几何变换 • 放缩变换(scaling transformation) • 将点P(x, y)在x方向, y方向分别放缩 sx 和 sy 倍,得到点P´(x׳, y׳) • 以坐标原点为放缩参照(基准)点 • 不仅改变了物体的大小和形状,也改变了它离原点的距离 记为:S(sx, sy)
6.2 二维几何变换 利用矩阵计算变换后的坐标时,平移、旋转和放缩变换分别为: 运算不统一,如何统一运算?
6.3 齐次坐标 • 为什么需要齐次坐标? • 计算多次不同变换时,分别利用矩阵计算各变换导致计算量大 • 运算表示形式不统一 • 平移为“+” • 旋转和放缩为“·” • 统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象
6.3 齐次坐标 • 定义 • Homogeneous Coordinate • (x,y)点对应的齐次坐标定义为 • (x,y)点对应的齐次坐标为三维空间的一条直线 • 标准齐次坐标(x,y,1) • h=0表示无穷远点
6.3 齐次坐标 • 二维变换的矩阵表示 • 平移变换 • 旋转变换
6.3 齐次坐标 • 放缩变换 • 变换具有统一表示形式的优点 • 便于变换合成 连续变换时,可以先得到变换的矩阵 • 便于硬件实现
6.3 齐次坐标 • 变换的性质 • 平移和旋转变换具有可加性 • 放缩变换具有可乘性
6.3 齐次坐标 • 逆变换 • 逆平移变换:正平移距离tx,ty • 逆旋转变换:旋转角度为θ
6.3 齐次坐标 • 逆放缩变换:放缩系数为sx和sy
6.4 复合变换 • 变换合成 • 方法:连续变换时,先计算变换矩阵,再计算坐标 • 优点: (1)提高了对图形依次做多次变换的运算效率 如:图形上有n个顶点Pi,如果依次施加的变换为T,R,那么顶点Pi 变换后的坐标为 每个顶点需要2次矩阵相乘 只需要1次矩阵相乘
6.4 复合变换 • 变换合成 (续) (2)提供构造复杂变换的方法 对图形作较复杂的变换时,不直接去计算这个变换,而是将其先分解成多个基本变换,再合成总的变换 • 复合变换 • Composite transformation • 多个变换的组合 • 可通过单个变换矩阵来计算矩阵乘积
6.4.1 复合平移变换 • 连续平移变换 • 平移向量为(t1x,t1y)和(t2x,t2y) • 点P 经变换为P´,则有 • 复合矩阵
6.4.2 复合旋转变换 • 连续旋转 • P 经连续旋转角度分别为 1 和 2 后 • 连续旋转具有相加性
6.4.3 复合放缩变换 • 连续放缩 • 连续放缩因子分别为:(s1x, s1y) 和 (s2x, s2y)
6.4.4 二维基准点旋转 • 关于任意参照点 的旋转变换 • 步骤:(1)平移对象使参照(基准)点移到原点(2)绕坐标原点旋转(3)平移对象使基准点回到原始位置
6.4.5 二维基准点放缩 • 关于任意参照点 的放缩变换 • 步骤:(1)平移对象使基准点与坐标原点重合(2)放缩变换(3)反向平移使得基准点回到初始位置 4.3.2 扫描线算法
6.4.6 小结 • 变换合成时,矩阵相乘的顺序 • 单次变换:列向量表示点 • 复合变换:先作用的放在连乘的右端,后作用的放在连乘的左端 点表示成行向量呢?
6.5 其它变换 • 对称变换(反射变换、镜像变换:reflection) • 关于 x 轴的对称变换 • 关于 y 轴的对称变换
6.5 其它变换 • 关于任意轴的对称变换 • 平移(tx, ty)使l 过坐标原点,记为T1 • 旋转,记R1 • 对称, 记SYx • 旋转-,记 R2 • 平移(-tx, -ty), 记T2 总变换:T2•R2 • SYx•R1 •T1
6.5 其它变换 • 错切变换(shear) • 依赖轴:坐标保持不变的坐标轴,又称参考轴 • 方向轴:余下的坐标轴 1、以y轴为依赖轴的错切变换 (1)以 y = 0为参考轴(坐标保持不变) shx为沿x轴移动的距离
6.5 其它变换 (2)以 y = yref为参考轴 x׳ = x + shx ( y – yref) y׳ = y
6.5 其它变换 2、以x轴为依赖轴的错切变换
6.5 其它变换 • 仿射变换 • affine transformation • 二维线性变换的一般形式 • 平移,旋转,放缩,对称和错切是特例 • 特点:保持平行线间的平行关系
6.5 其它变换 • 例:证明二维复合变换的矩阵总能表示为: 证明:
6.6 三维几何变换 • 三维齐次坐标 • (x, y, z)点对应的齐次坐标为 • 标准齐次坐标(x, y, z, 1) • 右手坐标系 • 旋转方向 • 当拇指与坐标轴同向时, 四指所指方向为绕该轴的 正旋转方向
6.6 三维几何变换 • 平移变换 • 位移量:(tx,ty ,tz) • 放缩变换 • 参照点为坐标原点
y x z 6.6 三维几何变换 • 旋转变换 • 绕x轴 • 绕y轴
y x z 6.6 三维几何变换 • 绕z轴 • 错切变换 • 以z为依赖轴
6.6 三维几何变换 • 对称变换 • 关于坐标平面 xy 的对称变换 • 其它坐标平面类似
6.6 三维几何变换 • 三维几何变换的一般形式 (1)前三行和前三列对应旋转和放缩变换 (2)第四列的前三个元素对应平移变换 (3)第四行前三个元素对应投影变换
β α 6.6 三维几何变换 • 思考题:绕任意轴旋转 • 思路:将矢量 P1P2 变换后与坐标轴重合,再用基本旋转变换实现旋转,再逆变换到原位置 • 步骤: • 先平移,将 P1 平移到坐标原点 • 绕 y 和 z 轴旋转使矢量 P1P2 与 x 轴重和 • 。。。
6.7 图形对象的几何变换 • 图形对象 • 点,线段,多边形,圆,字符 • 方法 • 先生成点集,再对其中的点进行变换 • 运算量大 • 对参数变换 • 线段:两个端点 • 多边形:各顶点 • 圆:圆心和半径 • 前提 • 图形对象的几何表示是否发生变化?
6.8 OpenGL几何变换函数 • 说明 • 在核心库中,每种几何变换是一个独立的函数 • 所有变换都是在三维坐标系中定义 • 基本几何变换函数 • 平移函数:glTranslate{fd}(tx, ty, tz) • 对二维变换而言,取tz=0 • 旋转函数:glRotate{fd}(theta, vx, vy, vz) • 向量(vx, vy, vz)为通过坐标原点旋转轴 • theta为旋转角的度数 • 放缩函数:glScale{fd}(sx, sy, sz) • 相对坐标原点的缩放 • 当参数为负时,相对于平面反射变换
6.8 OpenGL几何变换函数 void display (void) { glColor3f (0.0, 0.0, 1.0); glRecti (20, 50, 100, 80); glColor3f (1.0, 0.0, 0.0); glTranslatef (-120.0, -40.0, 0.0); glRecti (20, 50, 100, 80); glLoadIdentity ( ); glColor3f (1.0, 0.0, 1.0); glRotatef (135.0, 0.0, 0.0, 1.0);glRecti (20, 50, 100, 80); glLoadIdentity ( ); glColor3f ( 0.0, 1.0,0.0); glScalef (0.5, -1.0, 1.0); glRecti (20, 50, 100, 80); glColor3f(0,0,0); glLoadIdentity ( ); glBegin(GL_LINES); glVertex2i(0,-Y/2+5); glVertex2i(0,Y/2-5); glVertex2i(X/2-5,0); glVertex2i(-X/2+5,0); glEnd(); glutSwapBuffers(); } 例程序 6-1 注意: 几何变换矩阵只有1个
6.8 OpenGL几何变换函数 #include <gl/glut.h> #include <stdlib.h> #include <math.h> int X=0,Y=0; void Reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-width/2, width/2, -height/2, height/2); glMatrixMode(GL_MODELVIEW);//定义模型观察变换矩阵 glLoadIdentity(); glClear (GL_COLOR_BUFFER_BIT); X=width, Y=height; } • 例6-1(续) void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 250.0, 0.0, 250.0); }
6.8 OpenGL几何变换函数 例6-1(续) int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (300, 300); glutCreateWindow ("Transformation"); init (); glutDisplayFunc(display); glutReshapeFunc(Reshape); glutMainLoop(); return 0; }
6.8 OpenGL几何变换函数 • 矩阵操作 • 模型观察矩阵:glMatrixMode(GL_MODELVIEW) • 建立当前观察矩阵 • 还有两种方式:纹理和颜色模式,默认为观察模式 • 设置当前矩阵为单位矩阵:glLoadIdentity() • 矩阵栈 • 4种:观察、投影、纹理和颜色 • 初始状态下,每栈仅包含一单位栈 • 压栈:glPushMatrix() • 出栈:glPopMatrix()