TA的每日心情 | 开心 2020-3-20 17:50 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
楼主 |
发表于 2020-3-27 14:19:50
|
显示全部楼层
本帖最后由 liyihongcug 于 2020-4-1 20:41 编辑
A点绕B点旋转的 思路 。BS必须考虑neu。 osg极少考虑这个,他的局部坐标系也是全局笛卡尔坐标
多维向量:
向量之间的点积(数量积/内积)两个向量分量乘积之和,结果为一个标量
向量之间的叉积(向量积)结果为一个垂直于原向量的新向量
例子:
osg::Vec3 v1;
v1.set(1.0, 1.0, 0.0);// 设置向量值
v1.normalize();//向量归一化处理
float x = v1[0];//获取分量值
osg::Vec3 v2(2.0, 5.0, 8.0);//通过构造函数赋值
v2 *= 0.5;//向量的数乘
v2 = osg::Vec3(1.0, 0.0, -2.0) - v2;//向量的四则运算
float distance = (v1-v2).length();//求取两向量的距离(和向量的模) set(), ptr(), length(), normalize()
float dotProduct = v1*v2;//向量点乘
osg::Vec3 crossProduct = v1 ^ v2;//向量叉乘
osg::Vec4 vec(1.0, 1.0, 0.0, 1.0);
float w = vec[3];
或者
float w = vec.w();
四元数和欧拉角:
四元数:由3个复数和1个实数组成的复杂数字。
欧拉角度旋转:沿直角坐标轴旋转分量之和。
比较:欧拉需要计算3个旋转分量的作用之和,沿俯仰(Pitch),沿航向(Heading),沿翻滚(Roll)
而四元数只需要对旋转轴V和旋转角度进行设置。
OSG中使用Quat类表达四元数
osg:uat类:
Quat()//构造函数,构造一个没有旋转的四元数
Quat(double x, double y, double z, double w)//构造函数,直接设置四元数的四个分量
Quat(float angle, const Vec3f& axis)//构造函数,使四元数沿某个向量轴旋转一定角度。
const Quat operator*(const Quat&)const Quat& operator* =(const Quat&)//将两个四元数相 乘,相当于两个旋转动作叠加
void makeRotate(double angle, double x,double y, double z)
或 //使四元数沿一定角度旋转,并据此设置四元数的值
void makeRotate(double angle,const Vec3f& vec)
void makeRotate(const Vec3f& vec1, const Vec3f& vec2)//使四元数从轴vec1旋转到轴vec2,并 据此设置四元数的值
例子:一个四元数沿x轴逆时针旋转90度
osg::Quat quat(osg:I_2, osg::Vec3(1.0, 1.0, 0.0));
// osg::PI_2是OSG预定义宏,表示数学上的π/2
直接使用角度值而不需要用弧度来表示角度
osg::Quat quat(osg:egreesToRadians(90.0), osg::Vec3(1.0, 1.0, 0.0));
绕某个轴旋转的四元数quat1 和绕另一个轴旋转的四元数quat2,相乘得到新的四元数,它表示这两个旋转结果的叠加之和
osg::Quat quat3 = quat1 * quat2;//表示这两个旋转结果的叠加之和
将某个四元数quat中包含的旋转动作内容读出来:
osg::Vec3 vec;
double angle;
quat.getRotate(angle,vec);
double degree = osg::RadiansToDegrees(angle);
//可以得到四元数表达的旋转轴vec
//以及绕这个轴旋转的旋转角度degree,其中使用了弧度制转换角度值函数osg::RadiansToDegrees()
osg指定向量旋转指定角度
向量AB,沿着n旋转10度
osg::Vec3 left = AB*osg::Matrix::rotate(osg::inDegrees(10), n);
osg::Vec3 right = AB*osg::Matrix::rotate(osg::inDegrees(-10), n);//right=-left
特殊情况下,可以使用向量叉乘实现,例如旋转90度
osg::Vec3 left = n^AB;
osg::Vec3 right = AB^n;
|
|