首页
TVP 最新优惠活动
学习
活动
专区
工具
返回腾讯云官网
3D空间中的一个点的坐标,可以用(x,y,z)来表示。
对这个点的坐标变换有三种操作:缩放、平移、旋转。 缩放之后,点的坐标变为(Sx*x,Sy*y,Sz*z)
;平移之后,点的坐标变为(Tx+x,Ty+y,Tz+z)
;旋转会比较麻烦一点,在后边的详细内容中描述。
上面的操作其实可以用矩阵运算来简单的表示,但是用矩阵表示变换的时候会有一个问题:用一个矩阵可以同时表示点的缩放、旋转,但是没办法表示平移了。 此时需要引入一个齐次坐标的表示方法,将点的(x,y,z)
坐标表示为(x,y,z,1)
。
点在x、y、z轴的缩放分别为Sx、Sy、Sz,那么缩放可以用下面的矩阵来表示:
Sx | 0 | 0 | 0 |
---|---|---|---|
0 | Sy | 0 | 0 |
0 | 0 | Sz | 0 |
0 | 0 | 0 | 1 |
(x,y,z,1) * S = (Sx*x,Sy*y,Sz*z,1)
首先看一下点绕着x、y、z三个坐标轴旋转一定角度时,坐标的表示方法:
用矩阵来表示:
那么当点(x,y,z)绕x、y、z轴分别旋转Rx、Ry、Rz角度时,旋转矩阵R=RxRyRz,得到矩阵如下:
cos(Rx)*cos(Rz) | cos(x)*sin(z) | -sin(y) | 0 |
---|---|---|---|
sin(x)sin(y)cos(z)-cos(x)*sin(z) | sin(x)sin(y)sin(z)+cos(x)*cos(z) | sin(x)*cos(y) | 0 |
cos(x)sin(y)cos(z)+sin(x)*sin(z) | cos(x)sin(y)sin(z)-sin(x)*cos(z) | cos(x)*cos(y) | 0 |
0 | 0 | 0 | 1 |
点在x、y、z轴的平移分别为Tx、Ty、Tz,那么缩放可以用下面的矩阵来表示:
1 | 0 | 0 | 0 |
---|---|---|---|
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
Tx | Ty | Tz | 1 |
(x,y,z,1) * T = (Tx+x,Ty+y,Tz+z,1)
综合上边的三个矩阵,可以得到最终的变换矩阵: M=S*R*T
Sxcos(Rx)cos(Rz) | Sxcos(Rx)sin(Rz) | -Sx*sin(Ry) | 0 |
---|---|---|---|
Sy(sin(Rx)sin(Ry)cos(Rz)-cos(Rx)sin(Rz)) | Sy(sin(Rx)sin(Ry)sin(z)+cos(Rx)cos(Rz)) | Sysin(Rx)cos(Ry) | 0 |
Sz(cos(Rx)sin(Ry)cos(Rz)+sin(Rx)sin(Rz)) | Sz(cos(Rx)sin(Ry)sin(Rz)-sin(Rx)cos(Rz)) | Szcos(Rx)cos(Ry) | 0 |
Tx | Ty | Tz | 1 |
简写为
m00 | m01 | m02 | 0 |
---|---|---|---|
m10 | m11 | m12 | 0 |
m20 | m21 | m22 | 0 |
Tx | Ty | Tz | 1 |
不同的编译器在内存管理方式上的不同,会导致有的情况下使用行优先的写法较好,有的情况下使用列优先的写法较好。我这边实践的过程中接触的是列优先的写法:
m00 | m10 | m20 | Tx |
---|---|---|---|
m01 | m11 | m21 | Ty |
m02 | m12 | m22 | Tz |
0 | 0 | 0 | 1 |
得到这样一个矩阵之后,围绕x、y、z三个轴所做的选择、缩放、平移操作,所影响的矩阵中的位置就一目了然了
假如我们得到了一个右手坐标系下的变换矩阵,需要把它转换为左手坐标系下的变换矩阵,那么可以将其绕一个平面翻转,假设选择绕xoy平面翻转。
分析一下翻转之后的结果:Tz变为-Tz;Rx变为-Rx;Ry变为-Ry;其他不变。
正弦和余弦函数的曲线:
将这些变化代入上面得到的最终版变换矩阵,可以得到
m02 = -m02; m12 = - m12; m20 = -m20; m21 = -m21; Tz = -Tz
将变换矩阵中这些位置的值都乘以-1,即可得到绕xoy平面翻转之后的左手系变化矩阵。
m00 | m10 | -m20 | Tx |
---|---|---|---|
m01 | m11 | -m21 | Ty |
-m02 | -m12 | m22 | -Tz |
0 | 0 | 0 | 1 |
也可以换一种思路,当用右手系变换矩阵变换完成之后,将坐标沿着xoy平面做个翻转,这个翻转可以用一个缩放矩阵来表示:
1 | 0 | 0 | 0 |
---|---|---|---|
0 | 1 | 0 | 0 |
0 | 0 | -1 | 0 |
0 | 0 | 0 | 1 |
M*S 得到新的矩阵,转换为列优先的写法:
m00 | m10 | -m20 | Tx |
---|---|---|---|
m01 | m11 | -m21 | Ty |
m02 | m12 | -m22 | Tz |
0 | 0 | 0 | 1 |
也就是说,把第三列都乘以-1就可以了
上面两种思路可以得到等价的坐标系转换结果。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
哆哆女性网花好月圆下一句接什么小花仙大电影奇迹少女缅因猫起名处女座女生亚冠决赛肆无忌惮的意思给小机器人起个名字win7sp2打印机共享软件14岁男孩网吧刺死父亲免费按生辰八字起名测分行尸走肉第5季每况愈下的意思9月28日是什么星座方姓鼠宝宝起名2020小孩起什么名字姓贾的女孩子起名起霸气名字人人贷理财可靠吗明星宝宝起名字公众号起什么名字比较好色八戒《雷霆战将》舞蹈培训的起名猪宝宝取名起名大全宜用睿字怎么起名璀璨人生小说免费阅读为书店起个名字姓名起源郭氏男孩起名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”