gpt4 book ai didi

swift - SceneKit 物理行为未按预期运行

转载 作者:行者123 更新时间:2023-11-30 12:04:07 25 4
gpt4 key购买 nike

我有 4 堵墙、1 个天花板、1 层地板和一件家具。我在房间里拖着家具,但它正在穿过墙壁。我尝试了我所知道的一切。还是无法解决问题。接触检测正在工作。如果我不给它 Furniture.physicalsBody!.damping = 1.0 属性,我的家具节点就不会停留在地板上。请观看视频:https://youtu.be/1iwq7gvTzA4

enum ABC:Int {
case furni = 1
case wall = 4
case floor = 6
}

private func setup() {
// create the wall geometry
let wallGeometry = SCNPlane(width: 2000, height: 300)
wallGeometry.firstMaterial!.diffuse.contents = "Wallpaper1.png"
wallGeometry.firstMaterial!.isDoubleSided = false
wallGeometry.firstMaterial!.locksAmbientWithDiffuse = true

let wallWithBaseboardNode = SCNNode(geometry: wallGeometry)
wallWithBaseboardNode.position = SCNVector3Make(0, 150, 0)
wallWithBaseboardNode.physicsBody = .static()
wallWithBaseboardNode.physicsBody!.restitution = 1.0
wallWithBaseboardNode.physicsBody!.contactTestBitMask = ABC.furni.rawValue

//front
_wallNode = wallWithBaseboardNode.clone()
_scene.rootNode.addChildNode(_wallNode)

//left
_wallNode = wallWithBaseboardNode.clone()
_wallNode.position = SCNVector3Make(0, 150, 0)
_wallNode.rotation = SCNVector4Make(0, 1, 0, .pi/2)
_scene.rootNode.addChildNode(_wallNode)

//right
_wallNode = wallWithBaseboardNode.clone()
_wallNode.position = SCNVector3Make(roomDimensions[0], 150, 0)
_wallNode.rotation = SCNVector4Make(0, 1, 0, -.pi/2)
_scene.rootNode.addChildNode(_wallNode)

//back
_wallNode = wallWithBaseboardNode.clone()
_wallNode.position = SCNVector3Make(0, 150, roomDimensions[1])
_wallNode.rotation = SCNVector4Make(0, 1, 0, .pi/1)
_scene.rootNode.addChildNode(_wallNode)

//ceiling
var ceilingNode = wallWithBaseboardNode.clone()
ceilingNode = wallWithBaseboardNode.copy() as! SCNNode
ceilingNode.geometry = (ceilingNode.geometry!.copy() as! SCNGeometry)
ceilingNode.geometry!.firstMaterial = SCNMaterial()
ceilingNode.geometry!.firstMaterial!.diffuse.contents = UIColor.white
ceilingNode.position = SCNVector3Make(0, Float(wallGeometry.height), 0)
ceilingNode.scale = SCNVector3Make(10, 10, 10)
ceilingNode.rotation = SCNVector4Make(1, 0, 0, .pi/2)
_scene.rootNode.addChildNode(ceilingNode)

//floor
let floor = SCNFloor()
floor.reflectionFalloffEnd = 0
floor.reflectivity = 0

_floorNode = SCNNode()
_floorNode.geometry = floor
_floorNode.geometry!.firstMaterial!.diffuse.contents = "Wood3.jpg"
_floorNode.geometry!.firstMaterial!.locksAmbientWithDiffuse = true
_floorNode.geometry!.firstMaterial!.diffuse.wrapS = .repeat
_floorNode.geometry!.firstMaterial!.diffuse.wrapT = .repeat
_floorNode.geometry!.firstMaterial!.diffuse.mipFilter = .nearest
_floorNode.geometry!.firstMaterial!.isDoubleSided = false

_floorNode.physicsBody = .static()
_floorNode.physicsBody!.restitution = 1.0

//_floorNode.physicsBody!.contactTestBitMask = ABC.furni.rawValue

_scene.rootNode.addChildNode(_floorNode)
}

这是我的家具节点的代码

private func addFurniture() {
let furnitureScene = SCNScene(named: "a.dae", inDirectory: "assets.scnassets/models/", options: nil)!
let furniture = furnitureScene.rootNode.childNode(withName: "a", recursively: true)!

furniture.physicsBody = .dynamic()
furniture.physicsBody!.restitution = 1.0
furniture.physicsBody!.damping = 1.0

furniture.physicsBody!.contactTestBitMask = ABC.wall.rawValue

_scene.rootNode.addChildNode(furniture)

scnView.prepare(_scene, shouldAbortBlock: nil)

_furniture = furniture

scnView.debugOptions = [.showPhysicsShapes, .showPhysicsFields]
}

最佳答案

如果您想手动移动家具(即不使用力),请将主体类型更改为.kinematic

移动节点时,可以执行 contactTest(with:options:)如果您遇到困难,它会返回给您一个联系人列表。在 renderer(_:willRenderScene:atTime:)然后,您可以固定家具的位置,以“固定”墙壁穿透对墙壁的偏移。

您可以在这里查看我对类似问题的解决方案: https://stackoverflow.com/a/46915698/1389597

希望这有帮助,我花了几天时间试图解决这个问题:)

关于swift - SceneKit 物理行为未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46864542/

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