Three.js中的自我反思

时间:2018-11-04 09:25:07

标签: three.js pythreejs

如何使对象的一部分在同一对象的另一部分的反射中可见?

Teapot example image

1 个答案:

答案 0 :(得分:1)

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)