9

Java で独自のソフトウェア ラスタライザーを作成していますが、問題が発生しました...サンプル画像を見てください。

画像

このサンプルは、単純な正方形のグリッドを平面上に描画するだけです。いくつかのポイントが背後に移動するのに十分なほどカメラを近づけるまで、すべてが正常に機能します。その後、ご覧のとおり、それらは正しく投影されなくなります (垂直線 - カメラの後ろにあるはずの点が画面の上に投影されます)。

私の変換行列とベクトルは、DirectX が使用しているものと同じです (投影には PerspectiveFovLH、カメラには LookAtLH)。

次の変換方​​法を使用して、3D ポイントを投影しています。

  1. 変換する 3D ベクトルが作成されます。
  2. ベクトルに ViewProjection 行列を掛けます。
  3. その後、次のメソッドを使用してポイントをスクリーンに変換します。

    // 'vector' is input vector in projection space
    // projection to screen
    double vX = vector.x / vector.z;        
    double vY = vector.y / vector.z;
    
    //translate
    //surfaceW is width and surfaceH is height of the rendering window.
    vX = (( vX + 1.0f) / 2.0f) * surfaceW;
    vY = ((-vY + 1.0f) / 2.0f) * surfaceH;
    
    return new Vector3(vX, vY, vector.z);
    

先に言ったように、ポイントがカメラの後ろに移動するまでは問題なく動作します。実際には、ポイントがカメラの後ろにあるときを把握できます (最終的な変換後に Z 値をテストすることにより) が、線やその他の線ベースのオブジェクトを描画しているため、そのポイントをスキップすることはできません。

次に、MSDNの The Direct3D Transformation Pipeline の記事に従って、変換パイプラインを設定してみました。

残念ながら、私もそれで運が良かったわけではありません(同じ結果)。

ありがとうございました。

よろしく、アレックス

4

1 に答える 1

10

線を3D空間で前面のクリッピング平面と交差させ、線を切り捨てて、表示されている線分のみを描画する必要があります。

             |
             |
             |
x------------+-----------o
             |
             |
             |   * - camera
             |
             |
             |
       clipping plane

クリッピングプレーンの前と後ろに線xoがあります。この線をクリッピング平面と交差させて、点を生成します。とがどちらが表示されているかがわかっているので、からに線を引きます。xo+xox+

このようにして、カメラの後ろにあるポイントを投影しません。

于 2010-07-26T20:05:25.677 に答える