У меня есть базовый класс камеры, из которых имеет следующие заметные функции:
// Get near and far plane dimensions in view space coordinates.
float GetNearWindowWidth()const;
float GetNearWindowHeight()const;
float GetFarWindowWidth()const;
float GetFarWindowHeight()const;
// Set frustum.
void SetLens(float fovY, float aspect, float zn, float zf);
Где парам zn
а также zf
в SetLens
функция соответствует расстоянию ближнего и дальнего отсечения соответственно.
SetLens
в основном создает матрицу перспективной проекции, а также вычисляет высоту как ближней, так и ближней плоскости отсечения:
void Camera::SetLens(float fovY, float aspect, float zn, float zf)
{
// cache properties
mFovY = fovY;
mAspect = aspect;
mNearZ = zn;
mFarZ = zf;
float tanHalfFovy = tanf( 0.5f * glm::radians( fovY ) );
mNearWindowHeight = 2.0f * mNearZ * tanHalfFovy;
mFarWindowHeight = 2.0f * mFarZ * tanHalfFovy;
mProj = glm::perspective( fovY, aspect, zn, zf );
}
Так, GetFarWindowHeight()
а также GetNearWindowHeight()
естественно возвращать их соответствующие значения члена класса высоты. Их аналоги ширины, однако, возвращают соответствующее значение высоты умноженная по соотношению сторон вида. Таким образом, для GetNearWindowWidth()
:
float Camera::GetNearWindowWidth()const
{
return mAspect * mNearWindowHeight;
}
куда GetFarWindowWidth()
выполняет те же вычисления, конечно, заменяя mNearWindowHeight
с mFarWindowHeight
,
Теперь это все не так, что-то подсказывает мне, что я неправильно вычисляю высоту и ширину ближних и дальних плоскостей отсечения. В частности, я думаю, что причиной этой путаницы является тот факт, что я указываю поле зрения по оси Y в градусах, а затем преобразовываю его в радианы в функции тангенса. Где я считать это вызывает проблемы в моей функции выбраковки, которая использует ширину / высоту ближней и дальней плоскостей, чтобы получить точки для верхней, правой, левой и нижней плоскостей.
Итак, я прав в том, что я делаю это совершенно неправильно? Если так, что я должен сделать, чтобы исправить это?
отказ
Этот код изначально взят из книги D3D11, которую я решил прекратить читать и вернуться к OpenGL. Чтобы сделать процесс менее болезненным, я подумал, что было бы неплохо преобразовать исходный код в более совместимый с OpenGL. До сих пор это работало довольно хорошо, с этой небольшой проблемой …
редактировать
Первоначально я должен был упомянуть несколько вещей:
Это не мой первый раз с OpenGL; Мне хорошо известны процессы преобразования, а также различия в системе координат между GL и D3D.
Это не весь мой класс камеры, хотя единственное, что я думаю может быть сомнительным в этом контексте использует мою камеру mOrientation
матрица для вычисления векторов направления «взгляд», «вверх» и «вправо» путем преобразования каждого из них на основе + x, + y и -z соответственно. Так, в качестве примера, чтобы вычислить мой вектор взгляда, я бы сделал: mOrientation * vec4(0.0f, 0.0f, -1.0f, 1.0f)
, а затем преобразовать это в vec3
, Контекст, на который я ссылаюсь, включает использование этих базисных векторов в сочетании с отбраковкой усеченного конуса.
Задача ещё не решена.
Других решений пока нет …