2011-04-12 4 views
1

내가 유니의 과정에 대한 간단한 무언가를 구축을 위해 노력하고있어 난 그냥 불을 시도했지만, 빛이 완전히 성가신 카메라와 함께 회전하는 것와 함께 회전OpenGL을 조명 ... 카메라

페이스트 인 (pastech)을 사용하여 아래 코드를 붙여 넣었습니다. (페이지가 늘어나지 않도록) 그러나 약간의 설명도 있습니다 :

라이트를 Display :: Init에 추가했습니다 (PoolLight 클래스 사용). 카메라가 Display :: Resize에 설정되어 있습니다. '풀 테이블'위에 (0, 0, 80), 아래쪽 (0, 0, -1), X 축이 앞/위 (1, 0, 0)로 표시됩니다.

카메라의 간단한 이동과 회전은 조명을 조정하지만 기하학을 조정하지 않습니다 (또는 조명이 아닌 기하학을 조정할 수도 있음).

나는 다른 문제에 관해서도 같은 문제에 관해서 읽었지만, 너무 잘 이해하지 못한다. 나는 누군가가 그것을 더 간단한 용어로 나에게 설명 할 수 있기를 바라고, 또는 내가 실수로 제외시킨 명백한 것을 발견 할 수 있기를 바라고있다.

어쨌든, 여기에 코드입니다 :

Main Display Class

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); 
} 

답변

3

카메라 위치를 변경 한 후, 빛의 세계 좌표를 다시 glLightfv(lightNumber, GL_POSITION, position)를 호출합니다. 그런 다음 장면을 그립니다.