Swift [第6單元(下)] RealityKit 空間運算

6-16d AR應用:手工花瓶

從以上3節,大致了解擴增實境的原理與基本用法之後,就可以開始製作 App 應用。至於內容要放什麼呢?前面第6課~第15課學過的素材,幾乎都可以放進來,不管是外部做好的模型、場景、視覺特效、音效,或是透過程式製作的模型與動畫。

例如,在第8課6-8d做過一個可以手工調整曲線的花瓶,就很適合。經過稍加修改,加入擴增實境之後,執行畫面如下,是不是感覺既真實又虛幻?

這樣的應用很適合家具用品,在購買之前,就可先擺進自己家中,看看顏色、尺寸是否搭配。瑞典家具大廠 IKEA 前幾年就曾發表過類似 App。

這個範例程式如果從零開始寫的話,會發現9成以上的工作,是在製作虛擬物件,也就是前面所學的內容,擴增實境的程式碼佔不到一成。

實務上,大多數 AR App 製作前,會先利用3D製作軟體(如 Blender, Maya, …)做好虛擬物件,這樣在材質、外觀、造型、場景等地方可以更逼真,再導入 RealityKit 加上擴增實境,RealityKit 程式碼的角色,用來黏合所有內容,並控制背後所需的流程與邏輯。

話說回來,本單元學習重點在於 RealityKit 程式設計,而非3D模型製作,因此,呈現概念原型(prototype)即可,之前(6-8d)做好的模型就夠用了。

完整程式碼如下,將近300行,看似很多,但其實並沒有新東西,全部都是學過的。前2/3包括「花瓶曲線」、「曲線繪圖板」是從6-8d複製過來,完全不需要修改;主視圖合併到「擴增實境」中,僅小幅修改,就不一一說明,請自行參考:
// 6-16d AR手工花瓶
// Created by Heman Lu, 2025/10/25
// Minimum Requirement: iPadOS 18 + Swift Playground 4.6 (AR)
// Alternative: macOS 15 + Swift Playground 4.6 (non-AR)

import SwiftUI
import RealityKit

// 花瓶右半邊輪廓曲線
struct 花瓶曲線: Shape {
let 厚度: CGFloat = 0.001 // Normalized to 0~1
let 底座: [CGPoint] = [ // Normalized to 0~1
CGPoint(x: 0, y: 0),
CGPoint(x: 0.3, y: 0),
CGPoint(x: 0.3, y: 0.02)
]
let 曲線: [CGPoint] // 4個正規化點座標(起點、控制點1、控制點2、終點)

func path(in 尺寸: CGRect) -> Path {
let 寬 = 尺寸.width
let 高 = 尺寸.height

var 畫筆 = Path()
// (1)畫底座
if 底座.count > 1 {
畫筆.addLines(底座)
}

if 曲線.count > 3 {
// (2)畫貝茲曲線
畫筆.addLine(to: 曲線[0])
畫筆.addCurve(
to: 曲線[3],
control1: 曲線[1],
control2: 曲線[2])

// (3) 畫瓶口轉折
畫筆.addLine(to: CGPoint(
x: 曲線[3].x - 厚度,
y: 曲線[3].y))

// (4)畫返回貝茲曲線
let 控制點1 = CGPoint(
x: 曲線[2].x - 厚度,
y: 曲線[2].y)
let 控制點2 = CGPoint(
x: 曲線[1].x - 厚度,
y: 曲線[1].y)
let 終點 = CGPoint(
x: 曲線[0].x - 厚度,
y: 曲線[0].y + 厚度)
畫筆.addCurve(to: 終點, control1: 控制點1, control2: 控制點2)

// (5)畫返回底座
畫筆.addLine(to: CGPoint(
x: 曲線[0].x - 厚度,
y: 曲線[0].y))
畫筆.addLine(to: CGPoint(
x: 0,
y: 曲線[0].y))
}
畫筆.closeSubpath()
// 恢復原尺寸
let 縮放矩陣 = CGAffineTransform(scaleX: 寬, y: 高)
return 畫筆.applying(縮放矩陣)
}
}

