【DirectX 11学习笔记】世界矩阵的理解-运动合成
最近在看龙书,写一下自己的学习理解,主要是物体运动的合成。
物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵A,并通过世界矩阵变换到唯一的世界坐标系。
物体在某时刻发生了位移和旋转,以小车运动举个例子,车在 dt 时间内沿着朝向 r 产生了位移 s ,并改变了朝向,旋转了 θ 度。
这里有两种方式合成物体的最终状态:
(1)先位移 r ,在终点位置上,旋转 θ 角度,故当前时刻渲染的图像 Ar = T * R,其中T是位移矩阵,R是在终点位置的绕轴旋转矩阵。
考虑时间上的累积,Ar = A * (T1*R1)*(T2*R2)*...*(Tk*Rk)*...*(Tn*Rn),其中 k = 1, 2, ..., n 表示每个时间片,Rk是在当前位置上的绕Y轴的旋转矩阵(转向嘛,我们认为极短的时间内上一时刻的转向后的方向就是下一时刻位移的方向)。
(2)先绕原点旋转 θ 角度,再位移到目标位置处,故当前时刻渲染的图像 Ar = R' * T,其中T是位移矩阵,R'是在局部坐标系内的旋转矩阵,也就是绕原点。
考虑时间上的累积,Ar = A * (R1*R2*...*Rk*...*Rn)*(T1*T2*...Tk*...*Tn),其中 k = 1, 2, ..., n 表示每个时间片,Rk是在原点绕Y轴的旋转矩阵。
* 解释一下为什么是绕原点旋转:
(1)A是在局部坐标系内构建的,一旦构建之后,位置关系就确定了(刚体),推入到GPU显存中的顶点坐标就确定了,在显存中自始至终都没有变过;
(2)在没有进行任何旋转和位移操作时,局部坐标系实际是和世界坐标系是重合的,此时的A在局部坐标系内的位置,其实也是在世界坐标系内的位置,A*W之后,物体发生了运动,也就是局部坐标系相对相对世界坐标系发生了运动(缩放、旋转、位移);
(3)物体的最终状态都可以认为是初始状态A经过一系列时间上的累积变化而形成的,物体最终的缩放、旋转、位移状态,都可以是在原点(也就是位移没有发生)发生缩放和旋转,再移动到相应的位置(产生位移)。这和先产生位移,在位移后的位置上再缩放和旋转是一样的。
由于DirectXMath库中提供的XMMatrixRotation系列函数所绕轴均为过原点的轴,但是(1)过程需要过当前位置处的轴,第一种方式在构建旋转矩阵并不容易。
第二种方式,令R = R1*R2*...*Rk*...*Rn,T = T1*T2*...Tk*...*Tn,W = R * T,则有 Ar = A * W,形式上更简单,实现也更简单。只需要计算当前时刻上要发生的旋转和位移,并将初始至当前时刻上的旋转、位移累积:R *= Rk,T *= Tk,就可以得到当前时刻的世界矩阵。
【DirectX 11学习笔记】世界矩阵的理解-运动合成的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照 代码工程地址: https://github.com/j ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...
随机推荐
- yum源本地部署完后网络部署报错
错误信息 已加载插件:fastestmirror Determining fastest mirrors * base: mirrors.aliyun.com * extras: mirrors.al ...
- BBuBBBlesort!
题目描述 Snuke got an integer sequence of length N from his mother, as a birthday present. The i-th (1≦i ...
- LTE-U/LAA
将LTE扩展至非授权频谱,得益于一个稳健的无线电通信线路,具有更好协调性的同步节点,以及以授权频谱为基点的载波聚合,LTE-U/LAA能提供比载波Wi-Fi更佳的网络性能和更强的用户体验,为移动运营商 ...
- Linux SSH 允许root用户远程登录和无密码登录
1. 允许root用户远程登录 修改ssh服务配置文件 sudo vi /etc/ssh/sshd_config调整PermitRootLogin参数值为yes,如下图: 2. 允许无密码登录同上,修 ...
- 78)PHP,编写session存储机制(将数据写进数据库)的代码整理(未实验)
<?php function userSessionBegin() { echo '<br>Begin<br>'; //初始化数据库服务器连接,这个函数是最先执行,所以, ...
- ES6下的Function.bind方法
在JavaScript的使用中,this的指向问题始终是一个难点.不同的调用方式,会使this指向不同的对象.而使用call,apply,bind等方式,可改变this的指向,完成一些令人惊叹的黑魔法 ...
- Data Binding on Android
Data Binbing框架是在2015年Google I/O大会上最早提出来的,一直在Android开发者中热议,但是很少有真正在项目中用到.本文简单介绍Data Binding框架的简单用法以及其 ...
- STM32 CAN 发送和接收 寄存器变化过程
发送:
- 跨域带cookie失效的解决方案
在webpack的tableproxy那儿配置完跨域以后,想给cookie添加domain以便请求的时候带上cookie domain为localhost,cookie不会失效,但是一但改成baidu ...
- Luogu1681_ 最大正方形II
题目背景 忙完了学校的事,v神终于可以做他的"正事":陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上有有一行小 ...