Вероятно, это связано с тем, что позиция Y вашего источника света (в вашем примере это намного больше расстояния между глазом и сценой) слишком велика для размера Z вашего объема тени (размера вашего объема тени в направление взгляда.) Здесь, если posY находится внутри каркасной рамки:
Но если вы увеличите posY слишком сильно (т.е. ваши фигуры выходят из теневого объема, они исчезают
Таким образом, вы должны увеличить размер вашего теневого объема (или уменьшить вашу сцену в любом случае.) Вы не можете моделировать это с помощью ползунка, потому что они просто дают вам контроль над двумя размеры X и Y размеры: projWidth и projHeight.
т.е. в последнем коде на странице учебника последний параметр ("far"), например, изменит его с 10 на 100
const lightProjectionMatrix = settings.perspective
? m4.perspective(
degToRad(settings.fieldOfView),
settings.projWidth / settings.projHeight,
0.5, // near
10) // far
: m4.orthographic(
-settings.projWidth / 2, // left
settings.projWidth / 2, // right
-settings.projHeight / 2, // bottom
settings.projHeight / 2, // top
0.5, // near
100); // far
Тогда вы можете увеличить posY гораздо больше:
без вашего полного кода, вам трудно воспроизвести и помочь вам. Не могли бы вы попытаться только в вставить вашу сцену в учебный код? Вы можете связать точку обзора с источником и ориентацией света, используя те же входные данные: (просто добавив 0,5 к X, чтобы увидеть немного тени и убедиться, что он правильно рассчитан.)
/*const cameraPosition = [settings.cameraX, settings.cameraY, 15];*/
const cameraPosition = [settings.posX+0.5, settings.posY, settings.posZ];
/*const target = [0, 0, 0]; */
const target = [settings.targetX, settings.targetY, settings.targetZ];