私の問題は、元のサーフェスの「三角形の形状」を維持しながら、これら3つのポイントの結果の法線が別の平面の法線と同じになるように回転させたいサーフェス(3つの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]
結果として得られる最初の2つのポイントは同じですが、これは私が望んでいたことではありません。結果の「三角形」の形状を同じにしたかったのです(この場合は直角三角形)。私の仮定では、「投影」は私が必要とするものではなく、私が本当に必要とするのはある種の「回転」ですが、これをどのように達成するかはわかりません。
2つのサーフェス法線間の角度を見つけて、その角度でポイントを回転させることを考えましたが、回転に使用する「軸」ベクトルがわかりません。どんな助けでもいただければ幸いです。漠然としすぎている場合はお知らせください。
JavaでLWJGLAPIを使用していることに注意してください。