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 相机旋转)。
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。
下例中 SCNSphere
的法线似乎随着相机的旋转而改变,这似乎不对,表明我误解了一些基本原理。
在放置圆柱体以突出显示 x、y 和 z 轴(分别为红色、绿色和蓝色)和具有单位半径的球体以及以下自定义片段着色器修改器的场景中:
_output.color.rgb = _surface.normal;
位置 (0, 0, 10)
的相机(即沿 z 轴)呈现以下内容:
这看起来是正确的,因为在 x、y 和 z 轴上向外投影的法线分别是红色、绿色和蓝色,并且具有预期的渐变。但是,如果我们随后将相机旋转到 (10, 0, 0)
位置(即沿 x 轴),这就是渲染的场景:
这表明法线已经改变,因为渐变不再对应于坐标 space 中的预期方向(事实上,这种颜色模式适用于 any 相机旋转)。
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。