Opengl: как сделать этот треугольник центрированным на окне - PullRequest
1 голос
/ 20 мая 2011
#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 ]

1 голос
/ 20 мая 2011

Центр окна 0,0 в OpenGL.Итак, когда вы вычисляете вершины, вы должны вычислить их так, чтобы центр треугольника был 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();

эти координаты нужно будет обновить, вы можете найти обсуждение вопроса о нахождении центров треугольников по этому вопросу: найти центр 2D-треугольника , который звучит так, как будто он подобендомашнее задание.

0 голосов
/ 20 мая 2011

Похоже, вы пытаетесь использовать glFrustum там, где вы хотите использовать glOrtho

glFrustum предполагается использовать для генерации матрицы перспективы. zNear - , никогда 0. То, как вы сейчас его называете, приводит к ошибке GL_INVALID_VALUE, поэтому вы получаете матрицу проекции по умолчанию, тождество.

0 голосов
/ 20 мая 2011

Перспективой по умолчанию для 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();

будут работать.

0 голосов
/ 20 мая 2011
glTranslatef(-0.5f, -0.5f, 0.0f);
...