簡體   English   中英

SceneKit使用pivot計算節點的頂點世界坐標

[英]SceneKit calculate vertex world coordinates for node with pivot

我使用SceneKit處理這個移動地圖項目。 我制作了一個地球儀並旋轉它的樞軸,使你當前的位置面向相機。 要在地圖上投射一些文字,我需要計算一些世界坐標,我可以將其轉換為屏幕坐標並發送到我的overlaySKScene。 我沒有成功使用worldTransformconvertPosition / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM