Opengl:如何使这个三角形以窗口为中心

时间:2011-05-20 12:31:45

标签: opengl glut

#include <GL/glut.h>

GLint winWidth = 600, winHeight = 600;

GLfloat x0 = 100.0, y0 = 100.0, z0 = 50.0;
GLfloat xref = 50, yref = 50.0, zref = 0.0;
GLfloat Vx = 0.0, Vy = 1.0,  Vz = 0.0;
GLfloat xwMin = -40.0, ywMin = -60.0, xwMax = 40.0, ywMax = 60.0;
GLfloat dnear = 25.0, dfar = 125.0;

void init (void)
{   
    glClearColor (1.0, 1.0, 1.0, 0.0);

    //glMatrixMode(GL_MODELVIEW);
    //gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glOrtho(0,1,0,1, 0,0.1);
    //gluOrtho2D(0, 1,0,1);
    //gluPerspective(45, 1.2, 1, 10);
    glFrustum(0, 1, 0, 1, 0, 1);
    //gluPerspective(45.0, 1, 1, 15);
}

void displayFcn (void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(0.0, 1.0, 0.0);
    //glPolygonMode(GL_FRONT, GL_FILL);
    //glPolygonMode(GL_BACK, GL_FILL);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(1.0, 0.0, 0.0);
        glVertex3f(0.5, 1.0, 0.0);
    glEnd();

    glFlush();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    glViewport(0,0,newWidth, newHeight);

    winWidth = newWidth;
    winHeight = newHeight;

}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}

这是完整的源代码,您可以复制并粘贴到您的VS解决方案并进行编译。 你需要安装过剩。

结果如下: enter image description here

4 个答案:

答案 0 :(得分:1)

窗口的中心在opengl中为0,0。因此,在计算顶点时,必须计算它们,使三角形的中心为0,0。

glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(1.0, 0.0, 0.0);
        glVertex3f(0.5, 1.0, 0.0);
glEnd();

这些坐标需要更新,你可以在这个问题上找到关于找到三角形中心的讨论:finding center of 2D triangle听起来像是来自类似的家庭作业。

答案 1 :(得分:0)

glTranslatef(-0.5f, -0.5f, 0.0f);

答案 2 :(得分:0)

OpenGL的默认透视图是以原点为中心,窗口x和y的范围是-1到1.您可以通过更改默认查看体积或更改三角形的坐标来更改此值。

无论

glTranslatef(-.5f, -.5f, .0f);

glBegin(GL_TRIANGLES);
glVertex3f(-.5, -.5, 0.0);
glVertex3f(.50, -.5, 0.0);
glVertex3f(0, .5, 0.0);
glEnd();

会奏效。

答案 3 :(得分:0)

您好像在尝试使用glFrustum {。}}

glFrustum应该用于生成透视矩阵。 zNear 从不 0.你现在调用它的方式会产生一个错误glOrtho,所以你得到了默认的投影矩阵,即身份。