OpenGL VS2008 на C ++: один и тот же код работает по-разному даже на одном компьютере - PullRequest
0 голосов
/ 21 октября 2011

У меня есть два абсолютно одинаковых кода OpenGL C ++, скомпилированных с использованием VS2008 в другом проекте, но когда я их компилирую, он ведет себя по-разному.Один из них может распознать условие if ( mod == GLUT_ACTIVE_CTRL && button == GLUT_WHEEL_UP ), а один - нет.

Вот полная функция:

void mouse(int button, int state, int x, int y) {

int mod = glutGetModifiers();
mouseState = state;
mouseButton = button;
double modelview[16], projection[16];

int viewport[4];
float z = 0 ;

/*Read the projection, modelview and viewport matrices
using the glGet functions.*/
glGetIntegerv( GL_VIEWPORT, viewport );
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
//glGetDoublev( GL_PROJECTION_MATRIX, projection );

//Read the window z value from the z-buffer 
glReadPixels( x, viewport[3]-y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z );   

// Used for wheels, has to be up    
if (state == GLUT_UP )  {       
    if ( mod == GLUT_ACTIVE_CTRL && button == GLUT_WHEEL_UP ){                  
        printf("Wheel Up\n");
        zoom += 0.1;
    }
    else if (mod == GLUT_ACTIVE_CTRL &&  button == GLUT_WHEEL_DOWN ){
        printf("Wheel Down\n"); 
        zoom -= 0.1;
    }


    else if (mod == GLUT_ACTIVE_ALT && button == GLUT_WHEEL_UP) {
        //printf("Z++\n");
        translation_z = translation_z + 0.1;
        //printf("Z = %f", translation_z);
    }

    else if (mod == GLUT_ACTIVE_ALT && button == GLUT_WHEEL_DOWN) {
        //printf("Z--\n");
        translation_z = translation_z - 0.1;
    }

    else if (mod == GLUT_ACTIVE_SHIFT && button == GLUT_WHEEL_UP) {
        //printf("Shift Wheel Up. Z axis rotation goes here.\n");
        zrotation += (5*(z - oldZ)); // about x-axis
    }

    else if (mod == GLUT_ACTIVE_SHIFT && button == GLUT_WHEEL_DOWN) {
        //printf("Shift Wheel Down. Z Axis rotation goes here\n");
        zrotation -= (5*(z - oldZ)); // about x-axis
        //translation_z = translation_z - 0.1;
    }


}
else if (state == GLUT_DOWN) {
    //printf("Glut Down before z processing\n");

    if (button == GLUT_LEFT_BUTTON){
        cursorX = x;
        cursorY = y;
        mode = SELECT;
        //printf("Left is down\n");
    }

    oldX = x;
    oldY = y;
}
}

`

, и я загрузил оба проект здесь .

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Настройки источника и проекта выглядят одинаково.Я не вижу никаких добавленных путей включения, у вас есть копия opengl локально в обоих проектах?

Единственное, о чем я могу подумать сейчас, - это комментарий из вашего источника ...

//Use patched version of GLUT (http://www.realmtech.net/opengl/glut.php) in case the wheel interaction does not work.

1) Похоже, это может относиться именно к вашей проблеме.

2) Возможно, вы использовали эту исправленную версию в одном проекте, но не в другом?

Редактировать: В одном из проектов у вас есть строки printf для колеса вниз и колеса вверх закомментированыэто случайно, как вы говорите, что колесо не узнают?

0 голосов
/ 22 октября 2011

Я обнаружил проблему. В проект, который не может распознать состояние подъема / опускания колеса (несмотря на это), я включил:

freeglut.lib glut32.lib opengl32.lib user32.lib

Эту проблему можно решить, включив только следующие библиотеки:

opengl32.lib user32.lib

Спасибо @ melak47 за предложение проверить настройки проекта.

...