2013-02-18 4 views
0

Мне нужно нарисовать сферу и куб и в то же время
Когда я нажимаю 'r', куб меняет цвет, тогда «R» сфера изменит свой цвет. То же самое с 'g' и 'b'Как я могу применить цвет освещения на 1 объект всякий раз, когда я нажимаю клавишу C++

r красный, g зеленый, b голубой.

Проблема в том, что я не знаю, какой набор кодов использовать. В настоящее время в базовой/начинающей программе C++

#include <conio.h> 
#include <stdio.h> 
#include <glut.h> 

float CubeX = 0.0, CubeY = 0.0; 
float Angle = 0.0l; 
bool LightSwitch1 = false; 
bool LightSwitch2 = false; 
bool LightSwitch3 = false; 
float Green[4] = {0.0, 1.0, 0.0, 1.0}; //R, G, B, A 
float Blue[4] = {0.0, 0.0, 1.0, 1.0}; //R, G, B, A 
float Red[4] = {1.0, 0.0, 0.0, 1.0}; //R, G, B, A 
float White[4] = {1.0, 1.0, 1.0, 1.0}; //R, G, B, A 
float Yellow[4] = {1.0, 1.0, 0.5, 1.0}; //R, G, B, A 
float red = 1.0; 
float blue = 1.0; 
float green = 1.0; 

void GameScene() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //lighswitch statement 
if (!LightSwitch1) 
{ 
    glDisable(GL_LIGHTING); 
    glDisable(GL_LIGHT0); 
} 
else if (!LightSwitch2) 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Green); 

} 
else if (!LightSwitch3) 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
} 
else 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
} 



glPushMatrix(); 
glTranslatef(CubeX, CubeY, 0.0); 
glRotatef(Angle, 0.0, 1.0, 0.0); 
glColor3f(red, green, blue); 
glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); //lighting = on | color 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Red); 
glutSolidCube(2.0); 
glPopAttrib(); 
glPopMatrix(); 

//glPushMatrix(); 
//glColor3f(0.0, 0.0, 1.0); 
//glTranslatef(2.0, 2.5, 0.0); 
//glRotatef(Angle, 0.0, 1.0, 0.0); 
//glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); //lighting = on | color 
// glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Red); 
//glutSolidSphere(1.0, 10.0, 5.0); 
//glPopAttrib(); 
//Angle++; 
//glPopMatrix(); 

glEnd(); 

glutSwapBuffers(); 
} 
void Keys(unsigned char key, int x, int y) 
{ 
switch(key) 
{ 
    case 'w': 
     CubeY+= 0.15; 
     break; 
    case 'a': 
     CubeX-= 0.15; 
     break; 
    case 's': 
     CubeY-= 0.15; 
     break; 
    case 'd': 
     CubeX += 0.15; 
     break; 
    case 'r': 
     LightSwitch1 = !LightSwitch1; //light switch controls 
     break; 
    case 'g': 
     LightSwitch2 = !LightSwitch2; 
     break; 
    case 'b': 
     LightSwitch3 = !LightSwitch3; 
     break; 
    } 
} 

void SpecialKeys(int key, int x, int y) 
{ 
    switch(key) 
    { 
    case GLUT_KEY_UP: 
     CubeY += 0.15; 
     break; 
    case GLUT_KEY_DOWN: 
     CubeY -= 0.15; 
     break; 
    case GLUT_KEY_LEFT: 
     CubeX -= 0.15; 
     break; 
    case GLUT_KEY_RIGHT: 
     CubeX += 0.15 ; 
     break; 
    } 
} 
void ResizeWindow(int w, int h) 
{ 
    float ratio = 1.0*w/h; 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glViewport(0, 0, w, h); 
    gluPerspective(45.0, ratio, 1, 1000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt(0.0, 10.0, 15.0, 
       0.0, 0.0, 0.0, 
       0.0, 1.0, 0.0); 
} 
void main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 

    glutInitWindowPosition(0,0); 
    glutInitWindowSize(1200, 700); 
    glutCreateWindow("Hey, its a moving cube!"); 
    glutReshapeFunc(ResizeWindow); 
    glutDisplayFunc(GameScene); 
    glutIdleFunc(GameScene); 

    glutKeyboardFunc(Keys); 
    glutSpecialFunc(SpecialKeys); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    glutMainLoop(); 
} 
+1

Что это у вас есть проблемы с? Управление ключами? Перерисовка? Что-то другое? –

+0

проблема - работает только ключ «r». когда я нажимаю клавишу «r», куб становится красным. и я не могу продолжить зеленый цвет и синюю часть цвета. –

ответ

1

Вы связываете свое состояние с функцией отображения, когда не должны.

То, что вы пишете, что если LightSwitch1 является false то сделать что-то, еще если LightSwitch2 является false сделать что-то, еще ... Так вы только проверить LightSwitch2 если LightSwitch1 является true.

Вы должны иметь три отдельные if заявления, каждый из которых с одной else:

if (!LightSwitch1 && !LightSwitch2 && !LightSwitch3) 
{ 
    glDisable(GL_LIGHTING); 
    glDisable(GL_LIGHT0); 
} 
else 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    if (LightSwitch1) 
     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Red); 

    if (!LightSwitch2) 
     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Gree); 

    if (!LightSwitch3) 
     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Blue); 
} 
+0

, но как насчет изменения цвета объекта? он также помещен в утверждение условия? –

+0

@JhayU. Я не выписал фактический чертеж в своем ответе, вы должны поместить его в блоки 'if' или' else'. –

+0

да да, я написал что-то там, но я только что написал glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); в другой части и в части if: glDisable (GL_LIGHTING); glDisable (GL_LIGHT0); Не знаете, какие коды использовать после него –

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