[英]What is the proper way to update a Geometry surface in iOS 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_viewTransform
和u_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.