【发布时间】:2014-02-17 12:12:58
【问题描述】:
我有两个对象,每个对象都有两个向量:
- 法线向量
- 向上向量
喜欢这张图片:
上向量垂直于法向量。现在我想找到从一个对象到另一个对象的唯一旋转,该怎么做?
我有一种方法可以找到一个向量到另一个向量之间的旋转,并且它有效。问题是我需要注意两个向量:法线向量和向上向量。如果我使用这种方法将法线向量从对象一旋转到法线从对象二,向上向量可能指向错误的方向,它们需要平行。
这是寻找最短旋转的代码:
GE::Quat GE::Quat::fromTo(const Vector3 &v1, const Vector3 &v2)
{
Vector3 a = Vector3::cross(v1, v2);
Quat q;
float dot = Vector3::dot(v1, v2);
if ( dot >= 1 )
{
q = Quat(0,0,0,1);
}
else if ( dot < -0.999999 )
{
Vector3 axis = Vector3::cross(Vector3(1,0,0),v2);
if (axis.length() == 0) // pick another if colinear
axis = Vector3::cross(Vector3(0,1,0),v2);
axis.normalize();
q = Quat::axisToQuat(axis,180);
}
else
{
float s = sqrt( (1+dot)*2 );
float invs = 1 / s;
Vector3 c = Vector3::cross(v1, v2);
q.x = c.x * invs;
q.y = c.y * invs;
q.z = c.z * invs;
q.w = s * 0.5f;
}
q.normalize();
return q;
}
为了找到正确的旋转,我应该更改/添加到此代码中的哪些内容?
【问题讨论】:
-
对不起,如果这是一个愚蠢的问题,但“最短轮换”和“唯一轮换”有什么区别?
-
也许我没有说清楚,抱歉。我只想将法线向量旋转到其他法线向量,但向上向量也必须正确。如果我使用发布的这个方法,它只会旋转一个向量,因此向上的向量可能指向错误的方向,但我需要它是相同的方向。对不起我的英语
-
@Proxy 我编辑了我的问题,也许现在更清楚了
-
您是否希望生成的旋转 (a) 旋转一个对象,使其与另一个对象平行,或者 (b) 将第一个对象位置旋转到围绕某个原点的第二个对象位置?
-
我只想要一个旋转对象一的法线向量将平行于对象二的法线向量,并且对象一的向量向上将平行于对象二的向量:) 所以选项(a )
标签: c++ opengl rotation quaternions