通过使用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)。答案 0 :(得分:1)
你应该计算世界空间中的反射向量(在你的代码中为' fragmentShader'你不会在这里显示)。如果它在对象空间或视图(相机)空间中,它就不会自然移动。
是的,这可能意味着一些与表面法线的混合。要将对象空间法线转换为世界空间法线,请使用世界矩阵的逆转置。您还需要在世界空间坐标中获取视图矢量,以便计算最终的世界空间反射矢量。
答案 1 :(得分:0)
另一件需要考虑的事情就是更改着色器可能会让你的相机偏移,如果你想让它像人头一样旋转。将它添加到Object3d并将其设置为从Object3d的位置偏移一小量(相当于从人体中心到眼睛的距离的量)然后旋转Object3d而不是相机。
根据你的描述,很难说出你想要的效果,因为当你只是转动你的眼球时,反射不会改变。这是你的头部轻微倾斜改变它。