在3D空间中的物体以某一速度运动,有时候需要这个物体的朝向和速度的方向一致,
为了实现这个目标我们一般借助旋转矩阵 M 来将物体旋转到对应的朝向。

例如速度方向矢量 spdV: Vector3D(1,2,3),
X轴基向量为 axis_x: Vector3D(1,0,0), 这个矢量的方向和3D物体不做任何旋转时候的默认朝向一致
3D矢量 cross_x 记录了 axis_x 叉乘 spdV 的结果.

算出矩阵 M 的方法一:
先计算出 spdVaxis_x 两矢量之间的弧度值 rad(可用余弦函数计算), 然后用一个单位矩阵 m0,
让 m0 绕 轴 cross_x 旋转 rad, 就可以得到结果矩阵 M

算出矩阵 M 的方法二(此方法计算过程简洁,因此可以用在有些不能直接使用矩阵的地方例如有些Shader计算):
通过几何算法直接算出 矩阵M 三个正交轴的基向量(axis_x,axis_y,axis_z)
如何计算呢? 请见下面的代码:

/*** 通过速度, 计算物体朝向矩阵的三个轴的数据* */public static function calcDirecMatByVelocity(spdv:Vector3D):Vector.<Vector3D> {var axis_x:Vector3D = spdv.clone();axis_x.normalize();// 处理速度和x轴基向量朝向重合导致叉乘为零的问题if (axis_x.x != 0 && (Math.abs(axis_x.y) < 0.0000001 && Math.abs(axis_x.z) < 0.0000001)) {return Vector.<Vector3D>([new Vector3D(1, 0, 0), new Vector3D(0, 1, 0), new Vector3D(0, 0, 1)]);}// 记录x轴的基向量axis_x.setTo(1,0,0);// = new Vector3D(1, 0, 0);// axis_x和spdv 叉乘var cross_x:Vector3D = axis_x.crossProduct(spdv);// cross_x和spdv 叉乘,并将叉乘结果记录在 MathCalc.outCrossV 这个3D矢量中,用这个函数是为了不产生新的3d矢量对象
            MathCalc.crossV3D2(cross_x, spdv);cross_x.normalize();MathCalc.outCrossV.normalize();//// 0.5 * 其实可以不要cross_x.x = 0.5 * (cross_x.x + MathCalc.outCrossV.x);cross_x.y = 0.5 * (cross_x.y + MathCalc.outCrossV.y);cross_x.z = 0.5 * (cross_x.z + MathCalc.outCrossV.z);// 至此, 已经计算出了 新的z轴
            cross_x.normalize();// 得到 新的 y轴var axis_y:Vector3D = cross_x.crossProduct(spdv);axis_y.normalize();// spdv 就是 新x 轴, 标准化
            axis_x.setTo(spdv.x,spdv.y,spdv.z);axis_x.normalize();//
            var vs:Vector.<Vector3D> = new Vector.<Vector3D>();vs.push(axis_x,axis_y,cross_x);return vs;}

  上面的代码用 as3 实现, 实际算法和语言无关。

方法二原理解释:
首先, 旋转矩阵 M 的X轴基向量axis_x,在空间上和spdV重合,因此spdV标准化了之后,就是X轴基向量axis_x
cross_x 这个旋转轴 和 spdv 叉乘的结果MathCalc.outCrossV 是落在了 M 表示的空间的 YOZ 平面上,
旋转轴 cross_x 也落在 M 表示的空间的 YOZ 平面上。
而且 axis_zYOZ 平面上恰好就是 MathCalc.outCrossV 和 旋转轴 cross_x 夹角的中分线,因此可以直接用计算
中点的方式直接算出 axis_z(z轴的基向量)
有了 axis_z, 由于三个基向量相互垂直,因此再通过叉乘计算出 axis_y
至此,得到了旋转矩阵 M。AGAL 可以使用此方法计算粒子等的速度朝向。

转载于:https://www.cnblogs.com/vilyLei/articles/4469518.html

