我的问题是我在世界空间中有一个曲面(三个 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。