目的は、SCNNodeをスケールし、その親の中に垂直に中心を置くことです。SceneKit:親の内部でスケールされたSCNNodeを垂直方向に中心にしますか?
ただし、SCNNodeのスケーリングはその境界ボックスには影響しません。スケールされた高さの計算は機能しません。正確な高さがなければ、どのようにノードをその親の中に垂直に配置することができますか?
縮尺の高さの使用に関する問題を説明するには、添付ファイルTiki.daeを参照してください。アセットの元の高さ(バウンディングボックスで示されている)は324.36です。ただし、Yスケールを0.01に設定すると、高さは〜3.24になりません。 3より小さくなります。これは、高さ3(半径1.5)の球の中に快適にフィットすることで証明できます。
以下のコードでは、スケーリングされたノードを親の内側に配置しようとしていますが、動作しません。
注:参照ノードは、WWDC 2015 foxのデモの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)
この例は動作していません。 'referenceNode'は子を持たず、シーンに追加されません。それは子供もジオメトリもないので、高さ0は妥当と思われます。 'liveSphere'は決してシーンに追加されません。 'gridSphere'は明らかに他の場所で定義されていますか? https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNReferenceNode_Class/にある「SCNReferenceNode」は、シーンファイルから読み込まれた他のコンテンツのプレースホルダとして使用されることに注意してください。 –
@HalMuellerは、コードを単純化するためにあまりにも多くのコードを削除しました。正しいコードを再追加する。 – Crashalot
@HalMueller参照ノードはWWDC 2015 foxデモからのキツネ/パンダです(ここでは簡単のため省略しています)。それらのファイルもアップロードする必要がありますか? – Crashalot