计算机图形学-----齐次坐标、空间变换矩阵和通用的建模方法
齐次坐标系
齐次坐标系是为了区分空间点和向量的。三维空间中,(x,y,z)(x,y,z)(x,y,z)可以表示一个点ppp的位置,但是也可以表示一个向量v\bf{v}v。对于点的移动是有实际意义的,但是移动向量没有任何意义!点和向量在三维空间中的真正区别在于是否支持移动。
引入齐次坐标 (x,y,z,w)T(x,y,z,w)^T(x,y,z,w)T,w=1w=1w=1表示空间的点,w=0w=0w=0表示空间的向量。这样是为了后期矩阵变换的时候,统一运算规则,不用单独区分点或者向量。
空间变换矩阵
一般来说,在图形学中,使用矩阵的方式进行变换,可以把多个连续的操作压缩到一个中,减少计算量;同时利用矩阵的优化算法,可以提高计算效率。
位移矩阵:
Offset=[100Tx010Ty001Tz0001]\bf{Offset}= \begin{bmatrix} 1 & 0 & 0 & \bf{T_x} \\ 0 & 1 & 0 & \bf{T_y}\\ 0 & 0 & 1 & \bf{T_z} \\ 0 & 0 & 0 & 1 \end{bmatrix} Offset=⎣⎢⎢⎡100001000010TxTyTz1⎦⎥⎥⎤
Tx\bf{T_x}Tx、Ty\bf{T_y}Ty和Tz\bf{T_z}Tz分别表示沿着xxx、yyy和zzz轴的平移距离。根据矩阵的运算法则,如果是点的坐标,那么w=1w=1w=1正好线性累加上位移;如果是向量,w=0w=0w=0会抵消位移的效果。
绕xxx轴的旋转矩阵:
RotationX=[10000cosθ−sinθ00sinθcosθ00001]\bf{RotationX}= \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos{\theta} & -\sin{\theta} & 0\\ 0 & \sin{\theta} & \cos{\theta} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} RotationX=⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤
这是右手系的变换矩阵,θ\thetaθ是从xxx轴负向看向正向顺时针的旋转角度。
绕yyy轴的旋转矩阵:
RotationY=[cosθ0sinθ00100−sinθ0cosθ00001]\bf{RotationY}= \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} & 0 \\ 0 & 1 & 0 & 0\\ -\sin{\theta} & 0 & \cos{\theta} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} RotationY=⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤
这是右手系的变换矩阵,θ\thetaθ是从yyy轴负向看向正向顺时针的旋转角度。
绕zzz轴的旋转矩阵:
RotationY=[cosθ−sinθ00sinθcosθ0000000001]\bf{RotationY}= \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 & 0 \\ \sin{\theta} & \cos{\theta} & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} RotationY=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000000001⎦⎥⎥⎤
这是右手系的变换矩阵,θ\thetaθ是从zzz轴负向看向正向顺时针的旋转角度。
绕任意轴的旋转矩阵:
假设一个轴的向量R=(Rx,Ry,Rz)\bf{R}=(\bf{R_x}, \bf{R_y},R_z)R=(Rx,Ry,Rz),现在绕这个轴进行旋转,那么变换矩阵应该是:
RotationY=[cosθ+Rx2(1−cosθ)RxRy(1−cosθ−Rzsinθ)RxRz(1−cosθ+Rysinθ)0RyRx(1−cosθ+Rzsinθ)cosθ+Ry2(1−cosθ)RyRz(1−cosθ−Rxsinθ)0RzRx(1−cosθ−Rzsinθ)RzRy(1−cosθ+Rxsinθ)cosθ+Rz2(1−cosθ)10001]\bf{RotationY}= \begin{bmatrix} \cos{\theta}+R_{x}^2(1-\cos{\theta}) & R_xR_y(1-\cos{\theta}-R_z\sin{\theta}) & R_xR_z(1-\cos{\theta}+R_y\sin{\theta}) & 0 \\ R_yR_x(1-\cos{\theta}+R_z\sin{\theta}) & \cos{\theta}+R_{y}^2(1-\cos{\theta}) & R_yR_z(1-\cos{\theta}-R_x\sin{\theta}) & 0 \\ R_zR_x(1-\cos{\theta}-R_z\sin{\theta}) & R_zR_y(1-\cos{\theta}+R_x\sin{\theta}) & \cos{\theta}+R_{z}^2(1-\cos{\theta}) & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} RotationY=⎣⎢⎢⎡cosθ+Rx2(1−cosθ)RyRx(1−cosθ+Rzsinθ)RzRx(1−cosθ−Rzsinθ)0RxRy(1−cosθ−Rzsinθ)cosθ+Ry2(1−cosθ)RzRy(1−cosθ+Rxsinθ)0RxRz(1−cosθ+Rysinθ)RyRz(1−cosθ−Rxsinθ)cosθ+Rz2(1−cosθ)00011⎦⎥⎥⎤
一般的建模方法
矩阵乘法是不可逆的,因此不能直接随便交换变换的顺序。先旋转再平移和先平移再旋转的效果是不同的;同样的,绕不同的轴旋转的次序不同,得到的结果可能也是不同的。一般来说,应该先执行局部的旋转,再执行局部坐标系的平移。
建模时,应该以物体为参考中心,选定一个物体的局部坐标中心localCenter\bf{localCenter}localCenter,使用齐次坐标系表示,然后再给出物体各个定点在局部坐标系中的位置,局部坐标累计上局部旋转在累计上局部中心的坐标,即可生成全局的坐标。
注意,一定是先进行局部坐标系的旋转,再执行平移;否则结果错误。还有,这里使用的列向量的机制,矩阵乘法是从右向左结合的,那么变换矩阵是:
worldPos=Offset∗Rotation∗localPos\bf{worldPos}=\bf{Offset}*Rotation*localPos worldPos=Offset∗Rotation∗localPos
Github示例代码,纯C++实现的渲染管线:
https://github.com/StudentErick/PipeLine
计算机图形学-----齐次坐标、空间变换矩阵和通用的建模方法相关推荐
- 计算机图形学与相关学科的关系,哈尔滨工业2015博士招生计算机图形学与人机交互设计大纲...
哈尔滨工业大学2015博士招生计算机图形学与人机交互设计考试大纲及参考书目 考博复习第一手复习资料及最权威的复习参考书目就是研究生院公布的考博科目考试大纲.参考书目,新东方在线整理了哈尔滨工业大学20 ...
- 计算机图形学学习报告,计算机图形学学习报告.doc
计算机图形学学习报告 篇一:计算机图形学学习心得体会 计算机图形学学习心得体会 计算机科学与技术与技术 班 学号: 1.计算机图形学 计算机图形学(Computer Graphics,简称CG),狭义 ...
- 数学系列:数学在计算机图形学中的应用
宇宙的琴弦 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60 文章 - 0 评论 - 0 数学系列:数学在计算机图形学中的应用 Copyright © 1900-2016, NORYES ...
- 数学在计算机图形学中的应用
数学在计算机图形学中的应用 刘利刚 中国科技大学 "学习计算机图形学需要多少的数学?"这是初学者最经常问的问题. 狭义的计算机图形学指的是传统的三维建模,绘制,动画等,而广义的计算 ...
- c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...
- 第三章 计算机图形处理,计算机图形学第三章-1(Basic).ppt
<计算机图形学第三章-1(Basic).ppt>由会员分享,可在线阅读,更多相关<计算机图形学第三章-1(Basic).ppt(28页珍藏版)>请在人人文库网上搜索. 1.清华 ...
- 计算机图形学——是什么?为什么?怎么做?
目录 一. 计算机图形学的应用领域 1.1 计算机游戏(Computer Game) 1.2 计算机辅助设计(CAD/CAM) 1.3 计算机艺术(CA) 1.4 分形艺术 1.5 虚拟现实(VR) ...
- 1、计算机图形学——2D变换与齐次坐标
一.2D变换 1.缩放变换 缩放变换就是将图形上的点的各个维度同时放大或者缩小,比如,讲一个图片的长宽都缩小0.5倍 则缩小之后,新的图片上的点(x', y')可以表示为 用写成矩阵的形式就是 如果长 ...
- 计算机图形学 变换矩阵
为了完成我的 计算机图形学作业,有一道变换矩阵的问题,翻了好久,发现这篇博客讲的很清楚,感谢大佬的分享. 以下内容转自:http://m.blog.csdn.net/csxiaoshui/articl ...
最新文章
- 转 --有些事情需要注意
- ARCGIS10.1 插值分析结果按指定多边形输出
- 条件语句练习-比分预测
- 序列化的高阶认识-serialVersionUID的作用
- python 多条件判断 生成新列_pandas DataFrame 根据多列的值做判断,生成新的列值
- 2015-03-19 header note update in my Appointment
- 反沙箱——SetErrorMode
- 速度最快250fps!实时、高性能车道线检测算法LaneATT
- 一文带你熟知ForkJoin
- html 图片加速,35种加速网站访问的最好做法
- MySQL 8.0来了,逆之者亡...
- 辨异 —— 数学基本概念
- 工业大数据的发展面临哪四大挑战
- 01 Django简介
- ArcGIS的基本使用
- switch语句里面使用break,return
- win10如何同时安装并使用多个版本的jdk
- matlab如何求有约束最优化最大值,6.4.2有约束最优化问题的求解-东北大学数学系.ppt...
- Reptile_02 json网页爬虫QQ华晨宇音乐
- 因为专注所以成功 agile新版北京发布
热门文章
- 晶振两端的谐振电容有特殊要求吗_“吃瓜群众”也能秒懂的晶振电路原理
- 攻防世界 php2,CTF-攻防世界-PHP2
- EDLines: A real-time line segment detector with a false detection control
- King Moves 水题
- AcWing479.加分二叉树(区间DP)题解
- 目标检测——如何获取图片的唯一ID
- Numpy——常用的排序函数
- remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication failed
- [转]TensorFlow---岂止深度学习
- leetcode719:直线上的第k近点对