如何在 scenekit 中将重力指向 3D space 中的特定点?
how to direct gravity to a specific pont in 3D space in scenekit?
使用SceneKit,我知道如何使用SCNphysicsField 来创建线性重力。我的问题是是否可以在 3D space 中指定指向特定点的方向(例如指向球体的中心)。
这是我用 radialGravity()
尝试过的:
let gravityNode=SCNNode()
let gravity=SCNPhysicsField.radialGravity()
gravity.scope=SCNPhysicsFieldScope.insideExtent
gravity.strength=9.8
gravityNode.physicsField=gravity
gravityNode.position=SCNVector3Make(0, 0, 0)
homeScene.rootNode.addChildNode(gravityNode)
使用SCNPhysicsField.radialGravity()
。您还需要将物理体放在您想要影响的每个对象上(可能还有类别位掩码)。
这是一个可以在 macOS Playground 中 运行 的示例:
//: Playground - noun: a place where people can play
import Cocoa
import SceneKit
import SpriteKit
import PlaygroundSupport
let scene = SCNScene()
let gravityNode = SCNNode()
let radialGravityField = SCNPhysicsField.radialGravity()
gravityNode.physicsField = radialGravityField
gravityNode.position = SCNVector3Make(0, 10, 0)
radialGravityField.strength = 9.8
// comment out the next line to disable the radial gravity field
scene.rootNode.addChildNode(gravityNode)
// uncomment the next line to disable default gravity
//scene.physicsWorld.gravity = SCNVector3Make(0, 0, 0)
let boxGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
boxGeometry.firstMaterial?.diffuse.contents = SKColor.yellow
let shape = SCNPhysicsShape(geometry: boxGeometry, options: nil)
let boxNode1 = SCNNode(geometry: boxGeometry)
boxNode1.position = SCNVector3Make(0, 6, 0)
scene.rootNode.addChildNode(boxNode1)
let body1 = SCNPhysicsBody(type: .dynamic, shape: shape)
boxNode1.physicsBody = body1
let boxNode2 = SCNNode(geometry: boxGeometry)
boxNode2.position = SCNVector3Make(0, 14, 0)
scene.rootNode.addChildNode(boxNode2)
let body2 = SCNPhysicsBody(type: .dynamic, shape: shape)
boxNode2.physicsBody = body2
let pyramidNode = SCNNode(geometry: SCNPyramid(width: 1, height: 1, length: 1))
pyramidNode.position = SCNVector3Make(2, 10, -2)
pyramidNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: pyramidNode.geometry!))
scene.rootNode.addChildNode(pyramidNode)
// put something down at ground level to trick the automatic camera
let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.2))
sphereNode.position = SCNVector3Make(0, -1, 0)
scene.rootNode.addChildNode(sphereNode)
let floor = SCNFloor()
let floorNode = SCNNode(geometry: floor)
floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: floor, options: nil))
scene.rootNode.addChildNode(floorNode)
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 600, height: 400))
sceneView.allowsCameraControl = true
sceneView.autoenablesDefaultLighting = true
sceneView.backgroundColor = SKColor.lightGray
sceneView.showsStatistics = true
sceneView.debugOptions = [.showPhysicsFields, .showPhysicsShapes]
PlaygroundPage.current.liveView = sceneView
sceneView.scene = scene
使用SceneKit,我知道如何使用SCNphysicsField 来创建线性重力。我的问题是是否可以在 3D space 中指定指向特定点的方向(例如指向球体的中心)。
这是我用 radialGravity()
尝试过的:
let gravityNode=SCNNode()
let gravity=SCNPhysicsField.radialGravity()
gravity.scope=SCNPhysicsFieldScope.insideExtent
gravity.strength=9.8
gravityNode.physicsField=gravity
gravityNode.position=SCNVector3Make(0, 0, 0)
homeScene.rootNode.addChildNode(gravityNode)
使用SCNPhysicsField.radialGravity()
。您还需要将物理体放在您想要影响的每个对象上(可能还有类别位掩码)。
这是一个可以在 macOS Playground 中 运行 的示例:
//: Playground - noun: a place where people can play import Cocoa import SceneKit import SpriteKit import PlaygroundSupport let scene = SCNScene() let gravityNode = SCNNode() let radialGravityField = SCNPhysicsField.radialGravity() gravityNode.physicsField = radialGravityField gravityNode.position = SCNVector3Make(0, 10, 0) radialGravityField.strength = 9.8 // comment out the next line to disable the radial gravity field scene.rootNode.addChildNode(gravityNode) // uncomment the next line to disable default gravity //scene.physicsWorld.gravity = SCNVector3Make(0, 0, 0) let boxGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0) boxGeometry.firstMaterial?.diffuse.contents = SKColor.yellow let shape = SCNPhysicsShape(geometry: boxGeometry, options: nil) let boxNode1 = SCNNode(geometry: boxGeometry) boxNode1.position = SCNVector3Make(0, 6, 0) scene.rootNode.addChildNode(boxNode1) let body1 = SCNPhysicsBody(type: .dynamic, shape: shape) boxNode1.physicsBody = body1 let boxNode2 = SCNNode(geometry: boxGeometry) boxNode2.position = SCNVector3Make(0, 14, 0) scene.rootNode.addChildNode(boxNode2) let body2 = SCNPhysicsBody(type: .dynamic, shape: shape) boxNode2.physicsBody = body2 let pyramidNode = SCNNode(geometry: SCNPyramid(width: 1, height: 1, length: 1)) pyramidNode.position = SCNVector3Make(2, 10, -2) pyramidNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: pyramidNode.geometry!)) scene.rootNode.addChildNode(pyramidNode) // put something down at ground level to trick the automatic camera let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.2)) sphereNode.position = SCNVector3Make(0, -1, 0) scene.rootNode.addChildNode(sphereNode) let floor = SCNFloor() let floorNode = SCNNode(geometry: floor) floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: floor, options: nil)) scene.rootNode.addChildNode(floorNode) let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 600, height: 400)) sceneView.allowsCameraControl = true sceneView.autoenablesDefaultLighting = true sceneView.backgroundColor = SKColor.lightGray sceneView.showsStatistics = true sceneView.debugOptions = [.showPhysicsFields, .showPhysicsShapes] PlaygroundPage.current.liveView = sceneView sceneView.scene = scene