Почему opengl не хочет распознавать цвет для моих 3D-фигур?

#c #visual-studio #opengl #graphics #3d

#c #visual-studio #opengl #графика #3D

Вопрос:

Мой первый робот Robot(); плоский, и цвет работает идеально. Для моего второго робота RobotBodyMotion(); тот, который вращается вокруг оси y, не хочет распознавать мою команду color. Единственное, что я могу сделать, это изменить окружение, сделать его рассеянным и зеркальным. Это меняет весь цвет, и я хочу раскрасить каждую фигуру по отдельности. Что я могу изменить или переместить, чтобы получить индивидуальный цвет для фигур?

 #include<Windows.h>
#include <GLglew.h>
#include <math.h>
#include <iostream>
#include <GLGL.h>
#include <GLGLU.h>
#include <GLUT/glut.h>
#include <glmglm.hpp>
#include <glmgtcmatrix_transform.hpp>
#include <glmgtxtransform.hpp>
#include "Canvas_freeglut.h"
#include<vector>

static int window;
static int menu_id;
static int submenu_id;
static int submenu_id2;
static int value = 0;




//part one
//robot alone with the missing features which is his body
//rotating hands and feet on off
//non flat shading model
//menu to toggle shading smooth or flat


static GLfloat theta[] = { 0.0, 0.0, 0.0 };
static GLint axis = 2.0;

void drawRectangle()
{
    glutSolidCube(.15);
}

void drawSphere()
{
    glutSolidSphere(.1, 16, 16);
}

void spinsphere()
{
theta[axis] =.05;

if (theta[axis] > 360.0)
    theta[axis] -= 360.0;
    glutPostRedisplay();


////stop and reposition
//else
//{
//  glutPostRedisplay();
//}

}

