Молния Opengl из объекта

#opengl #opengl-compat #lightning

#opengl #opengl-compat #молния

Вопрос:

Я хочу нарисовать немного света от объекта (сфера в моем случае, это столб с ручкой и сфера сверху).

Свет должен падать и на другие объекты, но из единственной сферы, как я уже упоминал.

В настоящее время я получаю только окружающий свет.

Я установил клавишу L для отображения молнии, но она показывает только окружающий свет (затемняет сцену), когда я нажимаю клавишу.

вот код

     /// Lights 
    float ambientLight[4] = { 0.35f, 0.35f, 0.35f, 1.0f }; // colour
    float ambientLightOff[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; // colour
    
    float sunLightPos[4] = { 6.f, 15.5f, 5.0f, 0.0f }; // distant above
    float sunLightDif[4] = { 0.8f,0.8f,0.8f,0.8f };
    float sunLightSpec[4] = { 0.8f,0.8f,0.8f,0.8f }; // colour
    float sunLightAmb[4] = { 0.1f,0.1f,0.1f,0.0f }; // colour
    
    
    // materials 
    
    
    float   wooddif1[] = { 0.647059f, 0.164706f, 0.164706f , 1.0f };
    float   woodamb1[] = { 0.41f, 0.164706f, 0.164706f, 1.0f };
    float   woodspe1[] = { 0.547059f, 0.364706f, 0.264706f, 1.0f };
    float   woodshiny1 = 60;
    
    bool showNormals = TRUE;
    bool lighting = false;
    bool texture = false;
    bool ambientlighting = true;
    bool sunlighting = false;
    bool buildinglighting = false;
    static GLfloat  lightIntensity = 0.5;
    bool whereLights = true;

    void drawpole()
    
    {
        
        glColor3f(0.5f, 0.35f, 0.05f);
        glTranslatef(0, 1, 0);
        drawCylinder3();
        glColor3f(0.5f, 0.35f, 0.05f);
        glTranslatef(0, 1, 0);
        drawCylinder3();
    
        glPushMatrix();
        //glTranslatef(light2Pos[0],0, light2Pos[2]);
        //glTranslatef(25, 0, 13);
        glColor3f(0.3, 0.4, 0.1);
        if (lighting) { setMaterial(4); }
    
        drawSphere();
        glPopMatrix();
        
        
    }

 void setLights()
    {
        if (lighting)
        {
            glEnable(GL_LIGHTING);
            glEnable(GL_NORMALIZE);
            //setShademodel();
        }
        else glDisable(GL_LIGHTING);
        if (sunlighting)
        {
        }
        else glDisable(GL_LIGHT0);
        //if (buildinglighting)

        if (ambientlighting)
        {
        }
        else
        {
        }
    }
    void drawLightPlaces()
    {
        //draw the lights at position

        glDisable(GL_LIGHTING);
        if (lighting) glEnable(GL_LIGHTING);
    }
  

Редактировать (связано с комментарием).

 void drawpole()

    {

        glColor3f(0.5f, 0.35f, 0.05f);
        glTranslatef(0, 1, 0);
        drawCylinder3();
        glColor3f(0.5f, 0.35f, 0.05f);
        glTranslatef(0, 1, 0);
        drawCylinder3();

        glPushMatrix();
        glColor3f(0.5f, 0.35f, 0.05f);
        if (buildinglighting) {
            glDisable(GL_LIGHTING);
            
            glColor3f(1.0, 1.0, 1.0);
            setMaterial(4);
        }
        

        drawSphere();
        glPopMatrix();

    }
   
    void setLights()
    {
        if (lighting)
        {
            glEnable(GL_LIGHTING); 

        }
       else glDisable(GL_LIGHTING);


        if (sunlighting)
        {
            sunlighting;
        }
        else glDisable(GL_LIGHT0);
        
        
        if (buildinglighting)
        {
           // glLightfv(GL_LIGHT0, GL_POSITION, light_position);
            //glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
            glShadeModel(GL_SMOOTH);
            glEnable(GL_LIGHTING);
            glEnable(GL_LIGHT0);
            //glEnable(GL_DEPTH_TEST);
            


        }
        if (ambientlighting)
        {
            glEnable(GL_LIGHTING);
            
            glEnable(GL_COLOR_MATERIAL);
            glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
            glEnable(GL_NORMALIZE);
            setShademodel();
            //glDisable(GL_LIGHTING);
        }
        else 
        {
        }
    }


float   wooddif1[] = { 0.647059f, 0.164706f, 0.164706f , 1.0f };
float   woodamb1[] = { 0.41f, 0.164706f, 0.164706f, 1.0f };
float   woodspe1[] = { 0.547059f, 0.364706f, 0.264706f, 1.0f };
float   woodshiny1 = 60;

    void setMaterial(int m) // 1=plane 2= 3=ground 4=wood 5=roof 6=wood2 7=
    {
        if (m == 1)
        {
            glMaterialfv(GL_FRONT, GL_AMBIENT, woodamb1);
            glMaterialfv(GL_FRONT, GL_DIFFUSE, wooddif1);
            glMaterialfv(GL_FRONT, GL_SPECULAR, woodspe1);
            glMaterialf(GL_FRONT, GL_SHININESS, woodshiny1);
        }
        if (m == 2) //  2
        {
        }
    }


    
  

Ответ №1:

Дикое предположение: glEnable(GL_LIGHT0) в вашем коде отсутствует (по крайней мере, в опубликованной части).

На всякий случай также glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); может быть полезно убедиться, что обратные треугольники освещены.

После этого параметры GL_SHININESS и GL_SPECULAR должны быть изменены, чтобы получить такие блики.

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

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

2. Модель GL light имеет ряд параметров, среди которых есть fallofs. Покажите нам картинку, которую вы получаете прямо сейчас, чтобы мы могли угадать параметры. Кстати, код setMaterial был бы полезен. Возможно, вы неправильно используете параметры ambientLightOff

3. Где находятся вызовы glMaterialfv() ? И каковы их параметры.

4. Вот видео … в основном я хотел добавить несколько источников света при запуске B button..it в основном это функция освещения здания .. я хочу осветить его так, чтобы казалось, что он излучает от столба, который я добавил в виде белой сферы, когда активируется рассеянный свет. это работает, но не так, как я хотел на картинке.

5. Я видел видео, и оно, очевидно, не показывает зеркальных бликов (что вам и нужно), поэтому для дальнейшего изучения необходим источник функции setMaterial и точное использование ваших параметров освещения