[ad_1]
Utilizing SceneView, iOS 15, Swift 5.x
Added gravity to the scene, created a purple field and mentioned it was affected by gravity.. however nothing occurs? I simply get a purple field hanging there?
class GameScene: SCNScene {
func makeView() -> (SCNScene,SCNNode) {
let digicam = SCNCamera()
digicam.fieldOfView = 90.0
digicam.orthographicScale = 9
digicam.zNear = 0
digicam.zFar = 1000
let mild = SCNLight()
mild.coloration = UIColor.white
mild.kind = .directional
cameraNode = SCNNode()
cameraNode.simdPosition = SIMD3<Float>(0.0, 0.0, 4.0)
cameraNode.digicam = digicam
cameraNode.mild = mild
cameraOrbit = SCNNode()
cameraOrbit.addChildNode(cameraNode)
scene = SCNScene()
scene?.physicsWorld.gravity = SCNVector3(x: 0, y: -0.3, z: 0)
let cubeGeometry = SCNBox(width: 1, peak: 1, size: 1, chamferRadius: 0.25)
cubeGeometry.firstMaterial?.diffuse.contents = UIColor.purple
let coreNode = SCNNode(geometry: cubeGeometry)
coreNode.place = SCNVector3(x: 0, y: 2, z: 0)
coreNode.title = "coreNode"
coreNode.physicsBody = SCNPhysicsBody(kind: .dynamic, form: nil)
coreNode.physicsBody?.isAffectedByGravity = true
coreNode.physicsBody?.mass = 1.0
coreNode.physicsBody?.damping = 1.0
coreNode.physicsBody?.friction = 0
scene.rootNode.addChildNode(cameraOrbit)
scene.rootNode.addChildNode(coreNode)
view = SCNView()
view.scene = scene
view.pointOfView = cameraNode
return (scene, cameraNode)
}
Referred to as through this View in SwiftUI
struct GameView: View {
@State var scene: SCNScene
@State var cameraNode: SCNNode
var physique: some View {
SceneView(
scene: scene,
pointOfView: cameraNode,
choices: [.autoenablesDefaultLighting, .rendersContinuously, .allowsCameraControl], delegate: SceneDelegate())
}
}
@MainActor class SceneDelegate: NSObject, SCNSceneRendererDelegate {
var spawnTime:TimeInterval = 0
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
if time > spawnTime {
}
spawnTime = time + 1
}
}
After which this code
struct ContentView: View {
let timer = Timer.publish(each: 0.05, on: .important, in: .frequent).autoconnect()
let game1 = GameScene()
@State var isReady = false
@State var scene:SCNScene!
@State var cameraNode:SCNNode!
var physique: some View {
ZStack {
if isReady {
GameView(scene: scene, cameraNode: cameraNode)
}
}
.padding()
.onAppear {
(scene,cameraNode) = game1.makeView()
isReady = true
}
}
}
[ad_2]
