fix(import): mat.ambient = diffuseColor (тень окрашена, не пересвет)

Прошлая итерация без ambient давала почти-чёрные грани в тени —
sun под углом + hemi только вверх = низ/бок граней получают только
скудный hemi.groundColor=(0.3,0.3,0.4) = тёмные пятна.

Roblox-look: тень это просто менее яркий вариант цвета (не чёрный).

Фикс: mat.ambientColor = mat.diffuseColor (= цвет примитива).
scene.ambientColor=(0.3) × ambient(цвет) = 30% цвета в тени.
На прямом свете diffuse доминирует — белые остаются белыми,
зелёные зелёными.

Это даёт тени окрашенные (как в Roblox), сохраняя контраст со
светом и точность цвета.
This commit is contained in:
min 2026-06-08 17:02:08 +03:00
parent 3a82b3c64d
commit 364726481f

View File

@ -506,12 +506,12 @@ export class PrimitiveManager {
_applyMaterial(mesh, typeDef, color, material, textureUrl) { _applyMaterial(mesh, typeDef, color, material, textureUrl) {
const matName = `${mesh.name}_mat`; const matName = `${mesh.name}_mat`;
const mat = new StandardMaterial(matName, this.scene); const mat = new StandardMaterial(matName, this.scene);
mat.diffuseColor = Color3.FromHexString(color || '#888888'); const dc = Color3.FromHexString(color || '#888888');
// ambient НЕ выставляем — иначе scene.ambient (0.3) + ambient(0.4-1.0) mat.diffuseColor = dc;
// приплюсовывается к diffuse и цвета становятся пересвеченными // ambient = СОБСТВЕННЫЙ цвет (умеренный). Это даёт цвет в тени
// (особенно белые/серые становятся пересветлёнными). // равный ~30% от собственного, а не белый (как делал ambient=(1,1,1)).
// Babylon default (0,0,0) даёт чистый Lambert: освещённый цвет=diffuse, // На светлом полу: белые цвета остаются белыми, тёмные грани не чёрные.
// тень=чёрная (что в Roblox смягчается scene.ambient). mat.ambientColor = dc;
// Если задан textureUrl — подгружаем PNG как diffuseTexture. Это // Если задан textureUrl — подгружаем PNG как diffuseTexture. Это
// используется для GD-скинов куба (например /gd/skins/cube_smile.png). // используется для GD-скинов куба (например /gd/skins/cube_smile.png).