OpenGL: два тела с двумя независимыми источниками света, вращающимися вокруг них

Я новичок в 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();
}

3

Решение

Я считаю, что проблема более концептуальная. OpenGL с состоянием. На практике это означает, что вы изменяете состояние, рисуете что-то, снова изменяете состояние, рисуете что-то еще. Состояние OpenGL 1.x включает в себя стек матрицы, материалы и источники света.

Я верю, что вы хотите добавить новый световой объект, затем добавить новый объект для рисования, а затем сделать это в OpenGL. Это не то, как работает OpenGL. В OpenGL нет реальных объектов.

Что происходит, когда вы что-то рисуете, например с glutSolidTorusявляется то, что OpenGL помещает пиксели в буферы, включая экран. Чтобы определить цвет этих пикселей, он смотрит на состояние, в котором вы его поместили ранее. Таким образом, чтобы нарисовать два объекта, вы должны сначала настроить освещение, материал, положение для первого объекта, вызвать glutSolidTorusзатем настройте освещение, материал, позицию для второго объекта, позвоните glutSolidSphere, Обратите внимание, что вам не нужно «добавлять новый материал» или «добавлять новый свет» для рендеринга сферы. Все, что вам нужно сделать, это изменить состояние перед рендерингом, например, двигая GL_LIGHT0 в другую позицию.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]