Компьютерная графика, помощь с камерой

В курсовом проекте по компьютерной графике необходимо реализовать передвижение камеры (без использования сторонних библиотек opengl).

Реализован z-буфер для отрисовки 3D объектов, но не получается добавить адекватную камеру, которая на wasds передвигается и на ijkl поворачивается в стороны.

Переписал класс камеры по гайду и переписал lookat и perspective с glm библиотеки, но теперь не получается прикрутить это дело к своему z буферу (может быть проблема с масштабированием точек модели).

Методы класса камеры:

class CameraNew
{
private:
    Vector3f mPos;    // Позиция
    Vector3f mView;   // Взгляд
    Vector3f mUp;     // Вектор вверх
    Vector3f mStrafe; // Вектор для движения вбок (как я понял)

...

Matrix CameraNew::lookAt()
{
    Vector3f f = Vector3f(mPos - mView).normalize();
    Vector3f s = Vector3f(cross(f, mUp)).normalize();
    Vector3f u = Vector3f(cross(s, f));

    Matrix result = Matrix::identity(4);

    result[0][0] = s.x;
    result[1][0] = s.y;
    result[2][0] = s.z;

    result[0][1] = u.x;
    result[1][1] = u.y;
    result[2][1] = u.z;

    result[0][2] = -f.x;
    result[1][2] = -f.y;
    result[2][2] = -f.z;

    result[3][0] = -(s * mPos);
    result[3][1] = -(u * mPos);
    result[3][2] =  (f * mPos);

    return result;
}

Matrix CameraNew::perspective(float fovy, float aspect, float zNear, float zFar)
{
    float rad = (fovy / 2) * M_PI / 180;
    float tanHalfFovy = tan(rad);

    Matrix result = Matrix();
    result.fill(0.0f);

    result[0][0] = static_cast<float>(1) / (aspect * tanHalfFovy);
    result[1][1] = static_cast<float>(1) / (tanHalfFovy);
    result[2][2] = - (zFar + zNear) / (zFar - zNear);
    result[2][3] = - static_cast<float>(1);
    result[3][2] = - (static_cast<float>(2) * zFar * zNear) / (zFar - zNear);

    return result;
}

И сам отрисовщик:

void Drawer::drawObjects(Model& currentModel)
{
    Matrix projection = camera.perspective(45, (float)w/(float)h, 0.1f, 100.0f);
    Matrix view       = camera.lookAt();
    Matrix model      = Matrix::identity(4);

    Matrix mvp        = projection * viewport * model;

    for (int i = 0; i < currentModel.getFacesCount(); i++)
    {
        std::vector<int> face = currentModel.face(i);

        Vector3f screenCoords[3];
        Vector3f worldCoords[3];

        float intensity[3];

        for (int j = 0; j < 3; j++)
        {
            Vector3f v = currentModel.vert(face[j]);

            // Расчёт интенсивности
            intensity[j] = getIntensity(v, currentModel.norm(i, j));

            screenCoords[j] = mvp * Matrix(v);
        }

        // Реализация z буфера
        triangleProcessing(screenCoords[0], screenCoords[1], screenCoords[2],
            currentModel.getColor(), intensity[0], intensity[1], intensity[2]);
    }
}

Ответы (0 шт):