目標は、SCNNode をスケーリングし、その親内で垂直方向に中央揃えにすることです。
ただし、SCNNode をスケーリングしても境界ボックスには影響せず、スケーリングされた高さの計算は機能しません。正確な高さがなければ、ノードを親の内側で垂直方向に中央揃えするにはどうすればよいでしょうか?
スケーリングされた高さを使用する際の問題を説明するには、添付ファイルTiki.daeを参照してください。アセットの元の高さ (境界ボックスで表示) は 324.36 です。ただし、Y スケールを 0.01 に設定すると、高さは ~3.24 になりません。これは、高さ 3 (半径 1.5) の球にうまく収まることで証明できます。
以下のコードは、スケーリングされたノードをその親内の中央に配置しようとしますが、うまくいきません。
注: リファレンス ノードは、WWDC 2015 フォックス デモの fox/panda リファレンス ノードです。
// Create reference node
let referenceNode = SCNReferenceNode(URL: referenceURL)
referenceNode?.load()
// Scale reference node
let scale = Float(3)
referenceNode?.scale = SCNVector3(x: scale, y: scale, z: scale)
// Create geometry for sphere
let sphereGeometry = SCNSphere(radius: (gridSphere.geometry as! SCNSphere).radius)
//sphereGeometry.materials = gridSphere.geometry!.materials
sphereGeometry.firstMaterial!.diffuse.contents = gPurpleColor
// Create sphere to hold reference node, position at same place as <gridSphere>
let liveSphere = SCNNode(geometry: sphereGeometry)
liveSphere.position = gridSphere.position
// Center reference node inside <liveSphere>
var min = SCNVector3Zero
var max = SCNVector3Zero
referenceNode?.getBoundingBoxMin(&min, max: &max)
let referenceNodeHeight = max.y - min.y
referenceNode?.position = SCNVector3(x: 0, y: 0 - referenceNodeHeight, z: 0)
// Add reference node to <liveSphere>
liveSphere.addChildNode(referenceNode!)
// This value never changes no matter the scale value???
print(referenceNodeHeight)