0

我的问题是我在世界空间中有一个曲面(三个 3D 点),我想旋转它,以便这三个点的法线与另一个平面的法线相同,同时保持原始曲面的“三角形”。

如果“目标”平面的法线为 (0, 0, 1),并且该平面上的点为 (0, 0, 0),“源”点为 [-0.5, -0.5, -0.5] [ -0.5, -0.5, 0.5] [-0.5, 0.5, 0.5],我必须进行什么计算才能旋转这些点以使表面法线变为 (0, 0, 1)?

我尝试使用以下方法“projectPointToPlane”简单地将“源”点“投影”到“目标”平面:

public static Vector3f projectPointToPlane(Vector3f point, Vector3f planePoint, Vector3f planeNormal)
{
    float dot = EEngineUtils.getDotProduct(EEngineUtils.getProjectionVector(point, planePoint), planeNormal);
    return new Vector3f(point.getX()+planeNormal.getX()*-dot, point.getY()+planeNormal.getY()*-dot, point.getZ()+planeNormal.getZ()*-dot);
}

public static Vector3f getProjectionVector(Vector3f to, Vector3f from)
{
    return new Vector3f(to.getX()-from.getX(), to.getY()-from.getY(), to.getZ()-from.getZ());
}

public static float getDotProduct(Vector3f v1, Vector3f v2)
{
    return (v1.getX()*v2.getX())+(v1.getY()*v2.getY())+(v1.getZ()*v2.getZ());
}

但是,我没有得到我希望的结果。例如,以下是源点:

Vector3f[-0.5, -0.5, -0.5] | Vector3f[-0.5, -0.5, 0.5] | Vector3f[-0.5, 0.5, 0.5]

这是投影的结果点:

Vector3f[-0.5, -0.5, 0.0] | Vector3f[-0.5, -0.5, 0.0] | Vector3f[-0.5, 0.5, 0.0]

前两个结果点是相同的,这不是我想要的。我希望生成的“三角形”的形状相同(在本例中为直角三角形)。我的假设是“投影”不是我需要的,而我真正需要的是某种“旋转”,但是我不确定如何实现这一点。

我想过找到两个表面法线之间的角度并将点旋转该角度,但我不知道要使用什么“轴”向量进行旋转。任何帮助,将不胜感激。如果我太含糊,请告诉我。

注意我在 Java 中使用 LWJGL API。

4

2 回答 2

1

使用交叉产品。三角形的当前法线是建立在其顶点上的向量的叉积(归一化后)。旋转轴是平面法线 (0,0,1) 和三角形法线的叉积。旋转角的正弦是最后一个叉积的长度(假设法线被归一化,即法线是单位向量)。

在您的情况下:三角形 A:[-.5,-.5,-.5] B:[-.5,-.5,.5] C:[-.5,.5,.5]

形成这个三角形的向量

AB:[-.5,-.5,.5]-[-.5,-.5,-.5]=[0,0,1]

交流电:[-.5,.5,.5]-[-.5,-.5,-.5]=[0,1,1]

叉积:AB x AC =[-1,0,0],这已经归一化,这是 ABC 三角形的法线

旋转轴:[-1,0,0] x [0,0,1]=[0,1,0]

正弦旋转角度为1,即角度为90度。

旋转角的余弦是法向量 [-1,0,0] 的标量积。[0,0,1]=0,这也给出了 90 度。

于 2013-02-11T13:18:58.750 回答
0

这本质上是一种查看操作,尽管增加了复杂性,即两个法线都不一定指向您的轴之一。

因此,您可以形成两个矩阵,将两个平面沿公共轴定向,然后将一个乘以另一个的倒数(在这种形式下,倒数只是转置,所以它是微不足道的)。

查看矩阵很容易计算,只使用几个叉积和一些归一化。

(如果你的“目标”平面实际上是定向的,它的法线是一个轴,只需直接构建观察矩阵)。

于 2013-02-11T13:06:45.920 回答