gpt4 book ai didi

ios - SceneKit 物理在 ARKit 中不能正常工作

转载 作者:行者123 更新时间:2023-11-28 19:29:31 26 4
gpt4 key购买 nike

我是 ARKit 的新手,我正在尝试制作一个相对简单的应用程序,您可以在其中创建一个“墙”,然后用户向它“扔”球,它会反弹回来。

我将墙创建为 SCNPlane 用户将相机指向的位置,如下所示:

private func createWall(withPosition position: SCNVector3) -> SCNNode {
let wallGeometry = SCNPlane(width: 0.3, height: 0.3)
wallGeometry.firstMaterial?.isDoubleSided = true
wallGeometry.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(0.7)

let parentNode = SCNNode(geometry: wallGeometry)

let (position, _) = cameraPosition()
parentNode.position = position

parentNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: wallGeometry, options: nil))
parentNode.physicsBody?.isAffectedByGravity = false

self.wall = parentNode

return parentNode
}

我用这个函数得到相机的方向和位置:
cameraPosition():

func cameraPosition() -> (SCNVector3, SCNVector3) {
guard let frame = sceneView.session.currentFrame else { return (SCNVector3(0, 0, -1), (SCNVector3(0, 0, 0))) }
let matrix = SCNMatrix4(frame.camera.transform)
let direction = SCNVector3(-matrix.m31, -matrix.m32, -matrix.m33)
let location = SCNVector3(matrix.m41, matrix.m42, matrix.m43)
return ((location + direction), direction)
}

// Helper function
func +(left: SCNVector3, right: SCNVector3) -> SCNVector3 {
return SCNVector3(left.x + right.x, left.y + right.y, left.z + right.z)
}

我创建了 Ball() 的实例并像这样抛出它们:

let (position, direction) = cameraPosition()

// throw ball
let ball = Ball()
ball.position = position //SCNVector3(0,0,0)
sceneView.scene.rootNode.addChildNode(ball)

let impulseModifier = Float(10)
ball.physicsBody!.applyForce(SCNVector3(direction.x*impulseModifier, direction.y*impulseModifier, direction.z*impulseModifier), asImpulse: true)

球类:

class Ball: SCNNode {
override init() {
super.init()

let sphere = SCNSphere(radius: 0.05)
sphere.firstMaterial?.diffuse.contents = UIColor.red
self.geometry = sphere

self.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: sphere, options: nil))
}
}

问题是,很多时候,球并没有真正撞到墙上,而是只是穿过墙,就好像物理体没有正常工作一样。我注意到有时当我改变相机和墙壁之间的距离和角度时效果会更好,但就我所尝试的而言,结果从来都不一致。
我还尝试将墙的位置更改为:SCNVector3(0, 0, -1) 将其定位在距世界原点 1 米深的位置,结果稍微好一些但仍然不一致.

问题出在哪里?为什么?
提前致谢!

最佳答案

将您的墙壁物理设置为运动学的,以便球可以与之 react 。

  • 静态对象不与任何东西发生 react 。

  • 运动学对象会与其他对象发生 react ,但其他对象不会影响它们。

  • 当然,动态意味着它可以双向工作。

关于ios - SceneKit 物理在 ARKit 中不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47239006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com