问题

通过绘制模型前设置世界矩阵(见前一个教程)时,你可以在场景的任意位置放置模型。当你将模型从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

处理模型——找到对应一个方向的旋转角相关推荐

  1. python有哪些方向、应该怎么学-终于找到深圳学Python,有几个方向?怎么从一个方向学到底...

    深圳学Python,有几个方向?怎么从一个方向学到底,近日很多临近毕业的大学生朋友来邮件询问关于深圳Python培训的一些事情,觉得很有代表性,所以就想探讨一下:为什么要选择深圳Python培训?经过 ...

  2. Python初学者的自我修养,找到自己的方向

    今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...

  3. NLP通用模型诞生?一个模型搞定十大自然语言常见任务

    翻译 | 于之涵 编辑 | Leo 出品 | AI科技大本营 (公众号ID:rgznai100) AI科技大本营按:目前的NLP领域有一个问题:即使是再厉害的算法也只能针对特定的任务,比如适用于机器翻 ...

  4. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  5. 创业干货:在众说纷纭中找到前进的方向

    昨天上午给珠海青年创业学院的学员与同行们作了一个名为<在众说纷纭中找到前进的方向>的分享和交流,个人认为这是一个具有一定情怀的名字,我并不是给大家来找到方向或确定方向的,更多的只是探讨可能 ...

  6. 分享网上找到的一个中国象棋源码

    代码的结构挺好,mvc模式的,给大家分享出来 原创不易,转载请注明出处:分享网上找到的一个中国象棋源码 部分代码 Controller.java package com.zuidaima.chess. ...

  7. 【学习总结】在重庆北大青鸟最大的收获就是找到了学习方向和目标!

    时光匆匆,在不知不觉中我已经在重庆北大青鸟新英航学校学习了一个多月了,前几天又经历了第一次全校的月考.今天我对这一个多月的学习进行总结一下,总结问题改善学习. 在重庆北大青鸟这里我认识到了Java,也 ...

  8. 百度联盟峰值,李彦宏演讲实录:下一个方向其实是新数据

    以下为李彦宏演讲实录 大家好,欢迎大家来到黄山. 每年的联盟峰会都会选择一个山清水秀的地方,这样是因为,一方面心情可以比较放松;另外一方面,思路也容易打开.去年的联盟峰会在香格里拉举 行,当时我讲的话 ...

  9. 步进电机只朝一个方向旋转的解决方法(自己踩过的坑)

    在研究1200控制步进电机的过程中,刚开始买了一个滚珠丝杠滑台,按照教程操作下来发现没啥问题.后面又买了一个步进电机,重新接了一次线,为了简化接线,我将3L+和L+接在了一起,3M和M接在了一起,看起 ...

  10. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

最新文章

  1. Android使用ListView控件问题
  2. JAVA中常用的异常处理情况
  3. Error loading WebappClassLoader
  4. python 装饰器简单笔记(附 *args **kw)
  5. Linux命令替换字符串
  6. SecureCRT常用的使用技巧
  7. 能量采集(HYSBZ-2005)
  8. centos 7 下 rabbitmq 3.8.0 erlang 22.1 源码编译安装
  9. 没有找到dllregisterserver输入点_「Mac实用技巧」将浏览器的点密码转换成文本密码的三种方法分享...
  10. VS2010/MFC编程入门系列教程
  11. 嵌入式c语言 c语言_C和嵌入式C有什么区别?
  12. manjaro pacman 使用方法总结
  13. oracle 分区之 interval range 分区
  14. 吉软-Java57-第一次作业
  15. pDC 与 GetDC() 区别
  16. 【MATLAB统计分析与应用100例】案例011:matlab读取Excel数据,调用regress函数作一元线性回归分析
  17. java隐藏字符_Java原生隐藏字符-工具类
  18. gom列表自动选择服务器,传奇服务器-传奇服务器端 GOM GEE(必看知识)
  19. 【翻译】WF从入门到精通(第八章):调用外部方法及工作流
  20. java android 打地鼠_android实现打地鼠游戏

热门文章

  1. Java SE 基础:继承、封装、多态、fianl、static、abstract
  2. Mysql基本语句(个人笔记)
  3. python Image 模块处理图片
  4. 原生javascript知识点
  5. SpringMVC:学习笔记(7)——验证器(JSR303)
  6. 2016 - 1 -17 GCD学习总结
  7. 设置数据库及表的默认字符集
  8. 组合模式Composite
  9. Android中Socket大文件断点上传
  10. 洛谷P4012 深海机器人问题(费用流)