// 手拉曲線
struct 曲線繪圖板: View {
let 繪板寬: CGFloat
let 繪板高: CGFloat
@Binding var 手拉曲線: [CGPoint] // 4個正規化點座標(起點、控制點1、控制點2、終點)
@State var 手勢開始 = false
@State var 上次座標: CGPoint = .zero
@State var 目標索引: Int = 0 // 貝茲曲線的索引(0...3)

func 最近點索引(位置: CGPoint, 點陣列: [CGPoint]) -> Int {
var 索引: Int = 0
var 目前距離: CGFloat = .infinity

for i in 點陣列.indices {
let 兩點距離 = sqrt(
pow(點陣列[i].x - 位置.x, 2) +
pow(點陣列[i].y - 位置.y, 2)
)
if 兩點距離 < 目前距離 {
目前距離 = 兩點距離
索引 = i
}
}
return 索引
}

var 拖曳手勢: some Gesture {
DragGesture(minimumDistance: 5.0)
.onChanged { 參數 in
if 手勢開始 == false {
手勢開始 = true
let 轉換點座標 = 手拉曲線.map { 正規化座標 in
CGPoint(
x: 正規化座標.x * 繪板寬,
y: 繪板高 - 正規化座標.y * 繪板高
)
}
目標索引 = 最近點索引(位置: 參數.location, 點陣列: 轉換點座標)
if 目標索引 > -1 && 目標索引 < 4 { // 索引超過範圍會閃退
上次座標 = 手拉曲線[目標索引]
}
}
if 目標索引 > -1 && 目標索引 < 4 { // 索引超過範圍會閃退
手拉曲線[目標索引] = CGPoint(
x: 上次座標.x + 參數.translation.width / 繪板寬,
y: 上次座標.y - 參數.translation.height / 繪板高
)
}
if 目標索引 == 0 {
// To-do: 底座的座標要跟著變化
}
// print(貝茲曲線[目標索引])
}
.onEnded { 參數 in
// print(拖曳位移陣列)
手勢開始 = false
目標索引 = 0
}
}

var body: some View {
ZStack {
花瓶曲線(曲線: 手拉曲線)
.stroke(Color.primary)
.fill(Color.red)
.scaleEffect(y: -1)
Canvas { 圖層, 尺寸 in
let 寬 = 尺寸.width
let 高 = 尺寸.height
// let 中心 = CGPoint(x: 寬/2, y: 高/2)
let 上中 = CGPoint(x: 寬/2, y: 0)
let 下中 = CGPoint(x: 寬/2, y: 高)
let 左中 = CGPoint(x: 0, y: 高/2)
let 右中 = CGPoint(x: 寬, y: 高/2)
var 畫筆 = Path()

// (1) 畫外框與十字線
畫筆.addRect(CGRect(origin: .zero, size: 尺寸))
畫筆.move(to: 上中)
畫筆.addLine(to: 下中)
畫筆.move(to: 左中)
畫筆.addLine(to: 右中)
圖層.stroke(畫筆, with: .color(.gray), lineWidth: 1)

// (2) 畫控制點小圓
let 縮放矩陣 = CGAffineTransform(scaleX: 寬, y: 高)
var 實際座標: [CGPoint] = [] // 將貝茲曲線轉換到數學座標
畫筆 = Path()
for 點座標 in 手拉曲線 {
let 點座標轉換 = CGPoint(
x: 點座標.applying(縮放矩陣).x,
y: 高 - 點座標.applying(縮放矩陣).y
)
實際座標.append(點座標轉換)
// print("座標轉換:\(點座標轉換)")
畫筆.addArc(
center: 點座標轉換,
radius: 7,
startAngle: .zero,
endAngle: .degrees(360),
clockwise: false)
}
圖層.fill(畫筆, with: .color(.primary))

// (3) 畫兩條控制點線段
畫筆 = Path()
if 實際座標.count > 3 {
畫筆.move(to: 實際座標[0])
畫筆.addLine(to: 實際座標[1])
畫筆.move(to: 實際座標[2])
畫筆.addLine(to: 實際座標[3])
}
圖層.stroke(畫筆, with: .color(.primary))
}
.gesture(拖曳手勢)
}
.frame(width: 繪板寬, height: 繪板高)
}
}

