Компьютерная графика, помощь с камерой
В курсовом проекте по компьютерной графике необходимо реализовать передвижение камеры (без использования сторонних библиотек 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]);
}
}