ПРИМЕЧАНИЕ. Я подозреваю, что, возможно, есть более простые / более красивые способы решения этой проблемы, чем непрозрачность.В частности, обратите внимание, что частично непрозрачные здания будут показывать другие здания позади них.Чтобы решить эту проблему, рассмотрите возможность использования градиента или другого фона сцены и выбора цвета тумана, чтобы соответствовать этому, вместо использования непрозрачности.Но ради того, чтобы попробовать это ...
Вот как можно изменить непрозрачность объекта в зависимости от его расстояния.На самом деле это не требует THREE.Fog
, я не уверен, как вы будете использовать данные тумана напрямую.Вместо этого я буду использовать THREE.NodeMaterial
, что (по состоянию на three.js r96) довольно экспериментально.В качестве альтернативы можно написать собственный шейдер с THREE.ShaderMaterial
, что тоже хорошо.
const material = new THREE.StandardNodeMaterial();
material.transparent = true;
material.color = new THREE.ColorNode( 0xeeeeee );
// Calculate alpha of each fragment roughly as:
// alpha = 1.0 - saturate( distance / cutoff )
//
// Technically this is distance from the origin, for the demo, but
// distance from a custom THREE.Vector3Node would work just as well.
const distance = new THREE.Math2Node(
new THREE.PositionNode( THREE.PositionNode.WORLD ),
new THREE.PositionNode( THREE.PositionNode.WORLD ),
THREE.Math2Node.DOT
);
const normalizedDistance = new THREE.Math1Node(
new THREE.OperatorNode(
distance,
new THREE.FloatNode( 50 * 50 ),
THREE.OperatorNode.DIV
),
THREE.Math1Node.SAT
);
material.alpha = new THREE.OperatorNode(
new THREE.FloatNode( 1.0 ),
normalizedDistance,
THREE.OperatorNode.SUB
);
Демонстрация: https://jsfiddle.net/donmccurdy/1L4s9e0c/
Снимок экрана: