首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定Scenekit中几何曲面的方向

如何确定Scenekit中几何曲面的方向
EN

Stack Overflow用户
提问于 2018-12-15 18:16:10
回答 1查看 314关注 0票数 1

我试图写一个着色器,以着色自定义几何在SceneKit。我想设置颜色,这样水平表面朝上的是白色的,向下的水平表面是黑色的,而中间的所有其他表面都是基于它们的方向的灰色阴影。我使用材料的表面入口点来调用下面的着色器

代码语言:javascript
复制
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,但是结果似乎都在视图空间中。有谁知道如何根据几何图形的表面方向给其着色吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-15 21:17:31

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

一个点从世界空间到视图空间的转换是由u_viewTransform完成的,所以从视图空间到世界空间的逆运算可以由u_inverseViewTransform完成。

_surface.normal是一个方向向量,但不是一个点。向量必须由法线矩阵变换,法矩阵是4×4矩阵的左上角3×3矩阵的转置逆:

代码语言:javascript
复制
transpose(inverse(mat3(u_viewTransform)))

为什么用于转换法向量的模型视图矩阵的换位逆?为什么要用模型视图矩阵的逆转置来转换法线?

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

如下所示,您必须通过mat3(u_inverseViewTransform)进行转换

代码语言:javascript
复制
vec3 normal = mat3(u_inverseViewTransform) * _surface.normal;

float color = normal.z * 0.5 + 0.5;

_surface.diffuse = vec4(color, color, color, 1.0);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53795957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档