使用 Swift 5.5,iOS 14 試圖創建一個簡單的 3D 條形圖,我立即發現自己遇到了麻煩。
我寫了這段代碼
for i in stride(from: 0, to: 6, by: 0.5) {
let rnd = CGFloat.random(in: 1.0...4.0)
let targetGeometry = SCNBox(width: 0.5,
height: rnd,
length: 0.5,
chamferRadius: 0.2)
targetGeometry.firstMaterial?.fillMode = .lines
targetGeometry.firstMaterial?.diffuse.contents = UIColor.blue
let box = SCNNode(geometry: targetGeometry)
box.simdPosition = SIMD3(x: 0, y: 0, z: 0)
coreNode.addChildNode(box)
}
這很好用,但是所有的條都以它們的中心為中心。但是我怎樣才能讓 SceneKit 改變對齊方式呢?
幾乎可以使用此代碼...
box.simdPosition = SIMD3(x: Float(i) - 3,
y: Float(rnd * 0.5),
z: 0)
但結果不正確......我希望/需要酒吧從基礎成長。
https://youtu.be/KJgvdBFBfyc
我怎樣才能使它從基礎生長?
--更新--1
嘗試使用以下公式替換 simdposition 的Andy Jazz建議。
box.simdPosition = SIMD3(x:box.simdPosition.x, y:0, z:0)
box.simdPivot.columns.3.y = box.boundingBox.max.y - Float(rnd * 0.5)
--更新--2
但是,盡管框在底部對齊,但當我更改值時,它們在重新對齊之前仍然會在兩端增長。這是一個視頻。
https://youtu.be/kVbW31ycvWc
--更新--3
好的,謝謝安迪,這行得通...
var rnds:[CGFloat] = []
for i in 0..<12 {
let rnd = CGFloat.random(in: 1.0...2.0)
let targetGeometry = SCNBox(width: 0.45, height: rnd, length: 0.45, chamferRadius: 0.25)
let newNode = SCNNode(geometry: targetGeometry)
sourceNodes[i].simdPivot.columns.3.y = newNode.boundingBox.min.y
rnds.append(rnd)
}
for k in 0..<12 {
let targetGeometry = SCNBox(width: 0.45, height: rnds[k], length: 0.45, chamferRadius: 0.25)
targetGeometry.firstMaterial?.fillMode = .lines
targetGeometry.firstMaterial?.diffuse.contents = UIColor.blue
sourceNodes[k].geometry = targetGeometry
sourceNodes[k].simdPosition = SIMD3(x: sourceNodes[k].simdPosition.x, y: 0, z: 0)
}
--更新--4
說話太早了……使用變形器和 ??SCNTransaction 為它制作影片……但它不起作用。
var rnds:[CGFloat] = []
for i in 0..<12 {
let rnd = CGFloat.random(in: 1.0...2.0)
let targetGeometry = SCNBox(width: 0.45, height: rnd, length: 0.45, chamferRadius: 0.25)
let newNode = SCNNode(geometry: targetGeometry)
sourceNodes[i].simdPivot.columns.3.y = newNode.boundingBox.min.y
rnds.append(rnd)
}
for k in 0..<12 {
let targetGeometry = SCNBox(width: 0.45, height: rnds[k], length: 0.45, chamferRadius: 0.25)
targetGeometry.firstMaterial?.fillMode = .lines
targetGeometry.firstMaterial?.diffuse.contents = UIColor.blue
let morpher = SCNMorpher()
morpher.targets = [sourceNodes[k].geometry!,targetGeometry]
sourceNodes[k].morpher = morpher
SCNTransaction.begin()
SCNTransaction.animationDuration = 1.8
sourceNodes[k].morpher?.setWeight(1.0, forTargetAt: 1)
sourceNodes[k].simdPosition = SIMD3(x: sourceNodes[k].simdPosition.x, y: 0, z: 0)
SCNTransaction.commit()
}
--更新--5
嘗試使用此代碼為更改設定影片...
for k in 0..<12 {
let targetGeometry = SCNBox(width: 0.45, height: rnds[k], length: 0.45, chamferRadius: 0.25)
targetGeometry.firstMaterial?.fillMode = .lines
targetGeometry.firstMaterial?.diffuse.contents = UIColor.blue
sourceNodes[k].geometry = targetGeometry
let morpher = SCNMorpher()
morpher.targets = [sourceNodes[k].geometry!,targetGeometry]
sourceNodes[k].morpher = morpher
let animation = CABasicAnimation(keyPath: "morpher.weights")
animation.fromValue = 0.0
animation.toValue = 1.0
animation.repeatCount = Float.infinity;
animation.duration = 3.5
animation.fillMode = .forwards
animation.isRemovedOnCompletion = false
sourceNodes[k].simdPosition = SIMD3(x: sourceNodes[k].simdPosition.x, y: 0, z: 0)
}
遺憾的是,這只有一半也有效,所以條形圖在底部是水平的,但影片只是簡單地捕捉到新值。
--更新--6
SCNAction 也不會對更改進行影片處理
for k in 0..<12 {
let targetGeometry = SCNBox(width: 0.45, height: rnds[k], length: 0.45, chamferRadius: 0.25)
targetGeometry.firstMaterial?.fillMode = .lines
targetGeometry.firstMaterial?.diffuse.contents = UIColor.blue
sourceNodes[k].geometry = targetGeometry
let changeGeometry = SCNAction.customAction(duration: 10) { (node, elapsedTime) -> () in
sourceNodes[k].geometry = targetGeometry
sourceNodes[k].simdPosition = SIMD3(x: sourceNodes[k].simdPosition.x, y: 0, z: 0)
}
sourceNodes[k].runAction(changeGeometry)
uj5u.com熱心網友回復:
您必須將每個條的樞軸點定位到其底部:
boxNode.simdPivot.columns.3.y = someFloatNumber
要將樞軸重新定位到欄的基礎,請使用邊界框屬性:
boxNode.simdPivot.columns.3.y = (boxNode.boundingBox.min.y as? simd_float1)!
在樞軸偏移后,將 boxNode 重新定位到 Y 軸的負方向。
boxNode.position.y = 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486939.html