Поэтому я начал делать свой собственный двигатель, и моя ось Z была направлена в сторону от моей камеры. Я не знаю, почему это произошло, я последовал этот урок довольно много.
Я опубликую persprojection а также Посмотреть расчеты моей камеры, пожалуйста, прокомментируйте, какой другой код я должен опубликовать, и я обновлю свой пост.
PersProjection
void Camera::setPerspective(float width, float height, float nearZ, float farZ, float angleDeg) {
perspectiveTrans.toZero();
float ar = width / height;
angleDeg = Math3D::ToRadian(angleDeg);
perspectiveTrans(0, 0) = 1.0f / (ar * tanf(angleDeg / 2.0f));
perspectiveTrans(1, 1) = 1.0f / tanf(angleDeg / 2.0f);
perspectiveTrans(2, 2) = (-nearZ - farZ) / (nearZ - farZ);
perspectiveTrans(2, 3) = (2.0f * farZ * nearZ) / (nearZ - farZ);
perspectiveTrans(3, 2) = 1.0f;
}
Посмотреть а также проекция вычисления
Matrix4x4f Camera::getViewProjection() {
Matrix4x4f cameraRotationTrans(MatrixType::IDENTITY);
Vector3f N = target;
N.normalize();
Vector3f U = up;
U.normalize();
U = U.cross(target);
Vector3f V = N.cross(U);
cameraRotationTrans.setRow(0, Vector4f(U, 0));
cameraRotationTrans.setRow(1, Vector4f(V, 0));
cameraRotationTrans.setRow(2, Vector4f(N, 1));
Matrix4x4f cameraTranslationTrans(MatrixType::IDENTITY);
cameraTranslationTrans.setCol(3, Vector4f(-position, 1));
return perspectiveTrans * cameraRotationTrans * cameraTranslationTrans;
}
Вы пропускаете знак минус в этом выражении:
perspectiveTrans(2, 3) = (2.0f * nearZ * farZ) / -(nearZ - farZ);
Если вы посмотрите соответствующие матричные элементы в документации для glFrustum
, этот матричный элемент:
- (2 * far * near / (far - near)
В вашей записи это:
perspectiveTrans(2, 3) = (-2.0f * nearZ * farZ) / -(nearZ - farZ);
Других решений пока нет …