【问题标题】:How to rotate points without moving them?如何在不移动点的情况下旋转点?
【发布时间】:2014-09-14 09:12:54
【问题描述】:

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

我有两个三角形所在平面的法线 n1。现在我需要旋转右侧的红色三角形,使其产生橙色的三角形。 三角形的点和法线存储为 3 维向量。 到目前为止,我做了以下工作:

  • 获取 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;
}

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

【问题讨论】:

  • 之后只进行简单的翻译?这基本上是任何运动的组成部分:旋转+平移。

标签: java c++ opengl math directx


【解决方案1】:

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

所以算法变成:

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

【讨论】:

  • 我认为如果你这样做聪明,你可以跳过翻译步骤。
  • @Bernhard 你能进一步解释一下吗?
  • 所以,如果我理解正确,我必须将三角形共享的 2 个点之一作为我的旋转点?我试过了,但它弄乱了旋转点。 rotationPoint 就是我旋转的轴所经过的点,对吧?
  • @concept3d 好吧,您需要旋转一圈来对齐法线。之后,一个翻译就足以对齐来源。
  • @Bernhard 你仍然需要我提到的额外翻译来围绕你的自定义旋转点进行实际旋转。
猜你喜欢
  • 2015-10-12
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2021-04-07
相关资源
最近更新 更多