ÜBERARBEITET PROBLEM:Ausrichten von SCNText mit SCNBox in iOS SceneKit mit BoundingBox?
Ich verstehe nicht, warum der weiße Knoten zentriert ist, wenn es eine Box oder Kugel ist, aber nicht, wenn es Text ist. Sie können die whiteGeometry-Variable kommentieren oder auskommentieren, um zu sehen, wie jede unterschiedliche Geometrie angezeigt wird. Ich dachte ursprünglich, dass ich den Text manuell zentrieren müsste, indem ich die Breite der Box und den Text festlege und die Position des Textes berechne. Muss ich das tun? Warum verhält sich der Text anders?
import SceneKit
import PlaygroundSupport
let scene = SCNScene()
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
sceneView.scene = scene
sceneView.backgroundColor = .darkGray
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
PlaygroundPage.current.liveView = sceneView
// Camera
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 25)
sceneView.pointOfView = cameraNode
let blackGeometry = SCNBox(width: 10.0, height: 10.0, length: 10.0, chamferRadius: 0)
blackGeometry.firstMaterial?.diffuse.contents = UIColor.black
print("blackGeometry min=\(blackGeometry.boundingBox.min)")
print("blackGeometry max=\(blackGeometry.boundingBox.max)")
let blackNode = SCNNode(geometry: blackGeometry)
blackNode.position = SCNVector3(x: 0, y: 0, z: 0)
scene.rootNode.addChildNode(blackNode)
// let whiteGeometry = SCNBox(width: 3.0, height: 3.0, length: 3.0, chamferRadius: 0)
let whiteGeometry = SCNText(string: "L", extrusionDepth: 0)
whiteGeometry.alignmentMode = kCAAlignmentLeft
whiteGeometry.font = UIFont.systemFont(ofSize: 8.0)
// let whiteGeometry = SCNSphere(radius: 3.0)
whiteGeometry.firstMaterial?.diffuse.contents = UIColor.white
print("whiteGeometry min=\(whiteGeometry.boundingBox.min)")
print("whiteGeometry max=\(whiteGeometry.boundingBox.max)")
let whiteNode = SCNNode(geometry: whiteGeometry)
let boxWidth = blackGeometry.boundingBox.max.x - blackGeometry.boundingBox.min.x
let boxHeight = blackGeometry.boundingBox.max.y - blackGeometry.boundingBox.min.y
print("boxWidth=\(boxWidth)")
print("boxHeight=\(boxHeight)")
let txtWidth = whiteGeometry.boundingBox.max.x - whiteGeometry.boundingBox.min.x
let txtHeight = whiteGeometry.boundingBox.max.y - whiteGeometry.boundingBox.min.y
print("txtWidth=\(txtWidth)")
print("txtHeight=\(txtHeight)")
whiteNode.position = SCNVector3(x: -5.0, y: -5.0, z: 10)
scene.rootNode.addChildNode(whiteNode)
//blackNode.addChildNode(whiteNode)
print("done")
ORIGINAL PROBLEM (OLD):
Lassen Sie uns sagen, ich habe zwei SCNBox Knoten (ich vereinfacht dies deutlich zu machen, aber die Lösung muss für andere Geometrien arbeiten). Eine große schwarze Box und eine kleine weiße Box. Ich möchte die weiße Box vor der schwarzen Box zentrieren.
Um dies zu tun, muss ich die Breite und Höhe der beiden Knoten bestimmen. Denken Sie daran, dass der Knoten etwas anderes als eine Box wie eine Kugel oder ein Text sein kann. Soweit ich das beurteilen kann, kann die Breite/Höhe nur über die Eigenschaft "boundingBox" in der Geometrie bestimmt werden. Es hat einen Min- und Max-Wert, der im Apple Referenzhandbuch NICHT klar und vollständig beschrieben ist. Um die Höhe zu erhalten, scheint es so zu sein, dass ich es auf der Basis von boundingBox.max.y und boundingBox.min.y berechnen würde. Wenn ich das Beispiel einer 10x10x10 Box betrachte, kann ich nicht sehen, wie ich 10,0 als Höhe erreichen kann, da max.y 5,20507812
z.B.
let box = SCNBox(width: 10.0, height: 10.0, length: 10.0, chamferRadius: 0)
print("box min=\(box.boundingBox.min)")
print("box max=\(box.boundingBox.max)")
ergibt:
box min=SCNVector3(x: -5.0, y: -5.0, z: -5.0)
box max=SCNVector3(x: 5.0, y: 5.20507812, z: 5.0)
Warum ist max.y = 5,20507812? Wie soll ich die Höhe/Breite bestimmen?
Siehe auch: SCNBoundingVolume
Ist die weiße Box ein Kindknoten der Blackbox? Machst du eine Übersetzung, schwenkst du usw., damit es vorne erscheint? Es wäre hilfreich, wenn Sie mehr Code schreiben könnten. – sambro
Ich habe das Code-Snippet auf einem Spielplatz ausgeführt und für jeden Wert +/- 5 erhalten. –
Ja, ich habe die weiße Box zu einem Kind der Blackbox gemacht. Wenn es kein Kind der Blackbox ist, ist der Wert von max.y 5.0. Ich überarbeite den Code in einem Swift-Spielplatz, um das Problem zu klären. – user3246173