0

私の問題は、元のサーフェスの「三角形の形状」を維持しながら、これら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を使用していることに注意してください。

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]

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 度になります。

于 2013-02-11T13:18:58.750 に答える
0

これは基本的にルックアット操作ですが、いずれの法線も必ずしも軸の 1 つを下に向けていないという複雑さが追加されています。

したがって、2 つの平面を共通の軸に沿って配置し、一方を他方の逆数で乗算する 2 つの行列を形成できます (この形式では、逆数は単なる転置であるため、自明です)。

ルックアット行列は、クロス積と正規化をいくつか使用するだけで簡単に計算できます。

(「宛先」プレーンが実際にその法線が軸になるように方向付けられている場合は、ルックアット マトリックスを直接構築するだけです)。

于 2013-02-11T13:06:45.920 に答える