繁体   English   中英

如何确定Scenekit中几何图形表面的方向

[英]How to determine the orientation of a geometry surface in Scenekit

我正在尝试编写着色器以着色SceneKit中的自定义几何。 我要设置颜色,以使面向上的水平表面为白色,面向下的水平表面为黑色,而介于两者之间的所有其他表面根据其方向都是灰色阴影。 我使用了材质的表面入口点来调用以下着色器

vec4 normal = vec4(_surface.normal, 1.0);

// Assume value is [-1, 1], scale to [0, 1]
float color = normal.z * 0.5 + 0.5;

_surface.diffuse = vec4(color, color, color, 1.0);

看来normal.z是相对于相机(或视图)的。 我假设我需要转换值,以便它在另一个空间中。 我尝试了多个转换(以及转换的组合),例如u_inverseViewTransform ,但是结果似乎都在视图空间中。 有谁知道如何根据其表面的方向为几何着色?

由于_surface.normal是视图空间中的向量,因此必须将向量转换为世界空间。

点形式的世界空间到视图空间的转换是通过u_viewTransform完成的,因此逆操作(从视图空间到世界空间)可以通过u_inverseViewTransform完成。

_surface.normal是方向矢量,但不是点。 必须使用法线矩阵转换向量,该法线矩阵是4 * 4矩阵左上3 * 3矩阵的逆矩阵:

transpose(inverse(mat3(u_viewTransform)))

请参见为什么将模型视图矩阵的转置逆用于转换法向量? 为什么要用modelview矩阵的逆转置来转换法线?

但是由于u_viewTransformu_inverseViewTransform正交矩阵,所以转置后,可以跳过逆,因为逆矩阵和转置矩阵相等。 请参阅在哪种情况下逆矩阵等于转置矩阵?

接下来,您必须通过mat3(u_inverseViewTransform)进行变换:

vec3 normal = mat3(u_inverseViewTransform) * _surface.normal;

float color = normal.z * 0.5 + 0.5;

_surface.diffuse = vec4(color, color, color, 1.0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM