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