处理模型——找到对应一个方向的旋转角
问题
通过绘制模型前设置世界矩阵(见前一个教程)时,你可以在场景的任意位置放置模型。当你将模型从A点移至B点,你需要确保它转向正确的方向。
这个旋转角通常通过一个自然的方式获取,例如,当处理一个包含旋转的世界矩阵。但是,如果你只是存储模型的前一个位置和当前位置的方法移动模型的话,那么必须手动旋转这个模型。
解决方案
你需要首先计算模型运动的方向。从这个方向的X轴和Z轴开始,很容易找到这个角度。
工作原理
给定一个方向,你想知道需要旋转模型多少角度才能让它指向这个方向。给定如图4-8右边所示的方向,你想找到这个方向与Z轴的夹角。
如果你还记得三角形的基本知识那么这个解决方案是很简单的。给定如图4-8左边所示的三角形,你可以通过计算S除以L的反正切值(atan)得到a角,对于右图的情况,你可以通过计算方向的X分量除以Z分量的反正切值获取旋转角度。
图4-8 计算偏离给定方向的旋转角
atan方法返回的值在+90度和–90度之间(当两个负数相除时,负号会丢失)。
幸运的是,.NET Framework还提供了Atan2方法,这个方法可以让你分别提供X和Z值,返回在–180至180度范围内的值,让旋转角定义在完整的一个圆周内。
下面的简单方法计算对应模型当前位置和前一个位置的旋转角:
private float CalculateRotation(Vector3 oldPos, Vector3 newPos, float lastRot) {Vector3 direction = newPos - oldPos; if ((direction.X == 0) &&(direction.Z == 0)) return lastRot; else return (float)Math.Atan2(direction.X,direction.Z); }
首先你找到旧位置指向新位置的方向用于计算对应旋转角。如果模型停止移动或垂直移动,这个方向的X和Z都是0,Atan2方法会返回一个无用的值,这时要返回上次的旋转值,这样不动的模型会保持它的旋转值。
用法
你应该使用这个计算出的旋转角创建一个绕向上的Y轴的旋转,这样模型的前方就会朝向运动的方向。当创建世界矩阵时,你应该首先平移模型然后进行旋转。这意味着你应该在矩阵乘法中将旋转放置在平移的左边(见教材4-2)。看一下下面的例子,模型最后的位置存储在position变量中,而angle变量是由CalculateRotation方法计算得到的:
worldMatrix = Matrix.CreateTranslation(position); worldMatrix = Matrix.CreateRotationY(angle) * worldMatrix; worldMatrix = Matrix.CreateScale(0.005f) * worldMatrix;
在本例中,首先模型坐标被移动到模型中心的最终位置,然后施加绕Y轴的旋转,之后使模型变小。
代码
你可以在前面看到CalculateRotation方法的代码。
转载于:https://www.cnblogs.com/AlexCheng/archive/2010/12/08/2120143.html
处理模型——找到对应一个方向的旋转角相关推荐
- python有哪些方向、应该怎么学-终于找到深圳学Python,有几个方向?怎么从一个方向学到底...
深圳学Python,有几个方向?怎么从一个方向学到底,近日很多临近毕业的大学生朋友来邮件询问关于深圳Python培训的一些事情,觉得很有代表性,所以就想探讨一下:为什么要选择深圳Python培训?经过 ...
- Python初学者的自我修养,找到自己的方向
今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...
- NLP通用模型诞生?一个模型搞定十大自然语言常见任务
翻译 | 于之涵 编辑 | Leo 出品 | AI科技大本营 (公众号ID:rgznai100) AI科技大本营按:目前的NLP领域有一个问题:即使是再厉害的算法也只能针对特定的任务,比如适用于机器翻 ...
- 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种
基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...
- 创业干货:在众说纷纭中找到前进的方向
昨天上午给珠海青年创业学院的学员与同行们作了一个名为<在众说纷纭中找到前进的方向>的分享和交流,个人认为这是一个具有一定情怀的名字,我并不是给大家来找到方向或确定方向的,更多的只是探讨可能 ...
- 分享网上找到的一个中国象棋源码
代码的结构挺好,mvc模式的,给大家分享出来 原创不易,转载请注明出处:分享网上找到的一个中国象棋源码 部分代码 Controller.java package com.zuidaima.chess. ...
- 【学习总结】在重庆北大青鸟最大的收获就是找到了学习方向和目标!
时光匆匆,在不知不觉中我已经在重庆北大青鸟新英航学校学习了一个多月了,前几天又经历了第一次全校的月考.今天我对这一个多月的学习进行总结一下,总结问题改善学习. 在重庆北大青鸟这里我认识到了Java,也 ...
- 百度联盟峰值,李彦宏演讲实录:下一个方向其实是新数据
以下为李彦宏演讲实录 大家好,欢迎大家来到黄山. 每年的联盟峰会都会选择一个山清水秀的地方,这样是因为,一方面心情可以比较放松;另外一方面,思路也容易打开.去年的联盟峰会在香格里拉举 行,当时我讲的话 ...
- 步进电机只朝一个方向旋转的解决方法(自己踩过的坑)
在研究1200控制步进电机的过程中,刚开始买了一个滚珠丝杠滑台,按照教程操作下来发现没啥问题.后面又买了一个步进电机,重新接了一次线,为了简化接线,我将3L+和L+接在了一起,3M和M接在了一起,看起 ...
- 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来
题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...
最新文章
- Android使用ListView控件问题
- JAVA中常用的异常处理情况
- Error loading WebappClassLoader
- python 装饰器简单笔记(附 *args **kw)
- Linux命令替换字符串
- SecureCRT常用的使用技巧
- 能量采集(HYSBZ-2005)
- centos 7 下 rabbitmq 3.8.0 erlang 22.1 源码编译安装
- 没有找到dllregisterserver输入点_「Mac实用技巧」将浏览器的点密码转换成文本密码的三种方法分享...
- VS2010/MFC编程入门系列教程
- 嵌入式c语言 c语言_C和嵌入式C有什么区别?
- manjaro pacman 使用方法总结
- oracle 分区之 interval range 分区
- 吉软-Java57-第一次作业
- pDC 与 GetDC() 区别
- 【MATLAB统计分析与应用100例】案例011:matlab读取Excel数据,调用regress函数作一元线性回归分析
- java隐藏字符_Java原生隐藏字符-工具类
- gom列表自动选择服务器,传奇服务器-传奇服务器端 GOM GEE(必看知识)
- 【翻译】WF从入门到精通(第八章):调用外部方法及工作流
- java android 打地鼠_android实现打地鼠游戏