2016-12-06 64 views
1

在SceneKit中,您可以將一個lookAtConstraint約束添加到您的SceneView的視點,以使Camera查看某個節點。在SceneKit中,如何讓相機查看節點幾何體的特定面?

有沒有一種標準的方法來做同樣的事情,但對於幾何的特定面?

因此,如果我觸摸立方體的特定面,攝像機會移動,以便攝像機節點的Z軸與觸摸面的法線一致?所以立方體看起來像一個平面,形成了新的視角。

回答

2

這就要求相機的運動,除了重新瞄準它。

想象一下,我在我家門前。我有一個偉大的前方的看法,可以幾乎看不到我的左側。在我的場景中,我點擊房子的一側。 LookAt約束只會改變相機的角度。這將不符合那個幾乎看不見的一面的正常狀態。

爲了與正常對齊,我必須在房子周圍走動,直到我可以盯着房子,並垂直於我挖掘的一側。在什麼半徑?什麼路徑?你必須自己弄清楚。

根據您要嘗試的效果,您可能需要旋轉模型而不是移動相機。在本地(或作爲不可見父節點的子節點)旋轉抽頭節點,以便其負Z軸指示輕敲的臉部,並在節點上保留lookAtConstraint,而不是相機。不過,這種方法會改變對象的外觀:您將看到它旋轉,並且陰影發生適當變化。

+0

謝謝哈爾,有道理。 –

1

因此,如果我觸摸立方體的特定面,攝像機會移動,以便攝像機節點的Z軸與觸摸面的法線一致?

假設你正在使用命中測試,以確定得到了感動什麼對象,SCNHitTestResult就會給你帶來localCoordinateslocalNormal從它應該是相當容易推導相機變換。

一個簡單的方法是將相機作爲盒子的子節點,計算一個看起來像localCoordinates + distance * localNormal的位置,最後使用GLKMatrix4MakeLookAtSCNMatrix4FromGLKMatrix4進行變換。

請注意,您還可以使用worldCoordinatesworldNormal,以及轉換工具,如SCNNode.convertTransform(_:from:)

+0

非常感謝@mnuages,將有一個看看。 –

相關問題