XNA中三维空间物体的几种旋转方法
- 通过绕三个坐标轴的旋转之和。
X、Y、Z分别描述绕三个坐标轴的旋转角度(0~360)。这三个角度称为欧拉角。绕X轴旋转的角称为倾斜角(pitch),绕Y轴旋转的角称为翻滚角(head或yaw),绕Z轴旋转的角称为摇摆角(roll)。物体的朝向一般可以用欧拉角表示,因此朝向的插值问题可以简单地转化为三个欧拉角的插值问题。但欧拉角表示也有它的局限性。因为旋转矩阵是不可交换的,基于欧拉角的旋转一定要按某个特定的次序进行;此外。等量的欧拉角变化不一定引起等量的旋转变化,从而导致旋转的不均匀;欧拉角还有可能导致自由度的丧失,出现万向节死锁现象。在使用三个旋转值来分别进行旋转变换的组合时,由于各个旋转是顺序进行的,绕一个轴的旋转会覆盖绕别的轴的旋转,会导致推动旋转的某个角度。例如:如果一个平行X轴的向量绕一个Y轴旋转90度,平等于X轴,那么,所有绕Z轴的旋转都不再起作用。
XNA中主要通过Matrix. CreateRotationX、Matrix. CreateRotationY、Matrix. CreateRotationZ方法实现欧拉角的旋转。这三个方法都是通过旋转角度生成一个旋转矩阵。如生成绕Y轴的旋转的矩阵代码如下:
2{
3 Matrix matrix;
4 float num2 = (float) Math.Cos((double) radians);
5 float num = (float) Math.Sin((double) radians);
6 matrix.M11 = 1f;
7 matrix.M12 = 0f;
8 matrix.M13 = 0f;
9 matrix.M14 = 0f;
10 matrix.M21 = 0f;
11 matrix.M22 = num2;
12 matrix.M23 = num;
13 matrix.M24 = 0f;
14 matrix.M31 = 0f;
15 matrix.M32 = -num;
16 matrix.M33 = num2;
17 matrix.M34 = 0f;
18 matrix.M41 = 0f;
19 matrix.M42 = 0f;
20 matrix.M43 = 0f;
21 matrix.M44 = 1f;
22 return matrix;
23}
24
25
26
27
28
XNA中也有一个Matrix.CreateFromYawPitchRoll方法,起初我也以为它是生成欧拉角旋转矩阵的,但在分析过他的实现代码后才发现,它其实是生成了一个四元数:
1public static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll)
2{
3 Matrix matrix;
4 Quaternion quaternion;
5 Quaternion.CreateFromYawPitchRoll(yaw, pitch, roll, out quaternion);
6 CreateFromQuaternion(ref quaternion, out matrix);
7 return matrix;
8}
这里是传说中将欧拉角转换为四元数的方法:
2{
3 float num9 = roll * 0.5f;
4 float num6 = (float) Math.Sin((double) num9);
5 float num5 = (float) Math.Cos((double) num9);
6 float num8 = pitch * 0.5f;
7 float num4 = (float) Math.Sin((double) num8);
8 float num3 = (float) Math.Cos((double) num8);
9 float num7 = yaw * 0.5f;
10 float num2 = (float) Math.Sin((double) num7);
11 float num = (float) Math.Cos((double) num7);
12 result.X = ((num * num4) * num5) + ((num2 * num3) * num6);
13 result.Y = ((num2 * num3) * num5) - ((num * num4) * num6);
14 result.Z = ((num * num3) * num6) - ((num2 * num4) * num5);
15 result.W = ((num * num3) * num5) + ((num2 * num4) * num6);
16}
17
18
19
20
21
2.绕任意轴旋转
绕任意轴旋转需要两个参数:一个向量和一个角度,其中向量表示旋转轴,角度表示将要旋转的角度(0~360度)。
使用这种方法来进行旋转变化时,两个方向之间的插值不够够平滑,容易导致出现抖动等问题,如下图所示:
这种方法在XNA中主要通过 Matrix.CreateFromYawPitchRoll方法来实现。方法内容如下:
1public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
2{
3 Quaternion quaternion;
4 float num2 = angle * 0.5f;
5 float num = (float) Math.Sin((double) num2);
6 float num3 = (float) Math.Cos((double) num2);
7 quaternion.X = axis.X * num;
8 quaternion.Y = axis.Y * num;
9 quaternion.Z = axis.Z * num;
10 quaternion.W = num3;
11 return quaternion;
12}
3.四元数旋转。
我们知道在实现绕任意轴旋转方面,以上两种方法都不够完美,而使用四元数来旋转则显得非常得体。
XNA中通过Matrix.CreateFromQuaternion方法创建旋转矩阵。实现方法如下:
1public static Matrix CreateFromQuaternion(Quaternion quaternion)
2{
3 Matrix matrix;
4 float num9 = quaternion.X * quaternion.X;
5 float num8 = quaternion.Y * quaternion.Y;
6 float num7 = quaternion.Z * quaternion.Z;
7 float num6 = quaternion.X * quaternion.Y;
8 float num5 = quaternion.Z * quaternion.W;
9 float num4 = quaternion.Z * quaternion.X;
10 float num3 = quaternion.Y * quaternion.W;
11 float num2 = quaternion.Y * quaternion.Z;
12 float num = quaternion.X * quaternion.W;
13 matrix.M11 = 1f - (2f * (num8 + num7));
14 matrix.M12 = 2f * (num6 + num5);
15 matrix.M13 = 2f * (num4 - num3);
16 matrix.M14 = 0f;
17 matrix.M21 = 2f * (num6 - num5);
18 matrix.M22 = 1f - (2f * (num7 + num9));
19 matrix.M23 = 2f * (num2 + num);
20 matrix.M24 = 0f;
21 matrix.M31 = 2f * (num4 + num3);
22 matrix.M32 = 2f * (num2 - num);
23 matrix.M33 = 1f - (2f * (num8 + num9));
24 matrix.M34 = 0f;
25 matrix.M41 = 0f;
26 matrix.M42 = 0f;
27 matrix.M43 = 0f;
28 matrix.M44 = 1f;
29 return matrix;
30}
31
32
33
34
35
Quaternion类的构造为Quaternion(float x, float y, float z, float w),当然也还可以通过CreateFromAxisAngle、CreateFromRotationMatrix、CreateFromYawPitchRoll等方法将其它的旋转方法转换为四元数。
转载于:https://www.cnblogs.com/desmend/archive/2008/09/20/1294880.html
XNA中三维空间物体的几种旋转方法相关推荐
- HTML5中aside标签的两种使用方法
aside元素在网站制作中主要有以下两种使用方法 1)被包含在article元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料.名次解释,等等. <article> ...
- JAVA中线程同步的几种实现方法
JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...
- Word中繁体艺术字的两种制作方法(转)
Word中繁体艺术字的两种制作方法(转) Word里的艺术字是大家平时常用的一项功能,但有时我们可能需要制作一些繁体艺术字,而这个看似简单的要求,实现起来却不是那么容易,因为Word里的繁简转换功能对 ...
- c语言中将十六进制数转换为十进制数程序,C语言中十六进制转十进制两种实现方法...
C语言中十六进制转十进制两种实现方法 C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英 ...
- GCN】在NLP中应用GCN的几种构图方法整理
GCN]在NLP中应用GCN的几种构图方法整理:https://blog.csdn.net/qq_27590277/article/details/106264292
- 产品设计中多见的四种倒角方法
在工业设计中,对产品外观设计特别是关键点的把握,基本上离不开一个专业术语--倒角.无论是手绘画外观设计或是三维外观,都需要把握倒角的应用. 1.倒角定义 在机械设备制造中,倒角就是指将铸件的边角切割成 ...
- (C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)
目录 1.对Unity脚本写入有一定的思维了解. 2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现. 3.开始通过代码实现功能. 4.一个整体的代码实现 5.学习心得 PS:首先我们要 ...
- android item三种,Android RecyclerView中的ItemDecoration的几种绘制方法
如题,我们使用recyclerview的时候,如果没有设置显示条目的margin,或者padding的话,是没有分割线效果的. 那么除去使用margin或padding,其余的方法是用itemdeco ...
- 在Linux系统中存储设备的两种表示方法
作者:北南南北 来自:LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的:比如IDE硬盘 ...
最新文章
- Electron中打开和关闭子窗口以及子窗口向父窗口传值
- 肿瘤相关甲基化预后分析数据库SurvivalMeth详细使用指南
- 洛谷 P1469 找筷子
- 送什么给女朋友最致命?
- 32位系统win2008+mssql2008 6G内存折腾纪实
- 读过的最好的epoll讲解
- 听说你做IT的,帮我做个网站呗!
- Maven 仓库、镜像
- 3D造型软件:Rhino 7 for Mac
- 2019.02.12 bzoj3944: Sum(杜教筛)
- 周期信号波形识别及参数测量装置(J 题) 【高职高专组】--2021 年全国大学生电子设计竞赛
- macbook M1 brew install失败
- [C++]H106OJ-第二周练习总结
- LSTM及其变体peehole
- 34.UCASE() LCASE() 函数
- VSCode 连接 Linux 远程服务器
- vim-3 粘贴命令、替换命令、替换模式和修改命令
- 计算机网课计划,计算机基础课程授课计划表.docx
- 2022安徽马鞍山市博望区社区专职网格员储备人才考试综合试题及答案
- Android抓包-Charles弱网环境模拟
热门文章
- Spring AOP切入点与通知XML类型
- iis 装完framework4 7 无法切换_扫盲贴之电压并列与电压切换
- 鸿蒙分布式体验,一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验
- 机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖
- php后门 佛像,35张活的再久,也未必见过的照片,图2是佛像通过CT扫描后内部照...
- a标签获取input值_HTML5常用标签
- java中数据类型转换、ASCII编码
- 支付系统设计:支付系统的账户模型(一)
- 互联网日报 | 7月3日 星期六 | 滴滴回应被网络安全审查;小米启动“青年工程师激励计划”;阿里成立生活服务板块...
- App 运营的指标具体都有哪些?