第二次按下按钮时 3D 对象的放置不起作用
Placement of 3D object not working the SECOND time my button is pressed
我以编程方式向我的 ARSCNView 添加了一个按钮,并添加了一个在点击时调用的函数。该函数创建并放置一个 3D 对象。该按钮在第一次按下时工作正常,但在第二次按下时它没有放置我的对象。
这是我的代码:
私有变量按钮 = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
button.setTitle("Body", for: button.state)
button.frame = CGRect(x: 100, y: 25, width: 100, height: 25)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
view.addSubview(button)
}
@objc func buttonAction(sender: UIButton!) {
self.createPlaneNode()
}
func createPlaneNode() {
//Create a new scene with our 3D object in it
print("Hi")
//This prints everytime the button is pressed, I checked.
let object = SCNScene(named: "art.scnassets/manbody.obj")
let node = SCNNode()
let nodeArray = object!.rootNode.childNodes
for childNode in nodeArray {
node.addChildNode(childNode)
}
guard let currentFrame = sceneView.session.currentFrame else {
return
}
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.1 // Translate 10 cm in front of the camera
node.simdTransform = simd_mul(currentFrame.camera.transform, translation)
// SCNPlanes are vertically oriented in their local coordinate space.
// Rotate it to match the horizontal orientation of the ARPlaneAnchor.
node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
sceneView.scene.rootNode.addChildNode(node)
}
第二次成功了,检查多边形计数。 ;)
但是,您无法看到后续调用的结果,因为您一直将对象放在同一个地方。
您在这里正确设置了一个新位置:
node.simdTransform = simd_mul(currentFrame.camera.transform, translation)
但是你在下一行覆盖了转换:
node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
请注意 node.simdTransform
和 node.transform
只是同一事物的不同 "views"。
更改节点的枢轴以应用旋转,或者乘以变换而不是覆盖它。
我以编程方式向我的 ARSCNView 添加了一个按钮,并添加了一个在点击时调用的函数。该函数创建并放置一个 3D 对象。该按钮在第一次按下时工作正常,但在第二次按下时它没有放置我的对象。
这是我的代码:
私有变量按钮 = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
button.setTitle("Body", for: button.state)
button.frame = CGRect(x: 100, y: 25, width: 100, height: 25)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
view.addSubview(button)
}
@objc func buttonAction(sender: UIButton!) {
self.createPlaneNode()
}
func createPlaneNode() {
//Create a new scene with our 3D object in it
print("Hi")
//This prints everytime the button is pressed, I checked.
let object = SCNScene(named: "art.scnassets/manbody.obj")
let node = SCNNode()
let nodeArray = object!.rootNode.childNodes
for childNode in nodeArray {
node.addChildNode(childNode)
}
guard let currentFrame = sceneView.session.currentFrame else {
return
}
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.1 // Translate 10 cm in front of the camera
node.simdTransform = simd_mul(currentFrame.camera.transform, translation)
// SCNPlanes are vertically oriented in their local coordinate space.
// Rotate it to match the horizontal orientation of the ARPlaneAnchor.
node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
sceneView.scene.rootNode.addChildNode(node)
}
第二次成功了,检查多边形计数。 ;)
但是,您无法看到后续调用的结果,因为您一直将对象放在同一个地方。
您在这里正确设置了一个新位置:
node.simdTransform = simd_mul(currentFrame.camera.transform, translation)
但是你在下一行覆盖了转换:
node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
请注意 node.simdTransform
和 node.transform
只是同一事物的不同 "views"。
更改节点的枢轴以应用旋转,或者乘以变换而不是覆盖它。