正弦3D-SwiftUI-SceneKit-SwiftPlaygroud

Sin-3D-SwiftUI-SceneKit

The first part

The second part

Code file 1

import SwiftUI
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Code flie 2

import SceneKit
import SwiftUI

struct ContentView: View {
    var body: some View {
        Sine3D()
    }
}

struct Sine3D: View {
    @State var Amplitude: Float = 3
    @State var frequency: Float = 1
    var body: some View {
        ZStack {
            ZStack {
                hb121Sine3D(
                    A: $Amplitude, 
                    F: $frequency
                )
            }
            HStack {
                Spacer()
                VStack {
                    Stepper(value: $Amplitude, in: 1...4) {
                        Text("Amplitude:\(Int(Amplitude))")
                            .foregroundColor(.green)
                    }
                    Stepper(value: $frequency, in: 1...8) {
                        Text("Frequency:\(Int(frequency))")
                            .foregroundColor(.red)
                    }
                    Spacer()
                }
                .frame(width: 250)
            }
            .padding()
        }
    }
}
struct hb121Sine3D: View {
    @Binding var A: Float
    @Binding var F: Float
    let Node = SCNNode()
    var sine: SCNNode {
        var vertices: [SCNVector3] = []
        for i in 0...6250 {
            let x = Float(i) / 1000
            let y = A * sin(F * x)
            let z = A * cos(F * x)
            let vertex = SCNVector3(x, y, z)
            vertices.append(vertex)
        }
        let sphereGeometry = SCNSphere(radius: 0.05)
        sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
        let sphereNode = SCNNode(geometry: sphereGeometry)
        for vertex in vertices {
            let pointNode = sphereNode.clone()
            pointNode.position = vertex
            Node.addChildNode(pointNode)
        }
        return Node
    }
    
    var camera: SCNNode {
        let camera = SCNCamera()
        let cameraNode = SCNNode()
        cameraNode.position = .init(3, 0, 20)
        cameraNode.camera = camera
        return cameraNode
    }
    
    var scene: SCNScene {
        let scene = SCNScene()
        scene.background.contents = UIColor.systemBackground
        scene.rootNode.addChildNode(sine)
        scene.rootNode.addChildNode(camera)
        return scene
    }
    
    var body: some View {
        SceneView(
            scene: scene,
            options: [.autoenablesDefaultLighting, .allowsCameraControl]
        )
    }
    
}