2010-05-01 7 views
1

Возможно, я неправильно настроил GLUT. Я хочу, чтобы вертикали были относительно их размера в пикселях. Прямо сейчас, если я создаю шестиугольник, он занимает весь экран, даже несмотря на то единицы 6.OpenGL Ошибка системы координат

#include <iostream> 
#include <stdlib.h> //Needed for "exit" function 
#include <cmath> 
//Include OpenGL header files, so that we can use OpenGL 
#ifdef __APPLE__ 
#include <OpenGL/OpenGL.h> 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

using namespace std; 

//Called when a key is pressed 
void handleKeypress(unsigned char key, //The key that was pressed 
        int x, int y) { //The current mouse coordinates 
    switch (key) { 
     case 27: //Escape key 
      exit(0); //Exit the program 
    } 
} 

//Initializes 3D rendering 
void initRendering() { 
    //Makes 3D drawing work when something is in front of something else 
    glEnable(GL_DEPTH_TEST); 
} 

//Called when the window is resized 
void handleResize(int w, int h) { 
    //Tell OpenGL how to convert from coordinates to pixel values 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective 

    //Set the camera perspective 
    glLoadIdentity(); //Reset the camera 
    gluPerspective(45.0,     //The camera angle 
        (double)w/(double)h, //The width-to-height ratio 
        1.0,     //The near z clipping coordinate 
        200.0);    //The far z clipping coordinate 
} 

//Draws the 3D scene 
void drawScene() { 
    //Clear information from last draw 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


    glLoadIdentity(); //Reset the drawing perspective 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

    glBegin(GL_POLYGON); //Begin quadrilateral coordinates 

    //Trapezoid 
    glColor3f(255,0,0); 

    for(int i = 0; i < 6; ++i) { 
     glVertex2d(sin(i/6.0*2* 3.1415), 
      cos(i/6.0*2* 3.1415)); 
    } 

    glEnd(); //End quadrilateral coordinates 

    glutSwapBuffers(); //Send the 3D scene to the screen 
} 

int main(int argc, char** argv) { 
    //Initialize GLUT 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowSize(400, 400); //Set the window size 

    //Create the window 
    glutCreateWindow("Basic Shapes - videotutorialsrock.com"); 
    initRendering(); //Initialize rendering 

    //Set handler functions for drawing, keypresses, and window resizes 
    glutDisplayFunc(drawScene); 
    glutKeyboardFunc(handleKeypress); 
    glutReshapeFunc(handleResize); 

    glutMainLoop(); //Start the main loop. glutMainLoop doesn't return. 
    return 0; //This line is never reached 
} 

Как я могу сделать так, чтобы координаты: (0,0), (10,0), (10,10), и (0,10) определить многоугольник, начинающийся в верхнем левом углу экрана и ширину и высоту 10 пикселей?

ответ

3

Если вы хотите, чтобы объекты были масштабированы таким образом, вы должны использовать орфографическую проекцию.

Прямо сейчас, с перспективой, вещи масштабируются не только по их размеру, но и по их положению оси Z. Поэтому использовать эту функцию вместо gluPerspective:

gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); 

Эта функция в основном определяет пространство, вы можете увидеть, что это как большой прямоугольной призмы. Это приводит к тому, что многие вещи кажутся такими же, как и у вещей.

Что касается точного масштабирования, оно также изменится относительно размера области просмотра. Чтобы получить пиксели в точности, вам придется постоянно менять проекцию или фиксировать размер окна просмотра.

Для того, чтобы он выглядел как 1: 1, если ваш видовой экран x пикселей в ширину, орфографическая проекция должна быть x пикселей в ширину.

2

Если вы рисуете 2D, вы не хотите использовать перспективную проекцию. Если вы установили свою камеру с помощью gluOrtho2D(0, window_width, window_height, 0);, тогда вы должны получить то, что ищете.

+0

Где в моем коде следует изменить его, я попытался, но ничего не сделал – jmasterx

+0

Вам нужно заменить вызов 'gluPerspective()'. – tzaman

Смежные вопросы