struct 擴增實境: View {
let 外框 = CGRect(x: 0.0, y: 0.0, width: 0.1, height: 0.16)
@State var 輪廓曲線: [CGPoint] = [ //正規化(數學)座標,原點在左下角
CGPoint(x: 0.3, y: 0.02), // start point
CGPoint(x: 1.0, y: 0.2), // #1 control point
CGPoint(x: 0.01, y: 0.7), // #2 control point
CGPoint(x: 0.1, y: 1) // end point
]
@State var 線框開關: Bool = false
var body: some View {
RealityView { 內容 in
var 材質 = PhysicallyBasedMaterial()
材質.baseColor.tint = .orange
材質.roughness = 0.8
材質.metallic = 0.1

let 曲線 = 花瓶曲線(曲線: 輪廓曲線).path(in: 外框)

// 共享程式6-8c:製作花瓶()
if let 花瓶 = try? await MeshResource.製作花瓶(輪廓: 曲線) {
let 花瓶模型 = ModelEntity(mesh: 花瓶, materials: [材質])
花瓶模型.name = "花瓶"
花瓶模型.components.set(GroundingShadowComponent(castsShadow: true))

#if targetEnvironment(macCatalyst) //macOS + Swift Playground
花瓶模型.scale = [3, 3, 3]
內容.add(花瓶模型)
#else // iPadOS + Swift Playground
// (1) 平面錨點 + 花瓶模型
let 平面錨點 = AnchorEntity(plane: .any) // 任何平面
平面錨點.name = "平面錨點"
平面錨點.addChild(花瓶模型)
內容.add(平面錨點)
#endif
}


#if targetEnvironment(macCatalyst) // for Mac + Swift Playground
內容.camera = .virtual // 只顯示虛擬空間
內容.add(座標軸(0.7)) // 共享程式6-6b:座標軸()
#else // for iPad + Swift Playground
內容.camera = .spatialTracking // 開啟AR相機(預設為後鏡頭)
let AR設定 = SpatialTrackingSession.Configuration(
tracking: [.camera, .world, .plane, .object, .image, .face, .body],
sceneUnderstanding: [.shadow, .occlusion, .collision, .physics],
camera: .back
)
let AR任務階段 = SpatialTrackingSession()
if let 回傳結果 = await AR任務階段.run(AR設定) {
print("不支援:", 回傳結果)
} else {
print("AR設定正常")
}
#endif
} update: { 內容 in
// print("Updating at \(Date.now):\(輪廓曲線)")
for 個體 in 內容.entities {
if let 模型 = 個體.findEntity(named: "花瓶") as? ModelEntity {
// print("模型找到了")
if var 材質 = 模型.model?.materials.first as? PhysicallyBasedMaterial {
// print("取代材質")
材質.triangleFillMode = 線框開關 ? .lines : .fill
模型.model?.materials = [材質]
}
let 曲線 = 花瓶曲線(曲線: 輪廓曲線).path(in: 外框)
Task {
if let 新造型 = try? await MeshResource.製作花瓶(輪廓: 曲線, 分段: 60) {
// print("更新外型網格")
模型.model?.mesh = 新造型
}
}
}
}
}
#if targetEnvironment(macCatalyst)
.realityViewCameraControls(.orbit)
#endif
.overlay(alignment: .bottomTrailing) {
HStack(alignment: .bottom) {
Text("(c)2025 Heman Lu")
.italic()
.font(.caption)
.foregroundStyle(.gray)
.padding()
Spacer()
Button("線框", systemImage: "globe") {
線框開關.toggle()
}
.buttonStyle(.borderedProminent)
.padding()
RoundedRectangle(cornerRadius: 8)
.frame(width: 160, height: 210)
.padding()
.opacity(0.3)
.overlay {
曲線繪圖板(繪板寬: 150, 繪板高: 200, 手拉曲線: $輪廓曲線)
.frame(width: 150, height: 200)
}
}
}
}
}

import PlaygroundSupport
PlaygroundPage.current.setLiveView(擴增實境())

因為程式用了 ”#if targetEnvironment(macCatalyst)” 條件編譯,故可分別在 macOS 與 iPadOS 中執行,呈現出不同效果。

若在 macOS 中執行,只會看到虛擬場景的部分,與6-8d類似,但花瓶底部置於原點:

在 iPadOS 中,則可看到虛實整合的內容,執行過程如下:

效果看起來不錯,還能動手玩。唯一缺憾是程式做的花瓶質感不夠逼真,若能找到適當的材質貼圖,將會更完美。

💡註解
  1. 作業1:「花瓶曲線」、「曲線繪圖板」兩部分的程式碼,與6-8d完全一樣,請移到共享區,看看會發生什麼問題?然後再進一步修正。
  2. 作業2:請挑選前面任一課程內容(例如6-12e龍捲風),加入擴增實境。
  3. 作業3:執行畫面中,「線框」按鈕有點突兀,請將按鈕取消,改用輕點(TapGesture)花瓶以切換線框材質。可參考6-11c 手勢互動(InputTargetComponent)
