0

通过使用 Skybox Cube / 环境映射,我能够制作出一些漂亮的金属和玻璃材质。

我已经制作了自己的控件,可以像在 FirstPersonControls 中一样进行轨道和移动/环顾四周。

问题是,当我四处走动时,反射看起来很有说服力——我可以看到反射移动并随着我的相机移动而变化。然而,当我环顾四周(旋转相机/改变它的目标)时,反射没有变化,它们只是静态的。

我可以在例如 three.js/examples/webgl_materials_cubemap_escher.html 中看到相同的行为 - 如果我将其修改为使用 FirstPersonControls,则当我环顾四周时,材料看起来根本不会反射/折射。

这是我设置立方体贴图的方法,老实说,它是从一些示例中复制而来的,我并不完全理解。但它有效,除了这个问题......

createSkyBox = function(urlPrefix) {
var sceneCube = new THREE.Scene();
var path = urlPrefix;
var format = '.jpg';
var urls = [
    path + 'px' + format, path + 'nx' + format,
    path + 'py' + format, path + 'ny' + format,
    path + 'pz' + format, path + 'nz' + format
  ];

var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
reflectionCube.format = THREE.RGBFormat;

var refractionCube = new THREE.Texture( reflectionCube.image, new THREE.CubeRefractionMapping() );
refractionCube.format = THREE.RGBFormat;


// Skybox

var shader = THREE.ShaderUtils.lib[ "cube" ];
shader.uniforms[ "tCube" ].value = reflectionCube;

var material = new THREE.ShaderMaterial( {

  fragmentShader: shader.fragmentShader,
  vertexShader: shader.vertexShader,
  uniforms: shader.uniforms,
  depthWrite: false,
  side: THREE.BackSide

} );
var size = 8000;
mesh = new THREE.Mesh( new THREE.CubeGeometry( size, size, size ), material );
mesh.geometry.computeBoundingBox();
sceneCube.add( mesh );

this._threejs_cube_scene = sceneCube;
this._threejs_cube_mesh = mesh;
this._threejs_envmap = reflectionCube;
this._threejs_envmap_refraction = refractionCube;

this._threejs_scene.add( sceneCube );  
}

这是我创建材料的方式:

var material = new THREE.MeshLambertMaterial( { color: 0xff00, ambient: 0xaaaaaa, envMap: this._threejs_envmap});

然后我在 renderer.overrideMaterial 中使用材质(我使用的是 EffectComposer,如果它有什么不同的话)

编辑:现在我想起来了,我不确定..我的大脑融化了..这可能是现实生活的运作方式:) 至少直观地当我看到代码在运行时,旋转相机时的静态不会感觉对。但也许是因为在现实生活中很难环顾四周 (eye.lookAt()) 而不会稍微移动 (eye.position = xyz)。

4

2 回答 2

1

您应该计算世界空间中的反射向量(在您未在此处显示的“fragmentShader”的代码中)。如果它在对象空间或视图(相机)空间中,它不会自然移动。

是的,这可能意味着对表面法线进行一些调整。要将对象空间法线转换为世界空间法线,请使用世界矩阵的逆转置。您还需要获取世界空间坐标中的视图矢量,以计算最终的世界空间反射矢量。

于 2012-12-03T22:55:09.383 回答
0

要考虑的另一件事比更改着色器更简单,如果您希望它像人头一样旋转,可能会给您的相机一个偏移量。将其添加到 Object3d 并将其设置为从 Object3d 的位置偏移少量(相当于从人体中心到眼睛的距离),然后旋转 Object3d 而不是相机。

从你的描述中很难说出你想要什么效果,因为当你只是转动你的眼球时,反射不会改变。改变它的是你头部的轻微倾斜。

于 2013-06-22T12:47:29.753 回答