������ 14/16/20/40/44: vehicle, ����, ����������, damage floaters, ��������� #20
@ -1735,9 +1735,9 @@ export class BabylonScene {
|
|||||||
const csm = new CascadedShadowGenerator(size, this._sunLight);
|
const csm = new CascadedShadowGenerator(size, this._sunLight);
|
||||||
csm.numCascades = numCascades;
|
csm.numCascades = numCascades;
|
||||||
csm.stabilizeCascades = true;
|
csm.stabilizeCascades = true;
|
||||||
csm.lambda = 0.8;
|
csm.lambda = 0.6;
|
||||||
csm.cascadeBlendPercentage = 0.07;
|
csm.cascadeBlendPercentage = 0.1;
|
||||||
csm.shadowMaxZ = (q === 'high') ? 200 : 120;
|
csm.shadowMaxZ = (q === 'high') ? 90 : 60;
|
||||||
csm.bias = PCF_BIAS;
|
csm.bias = PCF_BIAS;
|
||||||
csm.normalBias = PCF_NORMAL_BIAS;
|
csm.normalBias = PCF_NORMAL_BIAS;
|
||||||
csm.usePercentageCloserFiltering = true;
|
csm.usePercentageCloserFiltering = true;
|
||||||
@ -1745,8 +1745,8 @@ export class BabylonScene {
|
|||||||
? ShadowGenerator.QUALITY_HIGH
|
? ShadowGenerator.QUALITY_HIGH
|
||||||
: ShadowGenerator.QUALITY_MEDIUM;
|
: ShadowGenerator.QUALITY_MEDIUM;
|
||||||
csm.darkness = 0.4;
|
csm.darkness = 0.4;
|
||||||
csm.autoCalcDepthBounds = true;
|
csm.autoCalcDepthBounds = false;
|
||||||
csm.frustumEdgeFalloff = 8; // убирает «полосу-хвост» тени игрока
|
csm.frustumEdgeFalloff = 12; // убирает «полосу-хвост» тени игрока
|
||||||
this._shadowGenerator = csm;
|
this._shadowGenerator = csm;
|
||||||
} else {
|
} else {
|
||||||
// Обычный ShadowGenerator. Soft теперь 2048 (было 1024).
|
// Обычный ShadowGenerator. Soft теперь 2048 (было 1024).
|
||||||
|
|||||||
@ -391,13 +391,18 @@ export class NpcManager {
|
|||||||
if (root._isWorldMatrixFrozen) {
|
if (root._isWorldMatrixFrozen) {
|
||||||
try { root.unfreezeWorldMatrix(); } catch (e) {}
|
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.y = npc.yaw;
|
||||||
|
root.rotation.z = lean;
|
||||||
// data.x/y/z — чтобы scene.find/getPosition видели NPC.
|
// data.x/y/z — чтобы scene.find/getPosition видели NPC.
|
||||||
data.x = npc.x; data.y = npc.y; data.z = npc.z;
|
data.x = npc.x; data.y = npc.y; data.z = npc.z;
|
||||||
|
|
||||||
// Анимация ходьбы — простое покачивание (без R15-скелета у Kenney).
|
|
||||||
if (moving) npc.walkPhase += dt * 6;
|
|
||||||
// R15-NPC (skin_*): процедурная анимация бега/покоя через R15Animator.
|
// R15-NPC (skin_*): процедурная анимация бега/покоя через R15Animator.
|
||||||
if (npc.r15Animator) {
|
if (npc.r15Animator) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user