diff --git a/src/engine/BabylonScene.js b/src/engine/BabylonScene.js index 51cfc10..9017ecf 100644 --- a/src/engine/BabylonScene.js +++ b/src/engine/BabylonScene.js @@ -1735,9 +1735,9 @@ export class BabylonScene { const csm = new CascadedShadowGenerator(size, this._sunLight); csm.numCascades = numCascades; csm.stabilizeCascades = true; - csm.lambda = 0.8; - csm.cascadeBlendPercentage = 0.07; - csm.shadowMaxZ = (q === 'high') ? 200 : 120; + csm.lambda = 0.6; + csm.cascadeBlendPercentage = 0.1; + csm.shadowMaxZ = (q === 'high') ? 90 : 60; csm.bias = PCF_BIAS; csm.normalBias = PCF_NORMAL_BIAS; csm.usePercentageCloserFiltering = true; @@ -1745,8 +1745,8 @@ export class BabylonScene { ? ShadowGenerator.QUALITY_HIGH : ShadowGenerator.QUALITY_MEDIUM; csm.darkness = 0.4; - csm.autoCalcDepthBounds = true; - csm.frustumEdgeFalloff = 8; // убирает «полосу-хвост» тени игрока + csm.autoCalcDepthBounds = false; + csm.frustumEdgeFalloff = 12; // убирает «полосу-хвост» тени игрока this._shadowGenerator = csm; } else { // Обычный ShadowGenerator. Soft теперь 2048 (было 1024). diff --git a/src/engine/NpcManager.js b/src/engine/NpcManager.js index 167c6b4..e6a7b9bf 100644 --- a/src/engine/NpcManager.js +++ b/src/engine/NpcManager.js @@ -391,13 +391,18 @@ export class NpcManager { if (root._isWorldMatrixFrozen) { try { root.unfreezeWorldMatrix(); } catch (e) {} } - root.position.set(npc.x, npc.y, npc.z); + // Процедурная анимация ходьбы (у Kenney-моделей нет скелета). + if (moving) npc.walkPhase += dt * 10; + let bobY = 0, lean = 0; + if (moving && !npc.r15Animator) { + bobY = Math.abs(Math.sin(npc.walkPhase)) * 0.12; + lean = Math.sin(npc.walkPhase) * 0.08; + } + root.position.set(npc.x, npc.y + bobY, npc.z); root.rotation.y = npc.yaw; + root.rotation.z = lean; // data.x/y/z — чтобы scene.find/getPosition видели NPC. data.x = npc.x; data.y = npc.y; data.z = npc.z; - - // Анимация ходьбы — простое покачивание (без R15-скелета у Kenney). - if (moving) npc.walkPhase += dt * 6; // R15-NPC (skin_*): процедурная анимация бега/покоя через R15Animator. if (npc.r15Animator) { try {