我对gluPerspective功能感到好奇。当我看到这个函数的代码很乱时,我正在为我的引擎翻译代码。
void glhPerspectivef2(float *matrix, float fovyInDegrees, float aspectRatio,
float znear, float zfar)
{
float ymax, xmax;
float temp, temp2, temp3, temp4;
ymax = znear * tanf(fovyInDegrees * M_PI / 360.0);
//ymin = -ymax;
//xmin = -ymax * aspectRatio;
xmax = ymax * aspectRatio;
glhFrustumf2(matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
}
为什么要创建temp,temp2,temp3和temp4?为什么有评论代码?我想是指定一些glFrustum的参数。但是,为什么呢 xmin = -ymax * aspectRatio; 并不是 xmin = -max;
答案 0 :(得分:1)
您是否在此维基页面上获得了此代码: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
}
答案 1 :(得分:-1)
我不知道你从哪里获得这个功能......但是如果你真的想要计算一个透视矩阵,你可以这样做。
以下m
定义为float m[16];
且zero()
函数将m
中的所有浮点数设置为0.0f
void perspective(const float &fovy, const float &aspect, const float &zNear, const float &zFar)
{
float range = tanf(fovy / 2.0f) * zNear;
float sx = (2.0f * zNear) / (range * aspect + range * aspect);
float sy = zNear / range;
float sz = -(zFar + zNear) / (zFar - zNear);
float pz = -(2.0f * zFar * zNear) / (zFar - zNear);
zero();
m[0] = sx;
m[5] = sy;
m[10] = sz;
m[14] = pz;
m[11] = -1.0f;
}