使3D空间中物体朝向和其速度方向一致的旋转矩阵计算方案相关推荐

  1. 3D空间中的点坐标转化为屏幕二维点坐标(一)

    每个人在进入计算机图形学的世界中,都有一个同样的困惑,三维世界中的三维坐标是如何被转换成屏幕上的二维坐标的,我如何在屏幕上找到一个点(二维点)对应三维世界中的点(三维点)呢? 要理解其中的过程,对学习 ...

  2. 一般向量空间的基变换_向量几何--3-D空间中的基变换与坐标变换【转】 - 回到未来 - C++博客...

    <6>3-D空间中的基变换与坐标变换-Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address:popyy@netease ...

  3. 用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影

    要实现3D空间中的点坐标转换为屏幕二维点坐标,需要进行透视变换和投影变换.以下是一些基本的思路和示例代码,可以用于实现主视图.侧视图.俯视图.正等轴投影. 1. 主视图投影 主视图投影是指以一个点作为 ...

  4. 使用脑电图慢皮层电位重建3D空间中的手,肘和肩的实际和想象的轨迹

    导读 从神经活动中解码想象运动的运动学的能力对于开发可以帮助行动不便的人的假肢设备至关重要.当前采用脑电图(EEG)等无创记录方法解码实际和想象的手运动轨迹来控制神经运动假体,通常通过应用多维线性回归 ...

  5. 在3D空间中绘制四边形

    在3D空间中绘制四边形 四边形 GL_QUADS OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形. 注意,在使用四边形时,必需记住一个重要规则:一个四边形的四个角必须 ...

  6. 3D 空间中拟合曲线

    算法来源:C++/PCL:最小二乘拟合平面直线,平面多项式曲线,空间多项式曲线 以下是我改写的算法,未经验证正确性!!! // 3D 空间中拟合曲线 void fittingPolynomial3D( ...

  7. 2D平面上的变换和3D空间中的变换以及求无穷远点

    求两个平行线的无穷远点,最简单的方法(二维空间和三维空间都适用) 两个平行线的交点就是无穷远点.求解的方法就是把直线的方向向量(向量我们都用列向量表示)拿到,然后给最后一维加个0就是它们的交点(无穷远 ...

  8. 【学习OpenGL】(三)——3D空间中的点与线

    一.3D空间中的点 #include <gl/glut.h> #include <math.h>#define GL_PI 3.1415fstatic GLfloat xRot ...

  9. 3d空间中球体的动量守恒

    其实,虽然说的是3d空间中的,但事实上一旦掌握原理,他可以用在任意维度的空间中: 为了简化代码,最好能够满足如下要求: 所有的空间属性都用矢量来表示:比如位置,速度,加速度(虽然这里涉及不到加速度): ...

最新文章

  1. Linux学习笔记:touch新建文件、修改访问、改动时间
  2. onresize事件会被多次触发_玩转SpringBoot之通过事件机制参与SpringBoot应用的启动过程...
  3. [蓝桥杯][算法提高VIP]分苹果(差分||树状数组)
  4. 冒泡法排序c语言函数模板,使用模板技术的冒泡排序
  5. int类型数字特别大
  6. 24.8. UNION
  7. SpringBoot执行流程
  8. Maple:把计算结果保存出来
  9. 《WCF技术内幕》翻译5:第1部分_第1章_蓝月亮:WCF介绍和本章小结
  10. azure云数据库_如何使用Cloud Shell创建Azure SQL数据库
  11. asp.net 正在加载效果实现
  12. 实验五 单表查询(V2.0版)
  13. 免费CSDN积分获取
  14. PCIe协议在具体实现时的大体框图
  15. qca wlan wifi modules解析三
  16. matlab plotyy legend,一幅图中画两个legend及plotyy标注问题
  17. 视频二维码功能应用与教程(完整版)
  18. Top100图神经网络论文大盘点
  19. js 数组的find和findIndex
  20. Ubuntu 18 安装截图工具 flameshot

热门文章

  1. 易语言逐条读access数据_易语言操作数据教程之ACCESS实战视频教程
  2. db2v9/9.5高级应用开发_Spark v2.4.3应用程序开发入门-基于IDEA/Maven 构建简单应用
  3. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...
  4. mysql 8.0免安装配置_Mysql8.0免安装包配置方法
  5. python名称由来_Python的由来与使用介绍
  6. linux igmp v3 过滤ip,网络 – Linux和IGMPv3上的多播加入
  7. gradient设置上下渐变_iOS 绘制渐变·实例篇
  8. python:未找到命令
  9. VS创建props属性表并在新项目中导入props属性表
  10. VS2019配置库文件