6-16e AR播放影片、人體錨點

在 AR/VR 領域,經常可看到「沉浸式體驗」一詞,此處的「沉浸式」(Immersive)是指 AR/VR 設備會隔離(或降低)對環境的感知,讓使用者專注於內容,進而沉浸其中的意思。

就此而言,VR 完全排除環境視覺聽覺,只接收虛擬影音內容,所以沉浸效果最好。至於AR,以頭盔式設備(如 Vision Pro)沉浸效果最接近 VR;AR眼鏡或封閉空間(如AR座艙、車廂)效果次之;至於最平常的 iPhone/iPad 設備,較難做到沉浸式體驗。

適合沉浸式體驗的內容之一就是影片,用 Vision Pro 看影片的效果,甚至比電影院觀看還要精彩,對學習的效果也更好。

如何在 AR 裡面播放影片呢?在前面課程6-6a 初次使用RealityView提過的 VideoMaterial,就可以拿影片當作材質,貼在模型上。

在範例中,我們先找一個開放下載的影片網址(此為WWDC 2025影片),利用第3單元學過的 AVPlayer (記得要 import AVFoundation),不需下載就可直接播放網路影片,然後將播放器加入 VideoMaterial(),就可當作模型材質:
let 平面 = MeshResource.generatePlane(width: 1.78, depth: 1.0)
let 平面模型 = ModelEntity(mesh: 平面)

let 影片網址 = "https://devstreaming-cdn.apple.com/videos/meet-with-apple/2025/201/5/597cbd02-a20e-4124-9596-a8acc21e96af/downloads/meet-with-apple-201_sd.mp4"
if let myURL = URL(string: 影片網址) {
let 影片播放器 = AVPlayer(url: myURL)
let 影片材質 = VideoMaterial(avPlayer: 影片播放器)
平面模型.model?.materials = [影片材質]
影片播放器.play()
}

接著設定一個牆面錨點,將播放影片的平面模型錨定在牆上:
let 牆面錨點 = AnchorEntity(
plane: .vertical, // 垂直平面
classification: .wall, // 牆面
minimumBounds: [0.5, 0.5]) // 最小寬x高 (0.5m x 0.5m)
牆面錨點.addChild(平面模型)
內容.add(牆面錨點)
執行時,要移動 iPad 讓相機四處掃描,當偵測到牆面後,會自動貼上平面模型,看起來就像在牆上播放影片,有如一台虛擬電視。

從下圖可觀察執行結果,分為兩部分:(1)在牆面上播放影片 (2)動作捕捉,機器人動作會模仿背後的真人:


第二部分動作捕捉,用到一個特別的人體追蹤個體 BodyTrackedEntity(),語法很簡單,如同前面載入外部模型,只是將 ModelEntity() 改成 BodyTrackedEntity()。對應的錨點要用 AnchorEntity(.body):
// (2) 人體動作追蹤控制機器人
// 機器人模型請手動下載、匯入:
// https://developer.apple.com/sample-code/ar/Biped-Robot.zip
if let 機器人模型 = try? await BodyTrackedEntity(named: "biped_robot.usdz") {
機器人模型.scale = [1, 1, 1]
let 人體錨點 = AnchorEntity(.body)
人體錨點.addChild(機器人模型)
內容.add(人體錨點)
}
執行後,當 iPad 相機掃描到人體(全身)時,人體錨點就會將BodyTrackedEntity 載入的機器人模型錨定上去。

BodyTrackedEntity 其實也是個模型個體,只是多了人體追蹤元件(BodyTrackingComponent),此元件的功能,在於讓錨定的人體動作,複製貼到機器人模型上,看起來就像在做動作捕捉(Motion Capture)。

要做到這一點,必須用特殊的機器人模型,含有91個關節,關節名稱與階層關係,必須嚴格遵照原廠文件的規定,Apple 提供一個機器人模型範例,請下載後解開.zip檔案,將其中 “biped_robot.usdz” 匯入 Swift Playground 中。

最後,在設定空間追蹤任務階段時,要記得啟用平面追蹤與人體追蹤 [.plane, .body]:
SpatialTrackingSession.Configuration(tracking: [.plane, .body])

