OpenGL: от исходного кода Visual Studio до XCode 4? - PullRequest
1 голос
/ 26 января 2012

Я нахожусь в классе, в котором мы будем изучать OpenGL. Профессор использует Visual Studio, но это не очень хорошо работает с моей установкой Parallels, поэтому я просто решил использовать XCode (который я предпочитаю в любом случае). У меня работает базовый пример кода, но у меня возникают проблемы с тем примером, который нам дал профессор. Вот оно:

#include <glut.h>           //must be included for OpenGL
#include <gl\gl.h>              //must be included for OpenGL

#include <time.h>           //must be included for time functions
#include <iostream>         //must be included for console input/output
using namespace std;

#define WINDOW_WID 800
#define WINDOW_HEI 600

int randomPx, randomPy;
/////////////////////////////////////////

void myInit(void) 
{
    randomPx = 400;
    randomPy = 300;
    glClearColor (1.0, 1.0, 1.0, 0.0);   // set background color to black
    glShadeModel (GL_FLAT);
}



void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);        // clear the screen    

    glColor3f(1,0,0);                   //set the drawing color
    glPointSize(10);                    //set the point size
    glBegin(GL_POINTS);
        glVertex2d(randomPx,randomPy);          //Set the position of the vertex
    glEnd();

    glutSwapBuffers ();                 //put everything on your screen
}


void myReshape ( int w, int h)
{
    glViewport (0, 0, w, h);
    glMatrixMode (GL_PROJECTION);           // set "camera type"
    glLoadIdentity ();                      // clear the matrix

    glOrtho(0.0, w, 0.0, h, -1.0, 1.0);     // viewing transformation 
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
}

void Animation()
{
    srand(time(NULL)+rand());               //set the seed for your rand function
    randomPx = rand()%WINDOW_WID;
    randomPy = rand()%WINDOW_HEI;
    Sleep(200);                             //put the program to sleep for 200 ms

    myDisplay();
}

void myMouse(int button, int state, int x, int y)
{    
    y = WINDOW_HEI - y;
    switch (button) 
    {
        case GLUT_LEFT_BUTTON:              //when left mouse button is clicked
            if (state == GLUT_DOWN)         
            {
                cout << "When mouse is up, animation starts\n";
            }
            else if(state == GLUT_UP)
            {
                glutIdleFunc(Animation);    //do Animation when idle
            }
            break;
        case GLUT_RIGHT_BUTTON:             //when right mouse button is clicked
            if (state == GLUT_DOWN)
            {
                glutIdleFunc(NULL);         //do nothing when idle
            }
            break;
        case GLUT_MIDDLE_BUTTON:
            if (state == GLUT_DOWN)
            {
                exit (-1);                  //exit your program
            }
            break;
    }
    myDisplay();
} 

void myMotion(int x, int y)
{   
    y = WINDOW_HEI - y;


    myDisplay();
}

void myKeyboard(unsigned char key, int x, int y)
{
    //TODO 

    myDisplay();
}

/*
 * Request double buffer display mode.
 * Register mouse input callback functions
 */
int main(int argc, char** argv)
{
    glutInit(&argc, argv);                            // initialize the toolkit
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);     // set display mode
    // glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);     // set display mode
    glutInitWindowSize (WINDOW_WID, WINDOW_HEI);                    // set screen window size
    glutInitWindowPosition (100, 100);       // set window position on screen
    glutCreateWindow (argv[0]);              // open the screen window
    myInit ();
    glutDisplayFunc(myDisplay);              // register redraw function
    glutReshapeFunc(myReshape);              // register reshape function

    glutMouseFunc(myMouse); //GLUT provides a way for you to register the function that will be responsable for processing events generated by mouse clicks.
    glutMotionFunc(myMotion); //There are two types of motion that GLUT handles: active and passive motion. Active motion occurs when the mouse is moved and a button is pressed. 
    glutKeyboardFunc(myKeyboard);
    //glutPassiveMotionFunc(myPassiveMotion); //Passive motion is when the mouse is moving but no buttons are pressed. If an application is tracking motion, an event will be generated per frame during the period that the mouse is moving.
    //glutEntryFunc(processMouseEntry); //GLUT is also able to detect when the mouse leaves or enters the window region. A callback function can be registered to handle these two events.

    glutMainLoop();                          // go into a perpetual loop
    return 0;
}

Я вынул операторы import и заменил их на импорта, например, код XCode OpenGL:

#include <iostream>
#include <GLUT/glut.h>
#include <time.h>

И я не получаю никаких сообщений об ошибках, но когда я запускаю приложение и нажимаю на окно, оно не запускает анимацию, которая должна. (Я знаю, что это работает, потому что в Visual Studio на любом другом компьютере в классе это работало нормально.)

Он регистрирует щелчок на экране, распечатывая: «Когда мышь нажата, анимация запускается»

Но после этого он просто дает мне Spinning Beachball of Death, пока я не остановлю его запуск через XCode. Так что я должен настроить что-то еще, чтобы это работало?

Ответы [ 2 ]

0 голосов
/ 13 октября 2013

о сне .. пользуйся

#include <unistd.h> // ОТ C и использовать

sleep(0.2) 

который в секундах .. так 2000 miliseconds = 0.2 seconds .. так просто переключиться с сна (2000) на сон (0,2)

0 голосов
/ 26 января 2012

Прежде всего, почему вы используете обратную косую черту для импорта gl.h? Во-вторых, вы должны связать свой код с библиотекой GLUT и OpenGL, поэтому вы должны включить / импортировать их как OpenGL / gl.h и GLUT / glut.h. Но ваша главная проблема здесь - функция сна. Он не существует на Mac и, следовательно, ваш код падает, когда он пытается анимировать. Вместо этого используйте [NSThread sleepForTimeInterval:0.2], если хотите подождать 200 мс. Но вам придется изменить расширение файла на .mm, чтобы использовать код target-c, а также импортировать библиотеку Foundation для использования класса NSThread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...