Я правильно вычисляю атрибуты моего усеченного конуса?

У меня есть базовый класс камеры, из которых имеет следующие заметные функции:

    // 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, Контекст, на который я ссылаюсь, включает использование этих базисных векторов в сочетании с отбраковкой усеченного конуса.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …