[原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数
注意: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分开了
- osg::Vec3d rotateVector(double time, osg::Vec3d OA, osg::Vec3d OB)
- {
- //http://www.cnblogs.com/lyggqm/p/8820676.html
- osg::Vec3d _Oa;
- osg::Vec3d AB = OB - OA;
- if (time >=0.0 && time <= 1.0)
- AB *= time;//AK = AB*time
- else
- return OA;
- osg::Vec3d OK = OA + AB;
- OK.normalize();//因为OA,OB传入的已经是normalize的所以OK就是Oa了
- _Oa = OK;
- return _Oa;
- }
算法结束
由此算法,再给出一个osg空间四元素q1转到空间四元素q2的函数吧:(与之前算法无关)
- /// Spherical Linear Interpolation
- /// As t goes from 0 to 1, the Quat object goes from "from" to "to"
- /// Reference: Shoemake at SIGGRAPH 89
- /// See also
- /// http://www.gamasutra.com/features/programming/19980703/quaternions_01.htm
- void Quat::slerp( value_type t, const Quat& from, const Quat& to )
- {
- const double epsilon = 0.00001;
- double omega, cosomega, sinomega, scale_from, scale_to ;
- osg::Quat quatTo(to);
- // this is a dot product
- cosomega = from.asVec4() * to.asVec4();
- if ( cosomega <0.0 )
- {
- cosomega = -cosomega;
- quatTo = -to;
- }
- if( (1.0 - cosomega) > epsilon )
- {
- omega= acos(cosomega) ; // 0 <= omega <= Pi (see man acos)
- sinomega = sin(omega) ; // this sinomega should always be +ve so
- // could try sinomega=sqrt(1-cosomega*cosomega) to avoid a sin()?
- scale_from = sin((1.0-t)*omega)/sinomega ;
- scale_to = sin(t*omega)/sinomega ;
- }
- else
- {
- /* --------------------------------------------------
- The ends of the vectors are very close
- we can use simple linear interpolation - no need
- to worry about the "spherical" interpolation
- -------------------------------------------------- */
- scale_from = 1.0 - t ;
- scale_to = t ;
- }
- *this = (from*scale_from) + (quatTo*scale_to);
- // so that we get a Vec4
- }
- //*************以下是用法*******************/
- osg::Quat q1,q2;
- double time;//time是0到1值
- //.......赋值不表
- q1.slerp(time, q1, q2);//q1按time百分比转到q2
[原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数的更多相关文章
- OpenGL 的空间变换(下):空间变换
通过本文的上篇 OpenGL 的空间变换(上):矩阵在空间几何中的应用 ,我们了解到矩阵的基础概念.并且掌握了矩阵在空间几何中的应用.接下来,我们将结合矩阵来了解 OpenGL 的空间变换. 在使用 ...
- webgl 的空间变换(下):空间变换
在网上看了很多关于在三维世界中怎么把一个顶点经过一步步变化,最终呈现在我们的屏幕上的. 其实很多博客或者书籍已经讲的很清楚了,那为什么我还要特别再写一次博客来阐述自己观点呢?(这里只针对那些学习web ...
- 有一台机器,上面有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个请求的顺 ...
- /编写一个函数,要求从给定的向量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:$ */ /* 编写一个 ...
- unity, 相机空间 与 相机gameObject的局部空间
在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...
- Oracle 删除用户和表空间////Oracle创建删除用户、角色、表空间、导入导出、...命令总结/////Oracle数据库创建表空间及为用户指定表空间
Oracle 使用时间长了, 新增了许多user 和tablespace. 需要清理一下 对于单个user和tablespace 来说, 可以使用如下命令来完成. 步骤一: 删除user drop ...
- 0xC0000005;Access Violation(栈区空间很宝贵, linux上栈区空间默认为8M,vc6下默认栈空间大小为1M)
写C/C++程序最怕出现这样的提示了,还好是在调试环境下显示出来的,在非调试状态就直接崩溃退出. 从上述汇编代码发现在取内存地址 eax+38h 的值时出错, 那说明这个地址非法呗, 不能访问, 一般 ...
- 【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理
一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data ...
- ORACLE表空间offline谈起,表空间备份恢复
从ORACLE表空间offline谈起,表空间备份恢复将表空间置为offline,可能的原因包括维护.备份恢复等目的:表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL ...
随机推荐
- script 跳出小窗口
sss
- Jira客户端
github地址 https://github.com/rcarz/jira-client 使用 1)私服 <!-- https://mvnrepository.com/artifact/net ...
- VMware环境安装MacOS
环境: win10专业版 VMware 14 Pro 开始吧 1. 停止服务 2. 解压并管理员权限运行unlocker,目的是使得 win10 环境下的 VMWare14Pro 支持 mac 系统的 ...
- Python3 解析excel文件
Python3 解析读取excel文件 一.第三方库 import xlrd 二.代码示例 import xlrd ''' 读取Excel每个sheet的第一列和第二列的值,拼接成json串,写入文件 ...
- mysql不常用但很有用的语句整理
mysqld_multi多实例停止.启动 mysqld_multi --defaults-file=/etc/my.cnf start 1,2 mysqld_multi --defaults-file ...
- 报错ORA-19809 ORA-19804
现象 问题检查 查看群集状态,发现归档挂起 [oracle@jydb1 ~]$ srvctl status database -d orcl -v 查看空间使用情况 #大小查看 SQL> sho ...
- 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 ...
- Windows Shell编程实现重叠图标IconOverlay
转载:https://www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects 转载:h ...
- DPAA1是如何辅助cpu进行网络加速的?
1.为何会出现DPAA1? 1.1 如果没有多核处理器的出现可能就不会出现这个东东了! 1.2 怎么会跟多核处理器扯上关系呢? 1.2.1 先聊聊单核处理器会怎么处理网络包呢? 单核同一时刻只能处理一 ...
- 如何使用jqueryUi的datepicker日历控件?
参考: http://www.jb51.net/article/85007.htm 这里的日历控件是, 基于jquery的jqureyui中的一个 widget. 需要js 文件: 外部的js文件, ...