完整範例程式如下,比起上一節,簡短多了:
// 6-16e AR播放影片
// Created by Heman Lu, 2025/11/01
// Minimum Requirement: iPadOS 18 + Swift Playground 4.6 (AR)
// Alternative: macOS 15 + Swift Playground 4.6 (non-AR)

import SwiftUI
import RealityKit
import AVFoundation

struct 擴增實境: View {
let 影片網址 = "https://devstreaming-cdn.apple.com/videos/meet-with-apple/2025/201/5/597cbd02-a20e-4124-9596-a8acc21e96af/downloads/meet-with-apple-201_sd.mp4"
var body: some View {
RealityView { 內容 in
// (1) 牆面播放影片
let 平面 = MeshResource.generatePlane(width: 1.78, depth: 1.0)
let 平面模型 = ModelEntity(mesh: 平面)

if let myURL = URL(string: 影片網址) {
let 影片播放器 = AVPlayer(url: myURL)
let 影片材質 = VideoMaterial(avPlayer: 影片播放器)
平面模型.model?.materials = [影片材質]
影片播放器.play()
}

let 牆面錨點 = AnchorEntity(
plane: .vertical, // 垂直平面
classification: .wall, // 牆面
minimumBounds: [0.5, 0.5]) // 最小寬x高 (0.5m x 0.5m)
牆面錨點.addChild(平面模型)
內容.add(牆面錨點)

// (2) 人體動作追蹤控制機器人
// 機器人模型請手動下載、匯入:
// https://developer.apple.com/sample-code/ar/Biped-Robot.zip
if let 機器人模型 = try? await BodyTrackedEntity(named: "biped_robot.usdz") {
機器人模型.scale = [1, 1, 1]
let 人體錨點 = AnchorEntity(.body)
人體錨點.addChild(機器人模型)
內容.add(人體錨點)
}

#if targetEnvironment(macCatalyst) // for Mac + Swift Playground
內容.camera = .virtual // 只顯示虛擬空間
內容.add(座標軸(0.7)) // 共享程式6-6b
內容.add(平面模型)
平面模型.position.z = -0.5
平面模型.orientation = .init(angle: .pi/2, axis: [1, 0, 0])
#else // for iPad + Swift Playground
內容.camera = .spatialTracking // 開啟AR相機
let AR任務階段 = SpatialTrackingSession()
if let 設定結果 = await AR任務階段.run(.init(tracking: [.plane, .body])) {
print("不支援部分AR功能:\(設定結果)")
}
#endif
}
#if targetEnvironment(macCatalyst)
.realityViewCameraControls(.orbit)
#endif
}
}

import PlaygroundSupport
PlaygroundPage.current.setLiveView(擴增實境())

執行過程請參考影片:

💡註解
  1. 2023年在美國拉斯維加斯落成的 MSG Sphere,耗資23億美元,是目前全世界最大的影劇院,可同時容納1萬8千人,球形場體寬高約157m x 112m,內側鋪滿15,000m²的LED螢幕,堪稱是最完美的沉浸式體驗。
  2. VideoMaterial 作為一種材質,並非一定用來播放影片,有時可播放特效(如水波、煙霧、光影、色調變化等)動畫,例如 WWDC 2020 範例,讓材質產生動態的視覺效果。
  3. 前面6-16c曾示範,臉部錨點也可辨識2D照片;本節範例執行時,如果掃描照片或影片,人體錨點也能錨定嗎?請動手試試看。
  4. 動作追蹤個體能夠改用 Mixamo 的機器人嗎?答案是不能直接更換,因為骨架不一致,必須先用 Blender 或 Maya 等軟體更換整個骨架,才能用在 BodyTrackedEntity。理論如此,但筆者試了一星期,沒有成功。
  5. 本節範例仍以 iPad Pro 2018 (A12X晶片)執行,根據原廠文件,人體追蹤所需硬體最低規格為 A12 晶片。
第6單元(下)結語

本單元到此「暫時」告一段落,年底前可能會再補充一些新內容,但時間不確定。

第6單元(下) 「RealityKit 空間運算」從今(2025)年1月寫到11月,歷經10個多月,大致將 RealityKit 基本用法示範過一遍,雖稱不上鉅細彌遺,且跳過部分內容(例如專屬 Vision Pro 的物件、底層 Metal、ARKit 進階用法等等),至少 RealityKit 基礎介紹還算完整,以後想深入學習,就不會太難了。

