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中的代码有问题?