SceneKit 球体法线似乎随着相机移动而改变?

SceneKit sphere normals appear to change as the camera moves?

下例中 SCNSphere 的法线似乎随着相机的旋转而改变,这似乎不对,表明我误解了一些基本原理。

在放置圆柱体以突出显示 x、y 和 z 轴(分别为红色、绿色和蓝色)和具有单位半径的球体以及以下自定义片段着色器修改器的场景中:

_output.color.rgb = _surface.normal;

位置 (0, 0, 10) 的相机(即沿 z 轴)呈现以下内容:

这看起来是正确的,因为在 x、y 和 z 轴上向外投影的法线分别是红色、绿色和蓝色,并且具有预期的渐变。但是,如果我们随后将相机旋转到 (10, 0, 0) 位置(即沿 x 轴),这就是渲染的场景:

这表明法线已经改变,因为渐变不再对应于坐标 space 中的预期方向(事实上,这种颜色模式适用于 any 相机旋转)。

来自documentation

Geometric fields (such as position and normal) are expressed in view space. You can use SceneKit’s uniforms (such as u_inverseViewTransform) to operate in a different coordinate space, but you must convert back to view space before writing results.

所以法线是在相机坐标系中表示的,而不是在物体或世界中space。