簡體   English   中英

OpenGL:兩個物體,兩個獨立的光源圍繞它們旋轉

[英]OpenGL: two bodies with two independent sources of light rotating around them

我是OpenGL的新手。 我想寫一個程序,顯示兩種不同顏色的形狀,一個圓環和一個球體,以及兩個圍繞它們旋轉的獨立光源。

到目前為止,我已經有了這個代碼,它可以很好地圍繞Torus旋轉光源。 但是我無法弄清楚如何添加一個Sphere和一個圍繞它旋轉的新光源。

編輯:

這是我的整個代碼。 按下鍵盤上的's'或'd'鍵時,指示燈會旋轉

#include "stdafx.h"
#include <windows.h>
#include <glut.h>

static int spin = 0;
bool updown = false;
bool leftright = false;

GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat yellow[] = { 1.0, 1.0, 0.0, 1.0 };
GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat direction[] = { 1.0, 1.0, 1.0, 0.0 };
GLfloat direction2[] = { 1.0, 0.0, 0.0, 0.0 };

void display() {
    GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan);
    glMaterialfv(GL_FRONT, GL_SPECULAR, white);
    glMaterialf(GL_FRONT, GL_SHININESS, 30);
    glTranslatef(-2.0, 1.0, 0.0);
    glPushMatrix ();
    if(updown){
        glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);
    }
    if(leftright){
       glRotated ((GLdouble) spin, 0.0, 1.0, 0.0);
    }
    glLightfv (GL_LIGHT0, GL_POSITION, position);

    glTranslated (0.0, 0.0, 1.5);
    glDisable (GL_LIGHTING);
    glColor3f (0.0, 1.0, 1.0);
    glEnable (GL_LIGHTING);
    glPopMatrix();
    glutSolidTorus(0.275, 0.85, 16, 40);
    glPopMatrix();
    glFlush();
}

void reshape(GLint w, GLint h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    GLfloat aspect = GLfloat(w) / GLfloat(h);
    glLoadIdentity();
    if (w <= h) {
        glOrtho(-2.5, 2.5, -2.5/aspect, 2.5/aspect, -10.0, 10.0);
    } else {
        glOrtho(-2.5*aspect, 2.5*aspect, -2.5, 2.5, -10.0, 10.0);
    }
}
void init() {
    glLightfv(GL_LIGHT0, GL_AMBIENT, black);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, yellow);
    glLightfv(GL_LIGHT0, GL_SPECULAR, white);

    glEnable(GL_LIGHTING);                
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);              
}

void keyboard(unsigned char button, int x, int y)
{
    switch (button) {
        case 's':
            updown = true;
            leftright = false;
            spin = (spin + 30) % 360;
            glutPostRedisplay();
            break;
        case 'd':
            updown = false;
            leftright = true;
            spin = (spin + 30) % 360;
            glutPostRedisplay();
            break;
        default:
            break;
   }
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowPosition(80, 80);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Shapes and light");
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(display);
    init();
    glutMainLoop();
}

我認為問題更具概念性。 OpenGL是有狀態的。 在實踐中,這意味着你修改狀態,繪制一些東西,再次修改狀態,繪制其他東西。 OpenGL 1.x的狀態包括矩陣堆棧,材料和燈光。

我相信你的想法,你想添加一個新的光對象,然后添加一個新的對象來繪制,然后讓OpenGL渲染。 這不是OpenGL的工作原理。 OpenGL中沒有真正的對象。

當您繪制某些東西時會發生什么,例如使用glutSolidTorus ,OpenGL會將像素放入緩沖區,包括屏幕。 要確定這些像素的顏色,它會查看您之前放入的狀態。 因此,為了繪制兩個對象,首先要為第一個對象設置光照,材質,位置,調用glutSolidTorus ,然后設置第二個對象的光照,材質,位置,調用glutSolidSphere 請注意,您無需“添加新材質”或“添加新光源”來渲染球體。 您需要做的就是在渲染之前更改狀態,例如將GL_LIGHT0移動到其他位置。

暫無
暫無

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

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