[原][数学][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 ...
随机推荐
- P2233 [HNOI2002]公交车路线
洛咕原题 dp->矩阵乘法 首先我们可以得出一个状态转移方程 f[i][j]=f[i-1][j-1]+f[i-1][j+1] 蓝后发现,我们可以把这转化为一个8*8的转移矩阵 然后跑一遍矩阵快速 ...
- 如何通过 Vue+Webpack 来做通用的前端组件化架构设计
目录: 1. 架构选型 2. 架构目录介绍 3. 架构说明 4. 招聘消息 目前如果要说比较流行的前端架构哪家强,屈指可数:reactjs.angularjs.emberj ...
- rocketmq消息重复推送的问题
最近,在公司的测试环境,遇到个问题,每次重启应用重启后,原来消费过的消息又被重复推送了一遍,消费者和生产者代码如下: package com.tf56.queue.client; import jav ...
- UVa Live 4670 Dominating Patterns - Aho-Corasick自动机
题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...
- 动态规划之140 Word Break2
这是一题不太明显的动态规划,主要考察的应该是深度优先搜索. static LinkedList<String> list = new LinkedList<String>(); ...
- [内核驱动] DOS路径转化为NT路径
转载:http://blog.csdn.net/qq_33504040/article/details/78468278 最近在做一个文件过滤驱动程序,禁止访问指定目录或文件.想要从R3给R0发命令和 ...
- Python3基础 list for+continue 输出1-50之间的偶数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 修改userdata的分区大小【转】
本文转载自:https://blog.csdn.net/mike8825/article/details/49833833 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- hihoCoder week20 线段树的区间修改
区间修改 区间查询 最后一场比赛前的无可救药的热身 #include <bits/stdc++.h> using namespace std; #define mid ((l+r)/2) ...
- 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)
深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO) 2018-07-17 16:54:51 Reference: https://b ...