注意:Oa其实在OK的延长线上,上图只是为了好看才把Oa和OK分开了

算法需求如图所示:

已知空间向量OA和空间向量OB

我想算出OA向OB按某角度或者某时间移动

变成空间向量Oa的算法

先说废话:我一开始尝试了:空间平面、矩阵、四元素等等方式都能算出来,但是很繁琐。

然后发现,其实向量之间的算法完全能满足需求:

1.先求出向量AB

2.然后按某时间,某角度或者某百分比 乘以AB向量得到向量:AK

3.OA+AK=OK

4.将OK的向量归一化,乘以OA的模(长度)得到Oa

注意:Oa其实在OK的延长线上,上图只是为了好看才把Oa和OK分开了

  1. osg::Vec3d rotateVector(double time, osg::Vec3d OA, osg::Vec3d OB)
  2. {
  3. //http://www.cnblogs.com/lyggqm/p/8820676.html
  4. osg::Vec3d _Oa;
  5. osg::Vec3d AB = OB - OA;
  6. if (time >=0.0 && time <= 1.0)
  7. AB *= time;//AK = AB*time
  8. else
  9. return OA;
  10. osg::Vec3d OK = OA + AB;
  11. OK.normalize();//因为OA,OB传入的已经是normalize的所以OK就是Oa了
  12. _Oa = OK;
  13. return _Oa;
  14. }

算法结束

由此算法,再给出一个osg空间四元素q1转到空间四元素q2的函数吧:(与之前算法无关)

  1. /// Spherical Linear Interpolation
  2. /// As t goes from 0 to 1, the Quat object goes from "from" to "to"
  3. /// Reference: Shoemake at SIGGRAPH 89
  4. /// See also
  5. /// http://www.gamasutra.com/features/programming/19980703/quaternions_01.htm
  6. void Quat::slerp( value_type t, const Quat& from, const Quat& to )
  7. {
  8. const double epsilon = 0.00001;
  9. double omega, cosomega, sinomega, scale_from, scale_to ;
  10.  
  11. osg::Quat quatTo(to);
  12. // this is a dot product
  13.  
  14. cosomega = from.asVec4() * to.asVec4();
  15.  
  16. if ( cosomega <0.0 )
  17. {
  18. cosomega = -cosomega;
  19. quatTo = -to;
  20. }
  21.  
  22. if( (1.0 - cosomega) > epsilon )
  23. {
  24. omega= acos(cosomega) ; // 0 <= omega <= Pi (see man acos)
  25. sinomega = sin(omega) ; // this sinomega should always be +ve so
  26. // could try sinomega=sqrt(1-cosomega*cosomega) to avoid a sin()?
  27. scale_from = sin((1.0-t)*omega)/sinomega ;
  28. scale_to = sin(t*omega)/sinomega ;
  29. }
  30. else
  31. {
  32. /* --------------------------------------------------
  33. The ends of the vectors are very close
  34. we can use simple linear interpolation - no need
  35. to worry about the "spherical" interpolation
  36. -------------------------------------------------- */
  37. scale_from = 1.0 - t ;
  38. scale_to = t ;
  39. }
  40.  
  41. *this = (from*scale_from) + (quatTo*scale_to);
  42.  
  43. // so that we get a Vec4
  44. }
  45.  
  46. //*************以下是用法*******************/
  47.  
  48. osg::Quat q1,q2;
  49. double time;//time是0到1值
  50. //.......赋值不表
  51.  
  52. q1.slerp(time, q1, q2);//q1按time百分比转到q2

[原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数的更多相关文章

  1. OpenGL 的空间变换(下):空间变换

    通过本文的上篇 OpenGL 的空间变换(上):矩阵在空间几何中的应用 ,我们了解到矩阵的基础概念.并且掌握了矩阵在空间几何中的应用.接下来,我们将结合矩阵来了解 OpenGL 的空间变换. 在使用 ...

  2. webgl 的空间变换(下):空间变换

    在网上看了很多关于在三维世界中怎么把一个顶点经过一步步变化,最终呈现在我们的屏幕上的. 其实很多博客或者书籍已经讲的很清楚了,那为什么我还要特别再写一次博客来阐述自己观点呢?(这里只针对那些学习web ...

  3. 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使

    有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...

  4. /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...

  5. unity, 相机空间 与 相机gameObject的局部空间

    在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...

  6. Oracle 删除用户和表空间////Oracle创建删除用户、角色、表空间、导入导出、...命令总结/////Oracle数据库创建表空间及为用户指定表空间

    Oracle 使用时间长了, 新增了许多user 和tablespace. 需要清理一下 对于单个user和tablespace 来说, 可以使用如下命令来完成. 步骤一:  删除user drop ...

  7. 0xC0000005;Access Violation(栈区空间很宝贵, linux上栈区空间默认为8M,vc6下默认栈空间大小为1M)

    写C/C++程序最怕出现这样的提示了,还好是在调试环境下显示出来的,在非调试状态就直接崩溃退出. 从上述汇编代码发现在取内存地址 eax+38h 的值时出错, 那说明这个地址非法呗, 不能访问, 一般 ...

  8. 【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理

    一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data ...

  9. ORACLE表空间offline谈起,表空间备份恢复

    从ORACLE表空间offline谈起,表空间备份恢复将表空间置为offline,可能的原因包括维护.备份恢复等目的:表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL ...

随机推荐

  1. script 跳出小窗口

    sss  

  2. Jira客户端

    github地址 https://github.com/rcarz/jira-client 使用 1)私服 <!-- https://mvnrepository.com/artifact/net ...

  3. VMware环境安装MacOS

    环境: win10专业版 VMware 14 Pro 开始吧 1. 停止服务 2. 解压并管理员权限运行unlocker,目的是使得 win10 环境下的 VMWare14Pro 支持 mac 系统的 ...

  4. Python3 解析excel文件

    Python3 解析读取excel文件 一.第三方库 import xlrd 二.代码示例 import xlrd ''' 读取Excel每个sheet的第一列和第二列的值,拼接成json串,写入文件 ...

  5. mysql不常用但很有用的语句整理

    mysqld_multi多实例停止.启动 mysqld_multi --defaults-file=/etc/my.cnf start 1,2 mysqld_multi --defaults-file ...

  6. 报错ORA-19809 ORA-19804

    现象 问题检查 查看群集状态,发现归档挂起 [oracle@jydb1 ~]$ srvctl status database -d orcl -v 查看空间使用情况 #大小查看 SQL> sho ...

  7. ldap集成nginx

    nginx版本:1.10.2 nginx安装: wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar ...

  8. Windows Shell编程实现重叠图标IconOverlay

    转载:https://www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects 转载:h ...

  9. DPAA1是如何辅助cpu进行网络加速的?

    1.为何会出现DPAA1? 1.1 如果没有多核处理器的出现可能就不会出现这个东东了! 1.2 怎么会跟多核处理器扯上关系呢? 1.2.1 先聊聊单核处理器会怎么处理网络包呢? 单核同一时刻只能处理一 ...

  10. 如何使用jqueryUi的datepicker日历控件?

    参考: http://www.jb51.net/article/85007.htm 这里的日历控件是, 基于jquery的jqureyui中的一个 widget. 需要js 文件: 外部的js文件, ...