2016-04-08 10 views
1

私が理解しているように、投影行列は、カメラからどれだけ遠く離れているかに応じて多角形を拡大/縮小します。私は完全に間違っているかもしれませんが。 私の質問は、マトリックスが "スケール"ポリゴンと仮定されているときに、カメラが動くにつれて、投影行列が「cube」の辺をどのように表示するかを「知っていますか?投影行列はスケーリング以上の効果をもたらしますか?

注意イメージ内のキューブは、カメラを左に動かすことによって画面の右側にあります。立方体を中心にするためにカメラを反対方向(右方向)に動かすと、立方体の側面が期待通りに消えます。

private void createProjectionMatrix(){ 
     float aspectRatio = (float) Display.getWidth()/(float) Display.getHeight();   
     float y_scale = (float) ((1f/Math.tan(Math.toRadians(FOV/2f))) * aspectRatio);   
     float x_scale = y_scale/aspectRatio;   
     float frustum_length = FAR_PLANE - NEAR_PLANE;     
     projectionMatrix = new Matrix4f(); 
     projectionMatrix.m00 = x_scale;   
     projectionMatrix.m11 = y_scale;   
     projectionMatrix.m22 = -((FAR_PLANE + NEAR_PLANE)/frustum_length);   
     projectionMatrix.m23 = -1;   
     projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE)/frustum_length);   
     projectionMatrix.m33 = 0; 
} 

答えて

2

(OpenGLなどグラフィックスAPIのコンテキストで)投影行列の関数がクリップ空間にビュー空間から頂点位置を変換することである。

はここに私のマトリックスコードです。

通常、クリップスペースは単位ボックスです(D3Dでは半ボックスボックスです)。クリップ空間に変換された後の頂点位置がその単位ボックス内にない場合は、クリップされます。これは基本的に、システムがどのようにしてキューブが画面上に見えるかを知る方法です。

+0

これは、キューブがまだ画面に表示されていると答えていますが、カメラが動いたときにキューブの位置を更新する方法には答えません。おそらくあなたはさらに説明したり、視覚的な詳細を提供することができますか? – reddish

+0

私はあなたのプログラムを持っていないので、ビジュアルを提供することはかなり不可能です... 'カメラ'の動きは、一般に投影行列ではなく、表示行列によって処理されます。通常は、オブジェクトがクリップ空間でどのように終わるかを決定する3つの行列があります。モデル行列(オブジェクト内のオブジェクトの向きと位置)、ビュー行列(方向、カメラの位置) (カメラの視界がどのように投影されているか)を示します。ビューが変更された場合、クリップ空間内のキューブの位置が変更されます。変更が十分に大きければ、クリップボックスの外にある可能性があります。 – MuertoExcobito

+0

ご返信ありがとうございます。しかし、他のすべてのマトリックスを無効にしても、上記の三角形の辺はまだ正しくレンダリングされています。キューブの辺を表示/非表示するための投影行列の「方法」を知りたいだけです。 – reddish

関連する問題