任意のカメラ位置/方向から対応する光線方向にピクセル座標を転送するためのより良い方法(またはこれが最良の方法であることに注意してください)を探しています。
私の現在の方法は次のとおりです。私は「カメラ」を位置ベクトル、ルックアットベクトル、アップベクトルとして定義します。(lookatベクトルは、カメラが向いている方向の単位ベクトルであり、XNAのMatrix.CreateLookAtの標準のように、(position --lookat)が方向ではないことに注意してください)これらの3つのベクトルは、カメラの位置を一意に定義できます。これが実際のコードです(実際には、実際の単純化された抽象化バージョンではありません)(言語はHLSLです)
float xPixelCoordShifted = (xPixelCoord / screenWidth * 2 - 1) * aspectRatio;
float yPixelCoordShifted = yPixelCoord / screenHeight * 2 - 1;
float3 right = cross(lookat, up);
float3 actualUp = cross(right, lookat);
float3 rightShift = mul(right, xPixelCoordShifted);
float3 upShift = mul(actualUp, yPixelCoordShifted);
return normalize(lookat + rightShift + upShift);
(戻り値は光線の方向です)
だから私が求めているのはこれです-これを行うためのより良い方法は、おそらくマトリックスなどを使用することです。この方法の問題は、視野角が広すぎると、画面の端が「放射状に伸びる」ようなものになることです。 "。