C++ 如何在每次按c键时在一个对象上应用照明颜色+;

C++ 如何在每次按c键时在一个对象上应用照明颜色+;,c++,opengl,glut,C++,Opengl,Glut,我需要画一个球体和立方体,同时 每当我按下“r”时,立方体将改变其颜色,然后当“r”时球体将改变其颜色。与“g”和“b”相同 r是红色,g是绿色,b是蓝色 问题是我不知道该使用哪套代码。目前在c的basic/初学者程序中++ #include <conio.h> #include <stdio.h> #include <glut.h> float CubeX = 0.0, CubeY = 0.0; float Angle = 0.0l; bool Light

我需要画一个球体和立方体,同时
每当我按下“r”时,立方体将改变其颜色,然后当“r”时球体将改变其颜色。与“g”和“b”相同

r是红色,g是绿色,b是蓝色

问题是我不知道该使用哪套代码。目前在c的basic/初学者程序中++

#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(); 
}
#包括
#包括
#包括
浮动立方=0.0,立方=0.0;
浮动角度=0.0升;
bool LightSwitch1=错误;
布尔光开关2=假;
bool LightSwitch3=错误;
浮动绿色[4]={0.0,1.0,0.0,1.0}//R、 G,B,A
浮蓝[4]={0.0,0.0,1.0,1.0}//R、 G,B,A
浮动红[4]={1.0,0.0,0.0,1.0}//R、 G,B,A
浮动白色[4]={1.0,1.0,1.0,1.0}//R、 G,B,A
浮动黄色[4]={1.0,1.0,0.5,1.0}//R、 G,B,A
浮动红=1.0;
浮蓝=1.0;
浮动绿色=1.0;
void GameScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//lighswitch语句
如果(!LightSwitch1)
{
glDisable(GLU照明);
glDisable(GL_LIGHT0);
}
否则如果(!LightSwitch2)
{
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
GLMATERIALV(GL_前部和后部,GL_漫反射,绿色);
}
否则如果(!LightSwitch3)
{
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
}
其他的
{
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
}
glPushMatrix();
glTranslatef(CubeX,CubeY,0.0);
glRotatef(角度,0.0,1.0,0.0);
glColor3f(红色、绿色、蓝色);
glPushAttrib(GL|U照明| GL|U当前|位);//照明=开启|颜色
GLMATERIALV(GL_前部和后部,GL_漫反射,红色);
立体立方体(2.0);
glpopatrib();
glPopMatrix();
//glPushMatrix();
//GL3F(0.0,0.0,1.0);
//glTranslatef(2.0,2.5,0.0);
//glRotatef(角度,0.0,1.0,0.0);
//glPushAttrib(GL|U照明| GL|U当前|位);//照明=开启|颜色
//GLMATERIALV(GL_前部和后部,GL_漫反射,红色);
//固体球(1.0,10.0,5.0);
//glpopatrib();
//Angle++;
//glPopMatrix();
格伦德();
glutSwapBuffers();
}
无效键(无符号字符键,整数x,整数y)
{   
开关(钥匙)
{
案例“w”:
库比+=0.15;
打破
案例“a”:
CubeX-=0.15;
打破
案例s:
库比-=0.15;
打破
案例“d”:
CubeX+=0.15;
打破
案例“r”:
LightSwitch1=!LightSwitch1;//灯光开关控件
打破
案例“g”:
LightSwitch2=!LightSwitch2;
打破
案例“b”:
LightSwitch3=!LightSwitch3;
打破
}
}
无效特殊键(整数键、整数x、整数y)
{
开关(钥匙)
{
案例过多关键点:
库比+=0.15;
打破
案例过量键关闭:
库比-=0.15;
打破
案例过剩\u键\u左:
CubeX-=0.15;
打破
案例过量键右:
CubeX+=0.15;
打破
}
}
void ResizeWindow(int w,int h)
{
浮球比=1.0*w/h;
glMatrixMode(GL_投影);
glLoadIdentity();
glViewport(0,0,w,h);
(45.0,比率为1,1000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(0.0,10.0,15.0,
0.0, 0.0, 0.0, 
0.0, 1.0, 0.0); 
}
void main(整型argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_双精度| GLUT_RGBA);
位置(0,0);
glutInitWindowSize(1200700);
glutCreateWindow(“嘿,这是一个移动的立方体!”);
GLUTEFUNC(调整窗口大小);
glutDisplayFunc(游戏场景);
glutIdleFunc(游戏场景);
键盘功能(按键);
glutSpecialFunc(SpecialKeys);
glEnable(GLU深度试验);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glutMainLoop();
}

在不应该显示的情况下,您可以在显示功能中链接您的条件

你要写的是,如果
LightSwitch1
false
那么就做点什么,如果
LightSwitch2
false
那么就做点别的。。。因此,只有当
LightSwitch1
true
时,才检查
LightSwitch2

您应该有三个独立的
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);
}

你有什么问题?钥匙处理?重画?还有什么问题吗?麻烦的是,只有“r”键起作用。当我按下“r”键时,立方体变成红色。我不能继续使用绿色和蓝色部分。但是改变物体的颜色怎么样?它也放在条件声明中了吗?@JhayU。在我的回答中,我没有写出实际的图纸,你必须把它放在
if
else
块中。是的,是的,我确实在那里写了一些东西,但我只是写了glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);在else部分和if部分为glDisable(GLU照明);glDisable(GL_LIGHT0);不知道以后使用什么代码it@JhayU. 我想我误解了你想要实现的目标,更新了我的答案。天哪,就是这样:)我只是在颜色方面有问题,它的knda洗牌。。也许我的glpushmatrix到GLPOPMARRIX中的代码有问题?