[英]SceneKit calculate vertex world coordinates for node with pivot
我使用SceneKit處理這個移動地圖項目。 我制作了一個地球儀並旋轉它的樞軸,使你當前的位置面向相機。 要在地圖上投射一些文字,我需要計算一些世界坐標,我可以將其轉換為屏幕坐標並發送到我的overlaySKScene。 我沒有成功使用worldTransform或convertPosition / convertTransform,所以我想出了自己的計算:
import SceneKit
import simd
// a rotation-matrix which rotates the globe
// so 52º North, 4.75º East [Benelux] faces the camera @ [0,0,0]
let pivot = float4x4([
float4(0.996566, 0.0, -0.0828082, 0.0),
float4(-0.0652537, 0.615662, -0.785304, 0.0),
float4(0.0509818, 0.788011, 0.613547, 0.0),
float4(0.0, 0.0, 0.0, 1.0)
])
// position of Brussel in cartesian coordinates
let posBrussel = float4(0.0493100174, 0.776061833, 0.628726125, 1.0)
// setup globe
// apply scale & translation -> zoom in on Benelux
let zoom = Float(14.6193)
let distance = Float(-16.5852)
let node = SCNNode()
node.position = SCNVector3(0, 0, distance)
node.scale = SCNVector3(zoom, zoom, zoom)
node.pivot = SCNMatrix4(pivot)
// Manual calculation of world coordinates
let posBrusselScaled = zoom * posBrussel
let resultIntermediate = posBrusselScaled * pivot
let resultFinal = resultIntermediate + float4(0.0, 0.0, distance, 0.0)
// world coordinates Brussel
// resultFinal = float4(-0.0427321, -0.280209, -1.96864, 14.6193)
現在我希望有一種更簡單的方法來計算這些世界坐標。 就像乘以變換和樞軸一樣。
let transform = float4x4(node.transform)
posBrussel * pivot * transform // float4(-0.0427321, -0.280209, 14.6166, -15.5821)
posBrussel * transform * pivot // float4(-0.0427321, -0.280209, 14.6166, -9.42755)
雖然x,y值接近我自己的計算,但是z值是偏離的[由於距離和縮放,它應該接近-2]。
計算這些世界坐標的最佳/正確方法是什么?
你不應該自己計算。 SceneKit使用convertPosition(_:, to:)
函數為您convertPosition(_:, to:)
。 它允許您將坐標從本地節點的坐標系轉換為其他節點的坐標系。
具有世界坐標的節點是rootNode
。 因此,考慮到posBrussel
在節點的坐標空間中的位置,結果必須如此簡單
resultFinal = node.convertPosition(posBrussel, to: scene.rootNode)
screenPoint = sceneView.projectPoint(resultFinal)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.