最近在看龙书,写一下自己的学习理解,主要是物体运动的合成。

物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵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学习笔记】世界矩阵的理解-运动合成的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照 代码工程地址: https://github.com/j ...

  4. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...

随机推荐

  1. [LC] 452. Minimum Number of Arrows to Burst Balloons

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  2. Codeforces Round#615 Div.3 解题报告

    前置扯淡 真是神了,我半个小时切前三题(虽然还是很菜) 然后就开始看\(D\),不会: 接着看\(E\),\(dp\)看了半天,交了三次还不行 然后看\(F\):一眼\(LCA\)瞎搞,然后\(15m ...

  3. Uber退出东南亚留下烂摊子,给“中国式并购”带来哪些启示

    当下,从全球范围内来看很多互联网企业都采用了"复制+粘贴"的疯狂推进模式.它们往往在某一个国家或地区取得领先优势后,就快速将相同模式在全球推进去占领当地市场.无论结果是一家独大占据 ...

  4. linux 新添加的硬盘格式化并挂载到目录下方法

    需求: 新增加一块硬盘sdb,将sdb分区,只分一个区,格式化,挂载到目录/ssd下.原文:https://www.cnblogs.com/ddbear/p/7009736.html 1.  查看现在 ...

  5. 一:MYsql登录,服务开启和停止

    字段的属性: 1:名称 2:数据类型 3:长度 4:约束 SQL的分类:(结构化查询语言) 1:数据查询语言DQL    select 2:数据操纵语言DML    insert  delete  u ...

  6. Pulsar、ZooKeeper、BookKeeper 作用简述

    Pulsar:采取了存储计算分离的技术ZooKeeper 集群的作用和在 Kafka 中是一样的,都是被用来存储元数据.BookKeeper 集群则被用来存储消息数据.BookKeeper 有点儿类似 ...

  7. [LC] 74. Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  8. python--mysql的CURD操作

    from pymysql import * def main(): # 创建Connextion连接 conn = connect(host='localhost', port=3306, user= ...

  9. SHELL用法五(Case语句)

    1.SHELL编程Case语句案例实战 1)Case选择条件语句的格式: case $INPUT in Pattern1) 语句1 ;; Pattern2) 语句2 ;; esac 2)Case语句企 ...

  10. python可变类型和不可变类型,深拷贝vs浅拷贝

    转载:https://www.cnblogs.com/huamingao/p/5809936.html 核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(un ...