Самостоятельное отражение в three.js - PullRequest
0 голосов
/ 04 ноября 2018

Как сделать часть объекта видимой при отражении на другой части того же объекта?

Teapot example image

1 Ответ

0 голосов
/ 27 июня 2019

Threejs не является движком трассировки лучей. Поэтому он не использует реальные лучи для расчета отражений на поверхностях. Фактически он рендерит другие объекты на ваш отражающий объект.

Чего не хватает вашей сцене, так это зеркального эффекта бесконечности между поверхностями, где световые лучи могут отражаться от двух отражающих поверхностей несколько раз. Это то, что сделал бы механизм трассировки лучей.

Вы можете попытаться подделать это. Просто разделите вашу геометрию на несколько объектов и используйте для них дополнительные камеры, чтобы визуализировать сцену, глядя из отражающего объекта на сцену, и использовать ее в качестве текстуры для объекта.
Вы можете использовать этот пример в качестве отправной точки: https://threejs.org/examples/#webgl_materials_cubemap_dynamic

Вот пример материала с динамической текстурой окружения, захваченного CubeCamera:

var near = 1
var far = 100
var cubeResolution = 128
var camera1 = new THREE.CubeCamera( near, far, cubeResolution);
camera1.renderTarget.texture.generateMipmaps = true;
camera1.renderTarget.texture.minFilter = THREE.LinearMipMapLinearFilter;
scene.add( camera1 );

var material = new THREE.MeshBasicMaterial( { envMap: camera1.renderTarget.texture } );
var cube = new THREE.Mesh( new THREE.BoxBufferGeometry( 20, 20, 20 ), material );
scene.add(cube)

...