Как центрировать карту глубины направленного света в положении камеры? - PullRequest
2 голосов
/ 01 апреля 2020

Сейчас я работаю с картами теней в моем игровом движке. В приведенном ниже коде я вычисляю матрицу View-Projection для направленного источника света. У меня фиксированный размер проекционного бокса (= 50), поэтому теперь нужно осветить бокс (-50; 50) во всех направлениях, расположенных в центре мира. Он работает правильно, но я хочу, чтобы он следовал за камерой таким образом, чтобы его положение всегда было центром этой рамки. Как это сделать?

Matrix4x4 DirectionalLight::GetMatrix() const
{
    Vector3 position = Camera::GetPosition();
    float sizeLx = -this->ProjectionSize;
    float sizeRx = +this->ProjectionSize;
    float sizeLy = -this->ProjectionSize;
    float sizeRy = +this->ProjectionSize;
    float sizeLz = -this->ProjectionSize;
    float sizeRz = +this->ProjectionSize;
    Matrix4x4 OrthoProjection = MakeOrthographicMatrix(sizeLx, sizeRx, sizeLy, sizeRy, sizeLz, sizeRz);
    Matrix4x4 LightView = MakeViewMatrix(
        this->Direction,
        MakeVector3(0.0f, 0.0f, 0.0f),
        MakeVector3(0.0f, 1.0f, 0.0f)
    );
    return OrthoProjection * LightView;
}

Я использую glm в качестве математической библиотеки, большинство функций - это псевдонимы / оболочки: MakeOrthographicMatrix - это glm :: ortho, MakeViewMatrix - это glm :: lookAt

...