У меня возникли некоторые проблемы с камерой, когда ближняя плоскость кажется слишком далекой, даже если она установлена на 0,1 или ниже. Кажется, уже есть какое-то значение смещения. Таким образом, вы не можете подобраться достаточно близко к произвольному объекту на сцене.
Ниже приведен внешний вид ошибки.
Показанный черный треугольник — отсечение.
В настоящее время я использую матрицу перспективы, и вот код для этого.
Matrix4x4 Matrix4x4::Perspective(Float fov, Float aspectRatio, Float near, Float far)
{
Matrix4x4 result(1.0f);
Float q = 1.0f / tan(toRadians(0.5f * fov));
Float a = q / aspectRatio;
Float b = (near + far) / (near - far);
Float c = (2.0f * near * far) / (near - far);
result.elements[0 + 0 * 4] = a;
result.elements[1 + 1 * 4] = q;
result.elements[2 + 2 * 4] = b;
result.elements[2 + 3 * 4] = -1.0f;
result.elements[3 + 2 * 4] = c;
return result;
}
Я не чувствую, что ошибка из класса математики. Это потому, что математический код в основном из другого проекта, над которым я работал. И отлично работает оттуда.
Я также не подозреваю, что это так, как я рендеринг (forward renderer). Я считаю, что мои указатели для этого хороши, так как я могу перемещать и поворачивать камеру с помощью мыши и клавиатуры.
Но! Я подозреваю, что это буферы. Буферы OpenGL. Но я не совсем уверен.
Я надеюсь, что кто-то даст мне несколько советов о том, как я могу выследить и устранить эту ошибку.
Заранее спасибо.
Ну, одно изображение стоит больше, чем 1000 слов, поэтому:
Как я уже упоминал в моих комментариях, если ваш куб наполовину меньше r=1.0
и вы установили камеру на расстоянии r
из центра куба вы все равно будете отрезаны z_near
как края куба удалены от центра в диапазоне <sqrt(2),sqrt(3)>
так что все края, повернутые к камере, обрезаются …
Но также, как уже упоминалось, это только предположение, потому что вы не предоставили никаких тестовых данных, относящихся к этому (матрицы и содержимое сетки) …
PS на правой стороне — вид сбоку настроек вашей камеры. Я предполагаю, что вы установили. Зеленый (+/-)Z
это ваше направление просмотра.
«glEnable (GL_DEPTH_CLAMP)» решил проблему