1

Java でパースペクティブ ビューの変換を行うにはどうすればよいですか? 私が理解しているように、FOV、アスペクト比、および近距離と遠距離の表示距離を決定するために使用できる魔法の 4 次元マトリックスがいくつかありますが、そのマトリックスを作成する方法がわかりません。

Java で「PerspectiveTransform」を実装できますが、次を使用しても効果がありません。

double mat[][] = {
    {1, 0, 0, 0}, 
    {0, 1, 0, 0},
    {0, 0, 1, 0},
    {0, 0, 1, 0}};
PerspectiveTransform ps = new PerspectiveTransform(mat);
ps.transform(p1, p1);
ps.transform(p2, p2);
ps.transform(p3, p3);
ps.transform(p4, p4);

一番下の「1」は「d」が距離である 1/d である必要があるかもしれないことは理解していますが、どのような数値を試しても効果がありません。他の数値を変更しても効果はありますが、試してみるまでどのような効果があるかはわかりません (無限に推測することはできません)。私は認識しており、「quadToQuad」関数を機能させることができましたが、使用する「quad」を推測する必要があります。

そのため、FOV、アスペクト比、距離などに基づいて必要なマトリックスを作成する方法を説明するリソースが必要です。「Interactive Computer Graphics」第 5 版の関連部分を読みました。エドワード・エンジェルによって、それを理解していません。

私がやろうとしているのは、鳥瞰図の画像を人間の視点の画像に変換することです。この例は、Google Earth を使用するときに見ることができます。

ありがとう

4

1 に答える 1

1

ps.transform(p2, p2) を実行すると、引数として p1 を使用して同じ命令の効果がキャンセルされる可能性がありますが、それにもかかわらず、その行列の位置の一般的な意味は次のとおりです。

代替テキスト
(ソース: google.com )

このリンクは、これで少し手を貸してくれるかもしれません。
また、こちらの「投影変換の設定」セクションで、視野の計算方法を確認できます。

あなたの場合、マトリックスの最後の行を 0 0 0 1 に設定する必要があると思います。また、同じリンクで説明されている式を使用して、視野を計算できます。

void VerticalFieldOfView(float degrees, float aspectRatio, 
                         float near, float far)
{
   float top = near * std::tan(degrees * Pi / 360.0f);
   float bottom = -top;
   float left = bottom * aspectRatio;
   float right = top * aspectRatio;

   glFrustum(left, right, bottom, top, near, far);
}

「glFrustum(...)」の場所

void ApplyFrustum(float left, float right, float bottom, 
                  float top, float near, float far)
{
    float a = 2 * near / (right - left);
    float b = 2 * near / (top - bottom);
    float c = (right + left) / (right - left);
    float d = (top + bottom) / (top - bottom);
    float e = - (far + near) / (far - near);
    float f = -2 * far * near / (far - near);

    mat4 m;
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0;
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0;
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1;
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1;

    glUniformMatrix4fv(projectionUniform, 1, 0, m.Pointer());
}

例は C++ で書かれていますが、これを 2 つの Java 関数に変換し、対応するメソッドを使用して最後に行列を均一にするだけです。

于 2010-06-28T17:57:47.303 に答える