C++ 原始OpenGL透视图的等价物?

C++ 原始OpenGL透视图的等价物?,c++,c,opengl,C++,C,Opengl,如果没有Glu,我怎么能做与Glu相同的事情?谢谢 ex:gluPerspective(45.0,(浮动)w/(浮动)h,1.0200.0) 在文档中解释得相当清楚。您只需建立适当的4x4变换矩阵,并使用glMultMatrix将其乘以当前变换: void myGluPerspective(double fovy, double aspect, double zNear, double zFar) { double f = 1.0 / tan(fovy * M_PI / 360); /

如果没有Glu,我怎么能做与Glu相同的事情?谢谢


ex:gluPerspective(45.0,(浮动)w/(浮动)h,1.0200.0)

在文档中解释得相当清楚。您只需建立适当的4x4变换矩阵,并使用
glMultMatrix
将其乘以当前变换:

void myGluPerspective(double fovy, double aspect, double zNear, double zFar)
{
    double f = 1.0 / tan(fovy * M_PI / 360);  // convert degrees to radians and divide by 2
    double xform[16] =
    {
        f / aspect, 0, 0, 0,
        0,          f, 0, 0,
        0,          0, (zFar + zNear)/(zNear - zFar), -1,
        0,          0, 2*zFar*zNear/(zNear - zFar), 0
    };
    glMultMatrixd(xform);
}

请注意,OpenGL以列的主要顺序存储矩阵,因此上面数组元素的顺序是从
glupperspective
文档中所写内容转换而来的。

除非我遗漏了什么,否则将度转换为弧度是degToRad(deg){return deg*m_PI/180.0;},所以第一条线应该是180而不是360。@prewett:它不仅仅是从度到弧度的转换,它还除以2。
glupperspective
文档详细说明了方程
f=cotanent(fovy/2)
;当你把角度转换成弧度时,
fovy/2
变成
fovy*M_PI/360
。哎呀,我现在在你的评论中看到了。我在Mac上的窗口太小,看不到完整的评论,而且愚蠢的Lion+滚动条在你真正滚动之前不会出现,所以我没有看到弧度部分有更多的内容。很抱歉。
void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )
{
    GLdouble xmin, xmax, ymin, ymax;

    ymax = zNear * tan( fovy * M_PI / 360.0 );
    ymin = -ymax;
    xmin = ymin * aspect;
    xmax = ymax * aspect;

    glFrustum( xmin, xmax, ymin, ymax, zNear, zFar );
}