因此,我决定重写一个用 C++ 编写的旧光线追踪器,并利用 XNA 框架在 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]
我还记得一些关于视图矩阵如何被转置和倒置的事情,因为它是正交的。