【问题标题】:How to add reflectionMaterial for an object in threejs如何在三个js中为对象添加反射材质
【发布时间】:2014-07-03 20:54:04
【问题描述】:

如何使用环境贴图添加反射材质,我使用两个相机和两个场景来实现它,基于webgl_materials_cubemap

并且正在使用使用 OBJMTLLoder 加载的对象,我可以在我的场景中看到环境贴图和对象,但是环境的反射在对象上不起作用..

在下面找到我的代码:

var urls = [
    'textures/cube/canary/pos-x.png',
    'textures/cube/canary/neg-x.png',
    'textures/cube/canary/pos-y.png',
    'textures/cube/canary/neg-y.png',
    'textures/cube/canary/pos-z.png',
    'textures/cube/canary/neg-z.png'
  ];


var cubemap = THREE.ImageUtils.loadTextureCube(urls); // load textures
cubemap.format = THREE.RGBFormat;

var shader = THREE.ShaderLib['cube']; // init cube shader from built-in lib
shader.uniforms['tCube'].value = cubemap; // apply textures to shader

// create shader material
var skyBoxMaterial = new THREE.ShaderMaterial( {
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: shader.uniforms,
depthWrite: false,
side: THREE.BackSide
});

skybox = new THREE.Mesh( new THREE.BoxGeometry( 1000, 1000, 1000 ), skyBoxMaterial );
scene.add( skybox );


var object = scene.getObjectByName ("myname", true);

object.traverse( function ( child ) {

if ( child instanceof THREE.Mesh )
{
//child.geometry.computeFaceNormals();
var  geometry = child.geometry;

var reflectionMaterial = new THREE.MeshBasicMaterial({
color: 0xcccccc,
envMap: cubemap
});

mesh = new THREE.Mesh(geometry, reflectionMaterial);
sceneCube.add(mesh);


}
});

这里只是将scene.add(mesh); 更改为sceneCube.add(mesh); 反射有效,但相机没有..

你可以在这里看到差异

Example 1 Example 2

在第一个演示中,您可以看到场景在环境中运行良好且没有对象反射

在第二个中,您可以看到反射工作正常,但相机行为已连接

【问题讨论】:

    标签: three.js


    【解决方案1】:

    我自己通过在对象遍历中添加以下行来修复它

    child.material.map = reflectionMaterial;
    child.material.needsUpdate = true;
    

    但我不知道我做的是否正确,但它按预期工作,

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 2014-01-31
      • 1970-01-01
      • 2016-03-25
      • 2021-08-14
      • 2015-01-26
      • 2013-02-13
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多