年初剛開始寫的時候,其實心中並沒有很清晰的課程大綱,只根據去年寫過的 SceneKit 當參考,實際動手後,果然發現不少是在 SceneKit 未曾介紹的,例如 SIMD (補充18)、USDZ檔案、擠出成型、網格描述、UV映射、物理關節、骨骼系統等等,都是原先沒想到的,算是意外收穫。

今(2025)年WWDC正式宣布 SceneKit 進入維護模式,不再更新,未來空間運算完全由 RealityKit 獨挑大樑,同時也延伸 RealityKit 支援的硬體種類,如今包括 Vision Pro, Mac, iPad, iPhone, Apple TV 等,都可以跑本單元所用的 RealityView + SwiftUI 組合。

如果從 Apple 生態圈往外看,整個空間運算的應用場域也在擴大。

例如結合AI的人形機器人,空間運算是其軟體的關鍵要素,相關廠商包括老牌的波士頓動力(Boston Dynamics)、輝達(NVIDIA)、特斯拉(Tesla)、大陸的宇樹、小鵬、新創的1X、Figure AI等公司,未來實體機器人將從軍用或工業用逐漸進入一般人的生活。

有趣的是,目前有許多機器人公司,正以真人透過 AR/VR 設備來操作或訓練人形機器人,例如 NVIDIA + Vision ProNeo (會做家事的機器人),原本在虛擬空間的內容,透過機器人映射到實體空間,虛實之間的界線將會更模糊。

人工智慧突破語言障礙之後,這幾年開始大力發展人形機器人,不只為了聊天,而是希望走入生活,成為人類全方位的助手,這時候才發現一個大問題,就是機器人對空間的概念完全不足!

著名 AI 學者李飛飛認為 AI 的下一個挑戰將是「空間智慧」(Spatial Intelligence),在去年成立世界實驗室(World Labs),想讓 AI 視覺從 2D 拓展到 3D,在 AI 心中建構一個「世界模型」。簡單地說,不只 AR 底層需要 AI,未來 AI 底層也需要 AR 一樣的空間運算能力。

其他像無人機、自動駕駛、遠距教學或醫療、太空科技等等,背後也都需要空間運算,雖然目前應用在生活中的比例還不高,但未來空間運算與AI融合後,將會逐漸滲透到各行各業。

從2021年7月筆者發表【Swift程式設計】第1單元開始,至今第6單元,連續寫了4年多,累計超過300篇含範例程式的詳細解說,主要目標是讓高中生可以自學 Swift 程式設計,也很高興有學校(感謝南港高中高慧君老師)改編為教材,對高一、高二、高三同學上課,據說學生反應不錯。

對高中生而言,這6個單元中,筆者認為第5單元「AI人工智慧」與第6單元「空間運算」最有前景,很可能是下個世代軟體發展的主流。

不過,前面的第3單元「網路程式基礎」與第4單元「SwiftUI動畫與繪圖」,則是很重要的基礎,沒有學會其中的 async/await 非同步語法、URLSession 連線,以及SwiftUI手勢、控制、動畫、座標等概念,要一下跳到 AI/AR 是比較困難的。

對完全沒有接觸過 Swift/SwiftUI 的同學,則建議從第1、第2單元學起,這兩個單元篇幅較短,只介紹後面會用到的基本語法,讓同學快速進入狀況,熟悉 Swift 語言習慣與 Swift Playground 的操作。

以下是各單元課程連結:

- 下載Swift Playground App
- Swift [第1單元] 程式語言基礎
- Swift [第2單元] SwiftUI基礎
- Swift [第3單元] 網路程式基礎
- Swift [第4單元] SwiftUI 動畫與繪圖
- Swift [第5單元] 人工智慧程式基礎
- Swift [第6單元(上)] SceneKit 空間運算
- Swift [第6單元(下)] RealityKit 空間運算

下個單元有什麼計劃呢?

最近 Vibe Coding 相當熱門,以 AI 作為輔助工具,已成為長期趨勢,不管是寫程式、學習課業,甚至未來進入職場工作,都是必要技能。

Vibe Coding 需要具備一些程式設計的基礎知識,完全無基礎的小白駕馭不了 AI,反而容易被誤導,就像請別人寫作業一樣,沒有付出,就沒有收穫。

現在我們有了6個單元的程式經驗,應該足以和 AI 並肩作戰。至於要寫什麼題目,筆者還未決定,如果大家想到什麼有趣的題目,歡迎在底下留言。
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 8)

今日熱門文章 網友點擊推薦!