如何旋转点而不移动它们?

时间:2014-09-14 09:12:55

标签: java c++ opengl math directx

我需要旋转一个三角形,使其位于由法线n和常数d给出的平面上。 enter image description here

我有两个三角形所在平面的正常n1。现在我需要旋转右边的红色三角形,这样才能产生橙色三角形。 三角形和法线的点存储为三维矢量。 到现在为止,我做了以下事情:

  • 在n1和n2之间获取规范化的旋转四元数(rotQuat)。
  • 将四角形的每个点乘以四元数。因此,我将点转换为四元数(point.x,point.y,point.z,0)并按如下方式进行乘法:resultQuat = rotQuat * point * conjugate(rotQuat)。然后我将结果的x,y和z应用到这一点。

这就是我如何得到两个向量之间的旋转:

public static Quaternion getRotationBetweenTwoVector3f(Vector3f vec1, Vector3f vec2)
{
    Vector3f cross = Vector3f.cross(vec1, vec2);
    float w = (float) (java.lang.Math.sqrt(java.lang.Math.pow(vec1.getLength(), 2) * java.lang.Math.pow(vec2.getLength(), 2)) + Vector3f.dot(vec1, vec2));
    Quaternion returnQuat = new Quaternion(cross.x, cross.y, cross.z, w);
    returnQuat.normalize();
    return returnQuat;
}

问题是旋转后三角形的方向是正确的,但三角形也会移动它的位置。我需要一个旋转三角形的旋转,使它仍然连接到左红色三角形的两个点(就像橙色三角形一样)。 这怎么可能?

1 个答案:

答案 0 :(得分:1)

您的问题是旋转矩阵/四元数围绕穿过原点的轴旋转点。要围绕与原点不同的点旋转,您需要将三角形点转换为原点(只需从三角形点中减去旋转点值),然后乘以四元数然后平移回来。

因此算法变为:

  • translatedPoints [i] = triPoints [i] - rotationPoint;
  • translatedPoints使用四元数
  • 旋转
  • 通过添加旋转点值将translatePoints翻译回来。