そこで、XNAフレームワークを利用して、C ++で記述された古いレイトレーサーをC#で書き直すことにしました。
私はまだ古い本を持っていて、メモに従うことができますが、いくつかのアイデアについて混乱していて、誰かがそれをうまく表現できるかどうか疑問に思いました。
for each x pixel do
for each y pixel do
//Generate Ray
//1 - Calculate world coordinates of current pixel
//1.1 Calculate Normalized Device coordinates for current pixel 1- to -1 (u, v)
u = (2*x/ WIDTH) - 1 ;
v = (2*y/HEIGHT) - 1 ;
Vector3 rayDirection = -1*focalLength + u'*u + v'*v
上記のコードでは、u'とv'は、特定のカメラに対して計算された通常の基準です(同じ名前で混乱することはわかっています)
私がその本をたどって、それが表現する方法でそれをするならば、それはうまくいきます。ただし、XNAを活用しようとしていて、同じアクションを実行する方法について混乱していますが、マトリックスを使用しています。
だから私は次の手順をXNAコードに置き換えようとしました
class Camera
{
public Camera(float width, float height)
{
AspectRatio = width/height;
FOV = Math.PI / 2.0f;
NearPlane = 1.0f;
FarPlane = 100.0f;
ViewMatrix = Matrix.CreateLookAt(Position, Direction,this.Up);
ProjectionMatrix=Matrix.CreatePerspectiveFieldOfView(FOV,
AspectRatio,NearPlane,FarPlane);
}
}
この時点で、任意のピクセル(x、y)の方向ベクトルを取得するために適用することになっている操作の順序が混乱していますか?
私の頭の中で考えているのは:(u、v)= ProjectionMatrix * ViewMatrix * ModelToWorld * Vertex(モデル空間内)
したがって、それは理にかなっています
頂点(ワールド空間内)= Inverse(ViewMatrix)* Inverse(ProjectionMatrix)* [u、v、0]
また、ビューマトリックスは正規直交であるため、転置および反転する方法についても思い出しました。