C++ 如何使用glut和openGL更改颜色?

C++ 如何使用glut和openGL更改颜色?,c++,opengl,glut,C++,Opengl,Glut,我试图自学如何在没有用户输入的情况下设置对象的动画,到目前为止,我已经掌握了如何使场景旋转。如何让对象改变颜色?我以为我的代码可以做到,但它仍然是一个白色三角形(甚至没有不同的颜色) 如何在三角形或透视图旋转的同时改变颜色 这是我目前的代码: #include <GL/glut.h> float color1; float color2; float color3; void changeSize(int w, int h) { // Prevent a divide by z

我试图自学如何在没有用户输入的情况下设置对象的动画,到目前为止,我已经掌握了如何使场景旋转。如何让对象改变颜色?我以为我的代码可以做到,但它仍然是一个白色三角形(甚至没有不同的颜色)

如何在三角形或透视图旋转的同时改变颜色

这是我目前的代码:

#include <GL/glut.h>

float color1;
float color2;
float color3;

void changeSize(int w, int h) {

// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
    h = 1;

float ratio = w * 1.0 / h;

// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);

// Reset Matrix
glLoadIdentity();

// Set the viewport to be the entire window
glViewport(0, 0, w, h);

// Set the correct perspective.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);

//changeColor?
color1 += 0.1f;
color2 += 0.3;
color3 += color2;
if (color1 > 1.0)
    color1 = 0;
if (color2 > 1.0)
    color2 = 0;
if (color3 > 1.0)
    color3 = 0;

// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}

float angle = 0.0f;

void renderScene(void) {

// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt(0.0f, 0.0f, 10.0f,
    0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f);

glRotatef(angle, 0.0f, 1.0f, 0.0f);

glBegin(GL_TRIANGLES);
glColor3f(color1, color2, color3);

glVertex3f(2.0f, -2.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0);
glVertex3f(0.0f, 2.0f, 0.0);
glEnd();

angle += 0.1f;
color1 += 0.1f;
color2 += 0.3;
color3 += color2;

glutSwapBuffers();
}

int main(int argc, char **argv) {

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(320, 320);
glutCreateWindow("tutorial example");

// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);

glutIdleFunc(renderScene);

// enter GLUT event processing cycle
glutMainLoop();

return 1;
}
#包括
浮色1;
浮色2;
浮色3;
无效更改大小(整数w、整数h){
//当窗口太短时,防止被零除
//(您不能制作零宽度的窗口)。
如果(h==0)
h=1;
浮动比率=w*1.0/h;
//使用投影矩阵
glMatrixMode(GL_投影);
//复位矩阵
glLoadIdentity();
//将视口设置为整个窗口
glViewport(0,0,w,h);
//设置正确的透视图。
(45.0f,比率,0.1f,100.0f);
//换颜色?
颜色1+=0.1f;
色度2+=0.3;
color3+=color2;
如果(颜色1>1.0)
颜色1=0;
如果(颜色2>1.0)
颜色2=0;
如果(颜色3>1.0)
颜色3=0;
//回到模型视图
glMatrixMode(GLU模型视图);
}
浮动角度=0.0f;
void renderScene(void){
//清晰的颜色和深度缓冲区
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//重置变换
glLoadIdentity();
//把照相机调好
gluLookAt(0.0f,0.0f,10.0f,
0.0f,0.0f,0.0f,
0.0f、1.0f、0.0f);
glRotatef(角度,0.0f,1.0f,0.0f);
glBegin(GL_三角形);
glColor3f(color1、color2、color3);
glVertex3f(2.0f,-2.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0);
glVertex3f(0.0f,2.0f,0.0);
格伦德();
角度+=0.1f;
颜色1+=0.1f;
色度2+=0.3;
color3+=color2;
glutSwapBuffers();
}
int main(int argc,字符**argv){
//初始化GLUT并创建窗口
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_双精度| GLUT_RGBA);
位置(100100);
glutInitWindowSize(320320);
glutCreateWindow(“教程示例”);
//注册回调
glutDisplayFunc(渲染场景);
GLUTEFUNC(更改大小);
glutIdleFunc(渲染场景);
//输入GLUT事件处理周期
glutMainLoop();
返回1;
}

浮动颜色必须在[0,1]的范围内,并且您只向值中添加一些内容,而从不将其重置为零,因此它在前10帧(=非常快)中大于1,OpenGL将其钳制为1,因此您会看到白色

也就是说,
changeSize
中的
if
s实际上应该在
renderScene

  • 对于类似这样的简单操作,请使用带有合理超时的
    glutTimerFunc()
    回调
  • 更新计时器回调中的角度/颜色并开始重新绘制
  • 每次通过
    glutDisplayFunc()
    回调重新设置投影/模型视图矩阵,有助于防止奇怪的矩阵问题
总而言之:

#include <GL/glut.h>

float angle = 0.0f;
float color1 = 0.0f;
float color2 = 0.0f;
float color3 = 0.0f;
void timer( int value )
{
    angle += 3.0f;

    //changeColor?
    color1 += 0.001f;
    color2 += 0.003f;
    color3 += color2;
    if (color1 > 1.0)
        color1 = 0;
    if (color2 > 1.0)
        color2 = 0;
    if (color3 > 1.0)
        color3 = 0;

    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

void renderScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective(45.0f, w / h, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt
        (
        0.0f, 0.0f, 10.0f,
        0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f
        );

    glRotatef(angle, 0.0f, 1.0f, 0.0f);

    glBegin(GL_TRIANGLES);
    glColor3f(color1, color2, color3);
    glVertex3f(2.0f, -2.0f, 0.0f);
    glVertex3f(2.0f, 0.0f, 0.0);
    glVertex3f(0.0f, 2.0f, 0.0);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(320, 320);
    glutCreateWindow("tutorial example");
    glutDisplayFunc(renderScene);
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 1;
}
#包括
浮动角度=0.0f;
浮色1=0.0f;
浮色2=0.0f;
浮色3=0.0f;
无效计时器(int值)
{
角度+=3.0f;
//换颜色?
颜色1+=0.001f;
颜色2+=0.003f;
color3+=color2;
如果(颜色1>1.0)
颜色1=0;
如果(颜色2>1.0)
颜色2=0;
如果(颜色3>1.0)
颜色3=0;
再发现();
glutTimerFunc(16,定时器,0);
}
void renderScene()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双w=glutGet(GLUT\U窗口\U宽度);
双h=glutGet(GLUT\U窗口\U高度);
(45.0f,w/h,0.1f,100.0f);
glMatrixMode(GLU模型视图);
glLoadIdentity();
注视
(
0.0f,0.0f,10.0f,
0.0f,0.0f,0.0f,
0.0f,1.0f,0.0f
);
glRotatef(角度,0.0f,1.0f,0.0f);
glBegin(GL_三角形);
glColor3f(color1、color2、color3);
glVertex3f(2.0f,-2.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0);
glVertex3f(0.0f,2.0f,0.0);
格伦德();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_双精度| GLUT_RGBA);
glutInitWindowSize(320320);
glutCreateWindow(“教程示例”);
glutDisplayFunc(渲染场景);
glutTimerFunc(0,定时器,0);
glutMainLoop();
返回1;
}

感谢您提供替代解决方案。也可以随意投票赞成或反对我的问题,因为我最近对它进行了编辑,以使其更好,并需要反馈。另外,在另一方面,我最终使用了一个类似于您的解决方案(我想),这是很久以前的事了。