как получить прожектор в opengl?

ссылка
http://www.chai3d.org/doc/classc_light.html

код

    light2->setPos(cVector3d( 0, 0,0.0));  // position the light source
light2->m_ambient.set(0.8, 0.8, 0.8);
light2->m_diffuse.set(0.8, 0.8, 0.8);
light2->m_specular.set(0.8, 0.8, 0.8);
light2->setDirectionalLight(false);//make a positional light

код рендеринга, который использует OpenGL

void cLight::renderLightSource()
{
// check if light source enabled
if (m_enabled == false)
{
// disable OpenGL light source
glDisable(m_glLightNumber);
return;
}

computeGlobalCurrentObjectOnly();

// enable this light in OpenGL
glEnable(m_glLightNumber);

// set lighting components
glLightfv(m_glLightNumber, GL_AMBIENT,  m_ambient.pColor());
glLightfv(m_glLightNumber, GL_DIFFUSE,  m_diffuse.pColor() );
glLightfv(m_glLightNumber, GL_SPECULAR, m_specular.pColor());

// position the light source in (global) space (because we're not
// _rendered_ as part of the scene graph)
float position[4];

position[0] = (float)m_globalPos.x;
position[1] = (float)m_globalPos.y;
position[2] = (float)m_globalPos.z;
//position[0] = (float)m_localPos.x;
//position[1] = (float)m_localPos.y;
//position[2] = (float)m_localPos.z;

// Directional light source...
if (m_directionalLight) position[3] = 0.0f;

// Positional light source...
else position[3] = 1.0f;

glLightfv(m_glLightNumber, GL_POSITION, (const float *)&position);

// set cutoff angle
glLightf(m_glLightNumber, GL_SPOT_CUTOFF, m_cutOffAngle);

// set the direction of my light beam, if I'm a _positional_ spotlight
if (m_directionalLight == false)
{
cVector3d dir = m_globalRot.getCol0();
float direction[4];
direction[0] = (float)dir.x;
direction[1] = (float)dir.y;
direction[2] = (float)dir.z;
direction[3] = 0.0f;
glLightfv(m_glLightNumber, GL_SPOT_DIRECTION, (const float *)&direction);
}

// set attenuation factors
glLightf(m_glLightNumber, GL_CONSTANT_ATTENUATION, m_attConstant);
glLightf(m_glLightNumber, GL_LINEAR_ATTENUATION, m_attLinear);
glLightf(m_glLightNumber, GL_QUADRATIC_ATTENUATION, m_attQuadratic);

// set exponent factor
glLightf(m_glLightNumber, GL_SPOT_EXPONENT, m_spotExponent);
}

почему все мое окружение освещается равномерно?
как получить концентрированный свет вокруг источника 0,0,0, который исчезает через 1 или 2 единицы расстояния? Мое происхождение — средний куб в сетке.введите описание изображения здесь

2

Решение

caveat emptor: Это «от макушки головы» с давних времен, когда я возился с OpenGL.

Я думаю, что концепция OpenGL «направленного света» является своего рода точечным источником света на бесконечности, то есть вектор света инвариантен по всей сцене.

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

Я помню, как читал урок об этом один раз, буду искать …

Правильно, это описано Вот
Прокрутите вниз до описания «прожекторов».

В коде, который вы перечислили, я считаю, что вы должны убедиться, что m_spotExponent больше нуля, чтобы получить эффект «конуса». Более высокие значения дают «более четкий» переход от «светлых» к «темным» частям конуса (я думаю).

надеюсь, это поможет

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector