내가 유니의 과정에 대한 간단한 무언가를 구축을 위해 노력하고있어 난 그냥 불을 시도했지만, 빛이 완전히 성가신 카메라와 함께 회전하는 것와 함께 회전OpenGL을 조명 ... 카메라
페이스트 인 (pastech)을 사용하여 아래 코드를 붙여 넣었습니다. (페이지가 늘어나지 않도록) 그러나 약간의 설명도 있습니다 :
라이트를 Display :: Init에 추가했습니다 (PoolLight 클래스 사용). 카메라가 Display :: Resize에 설정되어 있습니다. '풀 테이블'위에 (0, 0, 80), 아래쪽 (0, 0, -1), X 축이 앞/위 (1, 0, 0)로 표시됩니다.
카메라의 간단한 이동과 회전은 조명을 조정하지만 기하학을 조정하지 않습니다 (또는 조명이 아닌 기하학을 조정할 수도 있음).
나는 다른 문제에 관해서도 같은 문제에 관해서 읽었지만, 너무 잘 이해하지 못한다. 나는 누군가가 그것을 더 간단한 용어로 나에게 설명 할 수 있기를 바라고, 또는 내가 실수로 제외시킨 명백한 것을 발견 할 수 있기를 바라고있다.
어쨌든, 여기에 코드입니다 :
PoolLight 등급 :
#include "PoolLight.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"
PoolLight::PoolLight(GLenum lightNumber, GLenum lightType, float red, float green, float blue, bool distant, float posX, float posY, float posZ)
{
this->lightNumber = lightNumber;
this->lightType = lightType;
color[0] = red; color[1] = green; color[2] = blue; color[3] = 1;
position[0] = posX; position[1] = posY; position[2] = posZ; position[3] = (int) (!distant);
glLightfv(lightNumber, lightType, color);
glLightfv(lightNumber, GL_POSITION, position);
enabled(true);
}
PoolLight::~PoolLight(void)
{
}
void PoolLight::setSpotlight(float angle, float attenuation, float dirX, float dirY, float dirZ) {
glLightf(lightNumber, GL_SPOT_EXPONENT, angle);
glLightf(lightNumber, GL_CONSTANT_ATTENUATION, attenuation);
glLightf(lightNumber, GL_LINEAR_ATTENUATION, 0.0f);
glLightf(lightNumber, GL_QUADRATIC_ATTENUATION, 0.0f);
spotDirection[0] = dirX; spotDirection[1] = dirY; spotDirection[2] = dirZ;
glLightfv(lightNumber, GL_SPOT_DIRECTION, spotDirection);
glLightf(lightNumber, GL_SPOT_CUTOFF, 60);
}
void PoolLight::enabled(bool enabled) {
if (enabled) glEnable(lightNumber);
else glDisable(lightNumber);
}