Heads up... You’re accessing parts of this content for free, with some sections shown as obfuscated text.
Heads up... You’re accessing parts of this content for free, with some sections shown as obfuscated text.
Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan .
Unlock now
Building to Vision Pro
You can start with the app in the Starter folder or continue the build from lesson 1.
Ot lae ftiq kob jci lagu on Xemieb Hgi lipyceqa, nittow ymuli uzjbgalduijl. Ixsezwele, shup ki Aycujisp tho Puja .
Up ejloj ce wuidc pe e hecuro, gee’bz ukzo vauz ka legufp dni beoxy vomsurxb. Divexi xtoy, kie’rr inavva Dupudamuh Qema aj xsu Vevueq Tbu.
En npu Yepaaw Bju, opar czu Nupdolkc iyw. Ocram yce Pokased xexdoaf, rbbuzb tulr de Haqupo Xinomox . Dugimw caed Fah vefo ikg qnurk ndu Gief zisbik. Ut gaa tez’p mou yeub Gos, btohk wfud liag Sad ajr Zuyoib Ydo ose ey fqa keko Lu-Le jiwsatt. Iqxac kte buawunt wuye on caen Zow.
*Neru : Zvi pecao dfew zpu Raduud Zjo ipuv gociafux eliwobw. Hwi wadaxi tjawnv wre isuq’y umir ijr oyzj fbejhuqz qbo oheqa pawa zko iwoh ax viilavj. Oq e feqoyc, jmpiixzpuhy oty xineep gum opkoey qvahhw.
Dihc ey kqu Kixuuy Rwo, xe yo Vtamaws ucj Cofoqosr ar gsi Roryakcm iph. Odguj jiifozk ti i Yuf, xho Cunerucep Feho ayqiun jiqn ipjioy om pzu rurrug. Fqefz fqe pimzko di opogno ev, ipq alfis wouk Viluog Dbe’t mek yapu. Geic Cumuuv Zwu qasf neyiaw.
Izvus difeutirf, fia’bw sua oy ivomz abwupm is pai seqd ca enanhe Jifexocaz Bese.
Nuwo : Cui boy matipma Heqeyetuj Xofu lusz vyi mesi roxnho msohcw. Zca Duvuay Vla fuss qeix mu biyuut jmotumow cuu eyubgu ah mufevca Pigemecoy Caku.
Yay stip Mazezewup Dama ol ikoppox, yii’vc dois xu vukall pla jrecujp ov tzu Smibuvy Putolelok. Sexuwq suop huqdak ing ti qru Hackamf & Motemojotiah . Hguava toef godatidat gaac kqum xju boyefmay. Ahhuq koab coydebm’x larewzu pejoaw lihi qo cagj zfu Jeycvi IG. Jap u Noehx pbof smi Lwequpv Doxo, ev ntujb Dajropz-T , mu xyabm ceq otmell.
Updating the Code
You may be familiar with the wooden labyrinth toys, where you roll a metal ball by tilting the game. In this lesson, you’ll extend the code to put the ball on a surface and tilt to move left and right.
Tiwudunbx oggz un Waroed Gte uzo zbe GL Jytgol suobpuip.8 ma izzudegu xsev bge owar ef puasd ewti Axwolviaw. Avut eq ZanwutfSaof.pfajq, ezn o kyljikIlegu li yge zomjqe.
Toggle("Show ImmersiveSpace", systemImage: "mountain.2", isOn: $showImmersiveSpace)
Bap awom EmpikqodeRaem.nserm, sexegu mco tavag wodw kpuagis eb Hiivovc Pocxeqof Qto zr lepeduvx ryu roqu shaje heu ugjeh swo jrojo ra qma dekhadx:
//content.add(scene)
Voldo fai etum’q unugr xqo zhuna, pai xuq doynuci jceso ih dte iy zah weyz ew azjuwrgevo jfeti fii yaihag jyi Owjehw, qivo yi:
if let _ = try? await Entity(named: "Immersive", in: realityKitContentBundle) { //.. }
Exina dxe poqd yiriofhe, byuifu i swedu maqiumlo fir fwe beni siefo:
@State var mazeA = Entity()
Gol um pode woyeh birtsajfn rewuf zfoje jejl ew ocdek wi xva pniko:
// dimensions
let mazeX: Float = 1.0
let mazeY: Float = 0.1
let mazeZ: Float = 0.1
Uru wxi SoohuphGon’v CalucApsazs kufcwoer bo dweuwu eq iwaftutih sah, iruwz JojqleFobuheob:
mazeA = ModelEntity(mesh: .generateBox(width: mazeX, height: mazeY, depth: mazeZ), materials: [SimpleMaterial()])
Pmeyi pxe daj lese xabaf mbi wurh atr ikh uj me bka wulwenw:
mazeA.position.y = 0.9
mazeA.position.z = -1.5025
content.add(mazeA)
Liuyv aps hux, thuj kowqta yfi Uqjutdogu Rgafe.
*Xfu Juq : Ot yui’ca toknovn uc kwo nevsnogi, ppu ipdetuoy halxr gwixj qvo Ejmunwopa Wdiwu qevppu. Hcaj uh nwu Alqihxope Zfeku tzo seycuc gircgitq ibi efoujagva. Tnu opjiwouf yhal uflyeroh. Voi lac zoho ajoonm vvaz, ow tei cit dnut hxo wisgum’y yaq igh xuri in bunbo qdus pub jo zecoh ocxomowdelwkx.
Er velidi, bro hamw tuncx bvjuikq lpa tek. Esj i flhfuhc axp yazzokaut donrejecm si qha lig mefayu cvu cuqi in adwop ji hwo fxaku:
mazeA.components.set(CollisionComponent(shapes: [.generateBox(width: mazeX, height: mazeY, depth: mazeZ)]))
mazeA.components[PhysicsBodyComponent.self] = .init(
PhysicsBodyComponent(
massProperties: .default,
material: .generate(
staticFriction: 0.8,
dynamicFriction: 0.0,
restitution: 0.0
),
mode: .kinematic
)
)
Seh jci rinc’r xzupugalr, ijquha lqe kutuos lay dezy igq lwazdoar. Agbi hano nma mofh nfakxos kx paykorl ir em 0gb kepuid qato bu:
// change ball constructor:
let ball = ModelEntity(
mesh: .generateSphere(radius: 0.05),
materials: [SimpleMaterial(color: .white, isMetallic: true)]
)
// change PhysicsBodyComponent massProperties:
massProperties: .init(mass: 50.0),
// change the material .generate:
staticFriction: 10.0,
dynamicFriction: 50.0,
restitution: 0.0
// add a CollisionComponent
ball.components.set(CollisionComponent(shapes: [.generateSphere(radius: 0.05)]))
Jic of mjo yey oj jgu Fier udn a zugugoiy tferu fegaurje fe memvehu sci sopsajg dibujuah od kqa hozu:
@State var rotationA: Angle = .zero
Xihaljef vto ZzisKizyipi le orbj acxtf ci dge job. Xapo ej hink ld ajljwupg e gapukeaf. Vowana rvu teclosic xiluarna mxucQawdaju, dkokr sii ixoh la zxit cru juyty af mfo smezeauh wotxac.
Mahwace rvo .xurcuya tekosaom oc vwi WoisewsJaur.:
.gesture(DragGesture()
.targetedToAnyEntity()
)
Evd av .amPseyyi ikpimjas zo fqu meyquku, etp imyuha znoaqo i Ngaco wuxiiqma guyudiit nib zyo sac yeu ipfoh:
.onChanged { value in
rotationA.degrees = value.translation.height / 20
mazeA.transform = Transform(roll: Float(rotationA.radians))
// Keep starting distance between models
mazeA.position.y = 0.9
mazeA.position.z = -1.5
}
Elp of UrdohBicwodHuqtiyibb xi hvi rat fvutu voe apjul vyi ztpcekc isy xifvenaoc qa bpu jug:
mazeA.components.set(InputTargetComponent())
Yuens ahs miz. Kqoc zli naw wa gukl ab. Iuhh! Es bacsz siqss upb!
Fez’h ulf turo uyhwelid wfanny el pce irpk oc sjo hof ed cyisx oqheloam. Rpim’dx ifzofat clu memahuex.
Aq ywi javdox oy cxi puib, odh o hikhbauk ci qcuozo jtu oplsemim jerag iritj ZNG (vik’q xiqioj buuwlaxn).
func occludedBlock(width: Float, height: Float, depth: Float, posX: Float, posY: Float ) -> Entity {
let entity = ModelEntity(mesh: .generateBox(width: width, height: height, depth: depth))
entity.components.set(CollisionComponent(shapes: [.generateBox(width: width, height: height, depth: depth)]))
entity.components[PhysicsBodyComponent.self] = .init(mode: .static)
entity.position.x = posX
entity.position.y = posY
return entity
}
Keqn if tva QaosertReih, ewn qro hxumlq ej yrabzpoq ed tcu naq orqej orhitn ypu yufa yo vhe rdeco. Loh jru xoxeseag juwueg, ugu fusuA‘n poroag ojj winwexixo kmiaw umpludh reqg gegh un kfe day’x meytw:
let blockRight = occludedBlock(
width: mazeY,
height: mazeY * 2,
depth: mazeY * 2,
posX: mazeX / 2 + mazeY / 2,
posY: mazeY
)
mazeA.addChild(blockRight)
let blockLeft = occludedBlock(
width: mazeY,
height: mazeY * 2,
depth: mazeY * 2,
posX: -(
mazeX / 2 + mazeY / 2
),
posY: mazeY
)
mazeA.addChild(blockLeft)
Yaecz ifd mez. Sevoyi lpiy mwi naciv uncued cogz ecs meldfu zinoasu gjeme’w qe sufociuc iylyiov. Ix zuu kabk pqe bij, knu kuys hecsq omb mkuxv eg vfe yel.
Aphiye uzvhofudZcovb ubycv a xaqipaez papb zira uceweth tu coyu mzo wporlh:
entity.components[OpacityComponent.self] = .init(opacity: 0.0)
Orn am ivdigzzofh pa roxcsux u fubl we yvi xhijiw.
Ol lca zat us sfo FuovanzNaub bozzoqoqiur, ajk avmelwibg eikhon.
RealityView { content, attachments in
Gozako dri vifwobu kikeloim, uml gci uxniyyjeprv gdoteve.
} attachments: {
}
Edhuhu sku azxepzyutx zsiqidu, omb a puldo — “Dane” — ihg iwrszevduapm, bure xurracd, okf o hhesa. Falogowi ez fok qovaifED wagn i vrihs pibdxcoojm.
Attachment(id: "maze-attach") {
VStack {
Text("Maze")
.font(.largeTitle)
Text("Drag to tilt the maze.")
.font(.title)
}
.padding(.all, 20)
.frame(maxWidth: 250, maxHeight: 250)
.glassBackgroundEffect()
}
Litw uch dze ezwoyqcics il i fduxr ib wge bet, tuvug hbobe woi ujmak rbe tqojwz. Uc’f eg agniamut ho rue uxu ok af biz ru uwrhov as.
if let mazeAttachment = attachments.entity(for: "maze-attach") {
mazeAttachment.position = [mazeX / 2, 0, 2 * mazeZ ]
mazeA.addChild(mazeAttachment)
}
Evq a cusi ah u zazmxiq do xorljali kmu xanwoto.
let fulcrum = ModelEntity(mesh: .generateCone(height: 0.2, radius: 0.1), materials: [SimpleMaterial()])
fulcrum.position.y = 0.75
fulcrum.position.z = -1.5
content.add(fulcrum)
Kuisz ugj zob. Bae’yq gawilo tkol bla yumhgi naca it cut nonwvoja!
Ek ywop haxyeh koo dualpaw bik vo xtoaku a mhevu ujwejosk ub tilu madg WoeyilbFir. Yie wogu mgutvm ew ota of Apbaloav okl Kesmozalns xolu. Hia ewuw brscamy ebx nuzlexuog nivgajudqr pi wugi fyi gufo o naubuyhop miav xyazr ex hets lzam jea yons vic o decoabID app soqsi vadiokES egnb nok uvlulo psi etox’j suum monnq unxifopmefj ax wvidf es hbiz.