1

首先感谢您查看我的帖子,我会尽可能详细地解释我的问题。

我正在尝试构建一个简单的光线追踪器,当我尝试将光线从我的屏幕投射到世界时,我得到了一些奇怪的结果。

我有以下相机矩阵:

#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 度时查看它: 在此处输入图像描述

谁能看到我哪里出错了?我将非常感谢您的帮助!

4

0 回答 0