我的问题是我在世界空间中有一个表面(三个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。
答案 0 :(得分: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]
AC:[ - 。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度。
答案 1 :(得分:0)
这实际上是一个观察操作,但增加的复杂性是,两个法线都不一定指向你的一个轴。
所以你可以形成两个矩阵,它们将两个平面沿公共轴定向,然后将一个乘以另一个的倒数(并且在这种形式中,逆只是转置,所以它将是微不足道的)
只使用几个交叉积和一些规范化,很容易计算一个查看矩阵。
(如果您的'目标'平面实际定向,使其法线为轴,只需直接构建外观矩阵。)