Сейчас я работаю с картами теней в моем игровом движке. В приведенном ниже коде я вычисляю матрицу 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