void drawRightSideAppendages()
{

    glColor3f(1.000, 1.000, 0.000);
    glPushMatrix(); // right arm
    glTranslatef(0.139f, 0.12f, 0.0f);
    glRotatef(150,0, 0, 1);
    glScalef(0.35f, 1.20f, 0.1f);
    drawSphere();
    glPopMatrix();


    glColor3f(0.000, 1.000, 0.000);
    glPushMatrix(); // right hand
    glTranslatef(0.22f, .25f, 0.0f);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    glScalef(0.44f, 0.50f, 0.50f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // right thigh
    glColor3f(1.000, 0.000, 1.000);
    glTranslatef(0.10f, -0.40f, 0.0f);
    glRotatef(20, 0, 0, 1);
    glScalef(0.40f, 1.40f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // right shin
    glTranslatef(0.14f, -0.66f, 0.0f);
    glScalef(0.35f, 1.60f, 0.35f);
    drawSphere();
    glPopMatrix();


    glPushMatrix(); // right foot
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(0.16f, -.85f, 0.0f);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    glScalef(0.45f, 0.51f, 1.0f);
    drawSphere();
    glPopMatrix();
}

void drawRightSideAppendagesNoMotion()
{
    glPushMatrix(); // right arm
    glColor3f(1.000, 1.000, 0.000);
    glTranslatef(0.139f, 0.12f, 0.0f);
    glRotatef(150, 0, 0, 1);
    glScalef(0.35f, 1.20f, .30f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // right hand
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(0.22f, .25f, 0.0f);
    glScalef(0.44f, 0.50f, 0.50f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // right thigh
    glColor3f(1.000, 0.000, 1.000);
    glTranslatef(0.10f, -0.40f, 0.0f);
    glRotatef(20, 0, 0, 1);
    glScalef(0.40f, 1.40f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // right shin
    glTranslatef(0.14f, -0.66f, 0.0f);
    glScalef(0.35f, 1.60f, 0.35f);
    drawSphere();
    glPopMatrix();


    glPushMatrix(); // right foot
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(0.16f, -.85f, 0.0f);
    glScalef(0.45f, 0.51f, 1.0f);
    drawSphere();
    glPopMatrix();
}

void drawMiddleAppendages()
{
    glPushMatrix();//antena
    glColor3f(0.000, 0.000, 0.000);
    glTranslatef(0.0f, 0.72f, 0.0f);
    glScalef(0.1f, 0.75f, 0.1f);
    drawRectangle();
    glEnd;
    glPopMatrix();

    glPushMatrix(); // part of antena(circle)
    glColor3f(1.000, 0.000, 0.000);
    glTranslatef(0.0f, 0.79f, 0.0f);
    glScalef(.30f, .30f, .30f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // head
    glColor3f(0.000, 0.000, 1.000);
    glTranslatef(0.0f, 0.50f, 0.0f);
    glScalef(1.75f, 1.75f, 1.75f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // eyes (left)

    glColor3f(0.627, 0.322, 0.176);
    glTranslatef(-0.07f, 0.56f, -.11f);
    glScalef(.35f,.35f, .35f);
    drawSphere();
    glPopMatrix(); 

    glPushMatrix(); // eyes (right)
    glColor3f(0.627, 0.322, 0.176);
    glTranslatef(0.07f, 0.56f, -.11f);
    glScalef(.35f, .35f, .35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix();//mouth
    glColor3f(0.000, 0.000,.000);
    glTranslatef(0.0f, 0.45f, -0.16f);
    glRotatef(-10, 1, 0,0);
    glScalef(1.0f, 0.20f, 0.20f);
    drawRectangle();
    glPopMatrix();


    glPushMatrix(); // body
    glColor3f(0.000, 0.000, 1.000);
    glTranslatef(0.0f, 0.0f, 0.0f);
    glScalef(.85f, 3.5f, .50f);
    drawSphere();
    glPopMatrix();

}

void drawLeftSideAppendages()
{
    glPushMatrix(); // left arm
    glColor3f(1.000, 1.000, 0.000);
    glTranslatef(-0.139f, 0.12f, 0.0f);
    glRotatef(-150, 0, 0, 1);
    glScalef(0.35f, 1.20f, 0.1f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left hand
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(-0.22f, .25f, 0.0f);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    glScalef(0.44f, 0.50f, 0.50f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left thigh
    glColor3f(1.000, 0.000, 1.000);
    glTranslatef(-0.10f, -0.40f, 0.0f);
    glRotatef(-20, 0, 0, 1);
    glScalef(0.40f, 1.40f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left shin
    glTranslatef(-0.14f, -0.66f, 0.0f);
    glScalef(0.35f, 1.60f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left foot
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(-0.16f, -.85f, 0.0f);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    glScalef(0.45f, 0.51f, 1.0f);
    drawSphere();
    glPopMatrix();
} 

void drawLeftSideAppendagesNoMotion()
{
    glPushMatrix(); // left arm
    glColor3f(1.000, 1.000, 0.000);
    glTranslatef(-0.139f, 0.12f, 0.0f);
    glRotatef(-150, 0, 0, 1);
    glScalef(0.35f, 1.20f, 0.30f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left hand
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(-0.22f, .25f, 0.0f);
    glScalef(0.44f, 0.50f, 0.50f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left thigh
    glColor3f(1.000, 0.000, 1.000);
    glTranslatef(-0.10f, -0.40f, 0.0f);
    glRotatef(-20, 0, 0, 1);
    glScalef(0.40f, 1.40f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left shin
    glTranslatef(-0.14f, -0.66f, 0.0f);
    glScalef(0.35f, 1.60f, 0.35f);
    drawSphere();
    glPopMatrix();

    glPushMatrix(); // left foot
    glColor3f(0.000, 1.000, 0.000);
    glTranslatef(-0.16f, -.85f, 0.0f);
    glScalef(0.45f, 0.51f, 1.0f);
    drawSphere();
    glPopMatrix();
}

void Robot()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    drawRightSideAppendages();
    drawMiddleAppendages();
    drawLeftSideAppendages();
}

void RobotNoMotion()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    drawRightSideAppendagesNoMotion();
    drawMiddleAppendages();
    drawLeftSideAppendagesNoMotion();
}

void RobotBodyMotion()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glRotatef(theta[2], 0.0, 1.0,0.0);
    drawRightSideAppendagesNoMotion();
    drawMiddleAppendages();
    drawLeftSideAppendagesNoMotion();

}

void MyInit(void)
{
    GLfloat mat_ambient[] = { 0.25, 0.25, 0.25, 1.0f };//shape ambience
    GLfloat mat_diffuse[] = { .4 , .4, .4, 0.2775, 1.0f };//where light fades to shade
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0f };//light reflect on shape specular
    GLfloat mat_shininess[] = { 50.8f };//specular exponent
    GLfloat light_position[] = { 1.0, 1.0, -1.0, 0.0 };
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glClearColor(0.663, 0.663, 0.663, 1.0);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);
    // set white background color   
    // set the drawing color (black)  
    glOrtho(-1, 1, -1, 1, -1, 1);
}

void Display()
{
    if (value != 0 amp;amp; value!=1)
    {
        spinsphere();
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (value == 1)
    {
        glClearColor(0.663, 0.663, 0.663, 0.0);//clear
    }
    else if (value == 2){

        glDisable(GL_LIGHTING);
        Robot();
    }
    else if (value == 3){
        glDisable(GL_LIGHTING);
        RobotNoMotion();
    }
    else if (value == 4){

        glEnable(GL_LIGHTING);
        RobotBodyMotion();
    }
    else if (value == 5){

        glEnable(GL_LIGHTING);
        RobotNoMotion();
    }
    glFlush();
}

void menu(int num)
{
    if (num == 0)
    {
        glutDestroyWindow(window);
        exit(0);
    }
    else
    {
        value = num;
    }
    glutPostRedisplay();
}

void createMenu(void)
{

    submenu_id = glutCreateMenu(menu);
    glutAddMenuEntry("Flat Rotation ON", 2);
    glutAddMenuEntry("Flat Rotaion OFF",3);

    submenu_id2 = glutCreateMenu(menu);
    glutAddMenuEntry("Smooth Rotation ON", 4);
    glutAddMenuEntry("Smooth Rotation OFF", 5);

    menu_id = glutCreateMenu(menu);
    glutAddMenuEntry("Clear", 1);
    glutAddSubMenu("Flat Robot", submenu_id);
    glutAddSubMenu("Smooth Robot", submenu_id2);
    glutAddMenuEntry("Quit", 0);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
}

void main(int argc, char** argv)
{
    glutInit(amp;argc, argv);// initialize the toolkit   
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB|GLUT_DEPTH); // set display mode  
    glutInitWindowSize(1000,500);// set window size   
    glutInitWindowPosition(0, 0);
    window = glutCreateWindow("ROBOT");// open the screen window   
    MyInit();
    createMenu();
    glutDisplayFunc(Display);// register redraw function
    glutMainLoop();// go into a perpetual loop   
}
  

Комментарии:

1. Сохраните цвета для отдельных частей в некоторых переменных и используйте их для обработки ваших glColor3f() вызовов.

2. Проблема в том, что независимо от того, куда я помещаю glColor3f (), мой 3D-вращающийся робот не хочет менять цвет.

3. У вас уже есть glColor3f() вызовы в ваших функциях рисования. Вам нужно изменить параметры на основе некоторых переменных.

4. Я понятия не имею, что изменить, я занимаюсь этим около 5 часов, ЛОЛ.

Ответ №1:

Вы включили здесь освещение:

 glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
  

Как только вы это сделаете, цвет вашей геометрии будет определен путем оценки уравнений освещения на основе ваших определений освещения и материала. Цвета, установленные с помощью glColor3f() , больше использоваться не будут.

У вас есть два варианта исправить это:

  • Везде, где вы в данный момент вызываете glColor3f() в своем коде, вместо этого вы выполняете вызов для изменения атрибутов материала. Например. каждый раз, когда вы хотите изменить рассеянный цвет материала, вызывайте glMaterialfv(GL_FRONT, GL_DIFFUSE, ...) .
  • Во время инициализации вызовите:

     glColorMaterial(GL_FRONT, GL_DIFFUSE);
    glEnable(GL_COLOR_MATERIAL);
      

    Это указывает, что рассеянный цвет материала соответствует текущему цветовому набору с помощью glColor3f() . Таким образом, вы можете использовать glColor3f() в остальной части кода, чтобы задать рассеянный цвет материала.

Еще лучший вариант — использовать более современную версию OpenGL, где вы пишете шейдеры, которые окрашивают все в точности так, как вы это реализуете, не полагаясь на комбинацию трудных для понимания значений состояния.

Комментарии:

1. Спасибо, это была проблема.