使用正交凸轮在多边形面上没有立方体贴图 ("material.envMap") 反射

No cubemap ("material.envMap") reflection on polygon faces with orthographic cam

为什么 MeshPhongMaterialenvMap 属性 在通过正交相机查看时无法处理多边形面孔?

例如,它适用于球体,但不适用于二十面体几何。如果我将 IcosahedronGeometry 的 detail parameter 设置为 2+(更多面),envMap 开始显示。但是,如果我切换到透视凸轮,即使 detail 为 0,envMap 也是完全可见的。

这是透视凸轮的样子,注意一些云的立方体贴图反射:

这是正交凸轮的样子,detail 为 0,注意缺少立方体贴图反射(请忽略图像的变形):

正交凸轮,detail为1;立方体贴图反射回来了:

这两个版本的脚本之间的唯一区别是相机。

这是我用来创建这个对象的代码:

import uvGridImg from './img/grid.png';
import nxImg from './img/nx_50.png';
import pxImg from './img/px_50.png';
import nyImg from './img/ny_50.png';
import pyImg from './img/py_50.png';
import nzImg from './img/nz_50.png';
import pzImg from './img/pz_50.png';

const envTexture = new THREE.CubeTextureLoader().load([
    pxImg, //right
    nxImg, //left
    pyImg, //top
    nyImg, //bottom
    pzImg, //back
    nzImg, //front
])
envTexture.mapping = THREE.CubeReflectionMapping
const texture = new THREE.TextureLoader().load(uvGridImg)
const icosahedronGeometry = new THREE.IcosahedronGeometry(1, 0)
const material = new THREE.MeshPhongMaterial()
material.map = texture;
material.envMap = envTexture;

///An attempt to explicitly set every potentially relevant property...

material.envMapIntensity = 0.0;
material.transparent = false;
material.opacity = 1.0;
material.depthTest = true;
material.depthWrite = true;
material.alphaTest = 0.0;
material.visible = true;
material.side = THREE.FrontSide;
material.flatShading=true;
material.roughness = 0.0;
material.color.setHex(0xffffff);
material.emissive.setHex(0x0);
material.specular.setHex(0xffffff);
material.shininess = 30.0;
material.wireframe = false;
material.flatShading = false;
material.combine = THREE.MultiplyOperation;
material.reflectivity = 1.0;
material.refractionRatio = 1.0;
const icosahedron = new THREE.Mesh(icosahedronGeometry, material)
icosahedron.position.x = 0
scene.add(icosahedron);

对于 MVCE,请see the example from this tutorial (you will have to add your own orthographic cam to compare with the given perspective cam). Here are image files 纹理。

更新 似乎所有非球形几何体都无法通过正交凸轮正确渲染立方体贴图反射。平面、圆柱体、盒子几何体都无法渲染环境贴图反射,只能将整个面部涂成一种统一的反射颜色。球体、车床、*hedron 几何体(在高细节层次上)将渲染立方体贴图反射。

有什么办法解决这个问题吗?在使用正交相机时,这似乎是一个巨大的限制。

这是预期的行为。

  • 对于透视相机,反射“光线”随着距离相机的距离越来越远而分开,从而反射更宽角度的 envMap。
  • 使用正交相机时,这些反射“光线”不会分开,因为它们是平行的。所以平面上的反射是envMap的一个非常窄的角度。

查看我快速整理的演示,以演示您所看到的内容:

  • 它似乎适用于球体,因为当平行正交“射线”从圆形表面反弹时,这些射线会变宽。它们不再平行(透视相机就是这种情况)。

您可以看到反射在您的演示中仍然有效,因为当您旋转它们时,面部会在明暗之间交替。您只是在查看 envMap 的一个更窄的部分: