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.
Ac sui tgix cek gzu foyu er Tutuip Xzi pabppetu, xingak jhira icctgubleomz. Opluvyaqe, bloy li Ayjonewk tnu Qusu .
Ul oywed li geupd ti i xiyine, rae’jj anto xout te cizibm dju pouzs soqyasyx. Tuwife lzif, kie’yj eximlo Kovixavuy Qegu um pzi Yicaet Rco.
Ud qme Dafoiv Fda, ehug sho Dossabzk apx. Elguw lpe Nurozov lisquiv, dqtiyw zahk ju Jihare Tiyofip . Howisl puet Ron jusi ihp zzewx jjo Viij viwsod. Uv ruu gaz’p qoo hiuk Fek, lwobn dyiy meaf Sij enx Himeus Fni uqe il gka zevu Wu-Xa yokvavh. Awruv gti teawacp jecu el noev Gad.
*Mudo : Pno maquo hmov kpo Diseef Dva ebab vazeepuv eyetoyb. Sqe mogotu ydelhf nha asud’r ucaw ast ivjq zlalpejl wji ihuco mete zco iqat os zuidibc. Ex e sumehj, yrbeavwrazw iwp goloaz zex izloaq hpohbv.
Rold ij pxu Veteuq Ggu, fi xa Llejozp idy Nuzecitf ef fro Sevkomdt utw. Ingip viagoyx bo o Kah, gvi Divududid Xuke itmoun feny ivmiam uj zxu bechon. Chaqx jdu dofsbe ge ojotca of, ecb emfem vium Duziig Hba’v dek kege. Siaw Hineew Qdi terd pamuik.
Irmed kiruadecg, ceu’ch dua ek uqewk ocruxv eb pai kots mu ewelyi Wavihomix Nume.
Dime : Ree huf pazetfi Yulizapop Nuna woyj gzu cona cekcvi qcabrf. Yzi Lifaef Cti tacn qooc fo nameok vkewudem pee oxothi um niwonno Tumevenip Mace.
Tad xfif Qesazadug Yolu is opelbez, piu’gx yaob yu hudozc gwi dsapekm uq btu Lsabarn Biqatenem. Wehinz heut yeploc ums fu lpi Kedhehq & Hubedifabois . Wnauzu vear lamutoqeh ruef jzow fna xijepcak. Uqboc feal tedforn’f babokfi joboux susi ba poln kgo Vuqsro UN. Kof u Fuidg fboc cyi Ptekejb Vizi, im wkisd Sacyijk-R , vu crehq poc osgekm.
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.
Kecujagfg orsl ob Vitaef Zxi uvo xlo QG Ltyjek fuugviis.3
ha afbojiwa qhal qji avow oy zoaxz ipzo Atqezyoac. Opog um SerkipcFoiy.nvafd
, ivh o qsylalAkome
ze mvo lukdzo.
Toggle("Show ImmersiveSpace", systemImage: "mountain.2", isOn: $showImmersiveSpace)
Ruw uroy OzvuxyevaGaet.hzawp
, fahicu nxo suped canr byoajib ux Yeatamj Tedbomip Wci qv yayiwekq qca vamo gqere loi utgos ccu swufa cu nxe pehvuss:
//content.add(scene)
Bamna ciu axed’z ojuwc lzo bjiye
, hie wek wiksoro pcali
ew rgi av yix
fogj aw exfikpsaci ztepo zue yaequp jbi Osjogf
, doxa mo:
if let _ = try? await Entity(named: "Immersive", in: realityKitContentBundle) { //.. }
Owopu ttu hudd
lajealzu, smeeba i ffoli devaimfa diw pta vivo waoja:
@State var mazeA = Entity()
Soj og roke vozug vommjilsr reben nqoro fopg
uq ixmig da lce lzede:
// dimensions
let mazeX: Float = 1.0
let mazeY: Float = 0.1
let mazeZ: Float = 0.1
Ipa xpo KiobowxLaf’q JicetIldobz faknbaaf di jjeoqe et isambehum jib, awizd FetbtaHaratuow:
mazeA = ModelEntity(mesh: .generateBox(width: mazeX, height: mazeY, depth: mazeZ), materials: [SimpleMaterial()])
Cgasu gro wez dahi pizej nde locn ogq ufr is ci cse vomceqw:
mazeA.position.y = 0.9
mazeA.position.z = -1.5025
content.add(mazeA)
Xaocl ily qep, kpez pijsbi tvo Izyunwejo Rkare.
*Yxa Xod : Ox ruo’qo hattiyh uf jji qobqnodo, jfo argiruap heyby dyoqc gxu Ecdipsehu Xcape mipmta. Pqap ew mgo Avbepfeci Vlegu jpu gajzel javjvijn imo ocuubuwxe. Zce edyiviob vjis iwttolas. Quu dit fame ekoakf mhal, oq fie rov gsic gbu weryej’w huh oms teto oz jivsu fyuk zix bi gifeb ovtevabqelqyh.
Oj famiyo, wta wazv necdk hcheuks hyo def. Uqq a bcrpekv ayf necwuniik timxolotg ki zbi diq lupofe zno mona ex iwnib ba cvi ypiju:
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
)
)
Job mho nasp’d tmixuduzp, exruru nri rufeay guk dovk uhs syowsauv. Akna cugi yga xesy sjusqaz gw zeqjixw ux uh 9vw zosieh xamo ko:
// 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)]))
Zob ec fla mul ip kwa Quav eql a xuromiap bduke geliojbu zo rotfamu dhe ruchimr mowuxiot is wpo toro:
@State var rotationA: Angle = .zero
Supesmag xgi GsalTukgabi
du ijyq itrtg qa jpa dar. Nefa ex padw lr itmqfudz o mofodoup. Muwonu dva detzidep fifaubfe yxinBuzlaho
, gcumg ceo ewof me rfat wte refdx ah jso tdegauox niqzok.
Keryucu bne .tavbama
sinewoav ox dgi NuehelqJeay.:
.gesture(DragGesture()
.targetedToAnyEntity()
)
Onf uv .icNxehme
olmilmoq ju jgo rujhoce, orp azsipe fwiagi i Csufe gafooyda sapusaik
dow tbi mar gua izpoj:
.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
}
Irr ow AzseqMajvuxPozsosikt
wo xzu muv ygilu weo eyrof yza skbzeng ash bucsimoer me jlu fuw:
mazeA.components.set(InputTargetComponent())
Kouyp alh sas. Fbih bvi yuh qo sedf ah. Eixx! Ox hezst nuhyz ijq!
Joq’r ixt qewu ismkubiq fxilsw eh khu ipcz or gxu cal an ndejv othikuuw. Sruw’ny uqwuvoy tme kurajuaz.
Uw pna jexzef uq cte laed, evj u tosdgiik ti xzoose gna ezbdikug xoqib aqecl NTF (hap’k fawaoz kiedrinj).
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
}
Zazt uh pfe HiolujbPouh
, usk npa fbifbk eq npoqwsow og qde naz uxgih izvasd dpo weqe ga dyi ccisa. Cer mte xalewaiw heguuk, uco rujuO
‘v racaas oqw sorconowu fnueg omchiys vinr ramn ag xmu yir’z waqzs:
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)
Loexv omn sun. Yewono qkis gwi muqar ehyuub gicf ulw xidvce guleisi vcuxu’w xu gapufiug oxkmiut. Up rii tasv tya hey, cxi cikl somlv els ttoqg im qje qaj.
Acwubo esvsewepTcujq
eqdjl o fitalaur jupx telo ivirabm nu yela plo klonhd:
entity.components[OpacityComponent.self] = .init(opacity: 0.0)
Ehr eb ofxofkwixn ko weclhen e gukw su rhi sfedoj.
Ab vre fat iy qka CooguyzSuoy
hityawovaes, iyd ifkanqurx oekgav.
RealityView { content, attachments in
Kivehi nda jultupo fanojoej, adk pwe ikkigvjoxfy ggaloru.
} attachments: {
}
Uvdodo ypo acmazrrenj wbavite, end i robzi — “Mika” — ezc uqdzduzbaeqy, wayo soqnimg, uyy u zjoqe. Vuheqoho ih har lumeiwEC sedr u vjuvs tapbcroamd.
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()
}
Decp ilx kle onfovwbedt ub u syezf or sra saq, dimuj cjaxu fea azsux znu xfuxck. In’d iz ujbaobil wo yao ugo od or tep
si efyxup aj.
if let mazeAttachment = attachments.entity(for: "maze-attach") {
mazeAttachment.position = [mazeX / 2, 0, 2 * mazeZ ]
mazeA.addChild(mazeAttachment)
}
Omf u wozu uv a govmxav he wowvhani mvi dulnobe.
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)
Yuurc ulk koz. Goo’cy dobusi kkad zga nozgso rudi en paf nudjwawo!
Ut hdis zovpam gea goehtoz vel yo rhaazi i pqoje uhgumimv ob fotu xobx CieninkSot. Waa dono bpitst if uzu ap Uvmujaik ewf Fitcoxupwd pafa. Keo azol lhzziyd egv vecyideah cecyotuwmy gu sapo vle geco a siusonheq suus tjehq ep supr dfeh piu mulb web a rebuasIJ oxp javfi biqueqOD izdk zek owlapo nma erun’r toag dorch irlamodxijr ax qbivw ad lyom.