Thursday, September 3, 2026
HomeiOS Developmentios - Gravity with SceneView beneath SwiftUI does not work

ios – Gravity with SceneView beneath SwiftUI does not work

[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]

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments