首先感谢您查看我的帖子,我会尽可能详细地解释我的问题。
我正在尝试构建一个简单的光线追踪器,当我尝试将光线从我的屏幕投射到世界时,我得到了一些奇怪的结果。
我有以下相机矩阵:
#define deg2rad( d ) ((float)((d)*PI/180.0f))
#define FOV 60
void Camera::buildPerspective( void )
{
float _near = 1.0f;
float _far = 100.0f;
float scale = 1.0 / tan(deg2rad(FOV * 0.5f));
perspective = Matrix4(
scale, 0, 0, 0,
0, scale, 0, 0,
0, 0, -_far / (_far - _near), -1,
0, 0, -_far * _near / (_far - _near), 0 );
}
void Camera::buildScreen( void )
{
float DIM_over_2 = DIM / 2.0f;
screen = Matrix4( DIM_over_2, 0.0f, 0.0f, DIM_over_2,
0.0f, -DIM_over_2, 0.0f, DIM_over_2,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
}
void Camera::buildView( void )
{
Matrix4 inv_translate( Matrix4::createTranslation( -pos.x, -pos.y, -pos.z ) );
Matrix4 rotation = Matrix4::createTranspose( Matrix4::createFromYawPitchRoll( rot.y, rot.x, rot.z ) );
view = inv_translate * rotation;
}
然后我有以下代码可以取消项目:
Vertex rayOrigin(*eye);
Vector3 rayDir;
float normalised_x = 2.0f * x / DIM - 1.0f;
float normalised_y = 2.0f * y / DIM - 1.0f;
Matrix4 unviewMat = *screen * *perspective;
Vertex near_point = unviewMat * Vertex (normalised_x, normalised_y, 0, 1);
near_point = *view * near_point;
rayDir = near_point - rayOrigin;
这给了我以下结果,它应该是一个立方体,当相机绕 y 轴旋转 45 度时查看它:
谁能看到我哪里出错了?我将非常感谢您的帮助!