Вы получили этот код на этой вики-странице: http://www.opengl.org/wiki/GluPerspective_code случайно?
Почему он создает temp, temp2, temp3 и temp4?
Да, неиспользуемые переменные. Скорее всего скопировано из реализации glhFrustumf2
.
Почему там закомментированный код? Я полагаю, это для указания некоторых параметров glFrustum.
Да, наверное, чтобы объяснить значения параметров, передаваемых в функцию glhFrustumf2
.
Но тогда почему xmin = -ymax * aspectRatio; а не xmin=-max;
Да, xmin = -xmax
правильно и позволяет избежать дублирования.
Я обычно использую аналогичный подход: перспектива реализуется в терминах усеченной пирамиды, а сама усеченная пирамида реализуется в терминах простой установки всех коэффициентов матрицы (это позволяет скрыть формат хранения, т. е. по строкам или по столбцам). Кроме того, наличие тех же соглашений об именах для параметров, что и на справочных страницах OpenGL, очень помогает, когда вам позже понадобится обратиться к коду.
void
setPerspectiveMatrix4x4f(float fovy, float aspect, float zNear, float zFar, float* m)
{
const float bottom = -zNear * tanf(0.5f * fovy * M_PI / 180.0f);
const float top = -bottom;
const float left = aspect * bottom;
const float right = -left;
setFrustumMatrix4x4f(left, right, bottom, top zNear, zFar, m);
}
void
setFrustumMatrix4x4f(float left, float right, float bottom, float top, float zNear, float zFar, float* m)
{
const float dx = right - left;
const float dy = top - bottom;
const float dz = zFar - zNear;
const float mx = 0.5f * (left + right);
const float my = 0.5f * (bottom + top);
const float mz = 0.5f * (zNear + zFar);
const float n = zNear;
const float nf = zNear * zFar;
setMatrix4x4f(2.0f * n / dx, 0.0f, 2.0f * mx / dx, 0.0f,
0.0f, 2.0f * n / dy, 2.0f * my / dy, 0.0f,
0.0f, 0.0f, -2.0f * mz / dz, -2.0f * nf / dz,
0.0f, 0.0f, -1.0f, 0.0f,
m);
}
void
setMatrix4x4f(float m00, float m01, float m02, float m03,
float m10, float m11, float m12, float m13,
float m20, float m21, float m22, float m23,
float m30, float m31, float m32, float m33,
float* m)
{
// Fill m with m00, ... in row-major or column-major order
}
person
user3146587
schedule
11.01.2014