簡體   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