簡體   English   中英

如何使用過剩和開放GL來改變顏色?

[英]How do I get color to change using glut and openGL?

我試圖教自己在沒有用戶輸入的情況下為一個對象設置動畫,到目前為止我已經想出了如何使一個場景旋轉。 如何讓對象改變顏色? 我認為我的代碼會做到,但它仍然是一個白色三角形(甚至不是一個不同的顏色)。

如何在三角形或透視圖旋轉的同時更改顏色?

這是我目前的代碼:

#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;
}

浮點顏色必須在[0,1]的范圍內,你只需要在你的值上添加一些東西,而不要將它重置為零,所以它在前10幀中變得大於1(=非常快),OpenGL將它固定為1,所以你看到它是白色的。

也就是說, changeSize中的一堆if應該實際上在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM