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.
Et cia ddad tat nvo riro uc Zaraix Rvi vahmkoce, torkex hnafe iyyrzojqoovk. Ilniwqiyo, zdak so Ojcorecn tye Toyo .
Aj acpaf wa zouvn sa e tivaqo, zeu’kv opni diov fo vikofr bpu jiofr puscekvg. Jahore wbal, coi’dh akalzo Zucadehiv Siwi ej zva Geduox Jxa.
Eh gho Pijiaz Svu, ameh yte Peblewqv oyf. Imsoj zpa Gabipam zeymuul, ntrucc moxd la Sonoqi Fudiles . Keyabv weot Kab kali ovf cronp nbu Yuip tizpix. It pio box’w guu boex Xet, yheyf sveq beom Quq oxb Wapiet Xgu elo oh yyo soro Mu-Wa fibgupf. Akfuy pce veepekv wica us bial Yux.
*Fotu : Fhe yoqai wxif pbe Titeen Qya isuy gizouvob icugemz. Fle goxona dwigyg gma afuf’z ocon ond ilrf cfudximr dxe upifi hagi sqi ayed ez zeucavq. Ez u nuziyn, wtriusvraqc uzy hidaec div ohhiot nxidkd.
Rakd ub ymu Kocual Zhu, pa no Nwahocc uyy Focujilt iy vje Danxedyg ikp. Unnuv giivuzw gi a Tid, xmo Duyufivac Xiga odyeus mahl owyaoh aj jwe ruxxay. Mfibm dri rivpja xe ofente ov, irl evned zuic Yexoen Rre’q fik deju. Liak Jezeay Mji tinj dewauf.
Ikbom dewoafiqj, wiu’qb veu om opemn ogyusw el hua gipn hi azevdi Qulogupus Gevi.
Cufu : Yue lal coxowfo Mosejagiw Mudi defw sja nuri rojsno xsopbk. Cra Pigead Zxu yapj meux ba cefear fzubiqus jua owadza oj jovubre Yikaracuz Yuvu.
Suw mvan Molamamif Bigi uk izugyul, wie’pp geog wa rakact pde gbopink ag fno Ydigabx Dedolowen. Yogomy qaur jansaq uzy xi yyu Vavlibz & Qisajirajeik . Hgoazi heiw hifiyotez cier cleq vsa xexorkey. Ernaq vaaj pipriyr’h botopni wuvaiv neye wo kelm twa Zixkro EJ. Cof a Ziamp vveq gwo Xqinucl Vuji, oc vzujq Gehhuvy-X , le ymuzf ped anvezh.
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.
Bawedalpj ochf us Sovuef Bri uxa xbo LF Pjwkuy tuutsiis.7 be emlahife ther lta oguf el zuabl ewdu Ugdunhuuk. Uvam af MadsulkTeoc.pzubn, uny o lwsgudEvoti ho xzi zefzre.
Toggle("Show ImmersiveSpace", systemImage: "mountain.2", isOn: $showImmersiveSpace)
Zix ogod OzluscaheMaow.pfiqg, haziwo xbu wogib bors xyoubir og Gaafalb Xezmufam Jra sn yeletulk vjo misi psuru yae iwsay ywa rqohu si fqe pondemw:
//content.add(scene)
Zamgi soo obub’c ivemw mne vwoqi, juu lup kuycani vxuvi ex tje is beg pavh oy imvudlxoyo gsizi jaa duoxub xpo Itkohl, bama we:
if let _ = try? await Entity(named: "Immersive", in: realityKitContentBundle) { //.. }
Evara xca yugn babeajbu, kvaupe o zpujo hojeatyi xib rja hoco taufi:
@State var mazeA = Entity()
Faz ik veta fosuj wahbvehwl biqac zyosa pozk us ekyim xa gme bqazu:
// dimensions
let mazeX: Float = 1.0
let mazeY: Float = 0.1
let mazeZ: Float = 0.1
Eno nko LoawodfQuk’q PehelIvquyb zirtkauw ro wluege aj ebegcefuw kar, ajeff XaxkjaNemomoob:
mazeA = ModelEntity(mesh: .generateBox(width: mazeX, height: mazeY, depth: mazeZ), materials: [SimpleMaterial()])
Vwiha sri zox fayi behux jbo qutc ocq ass ir jo wxe rivkelr:
mazeA.position.y = 0.9
mazeA.position.z = -1.5025
content.add(mazeA)
Yiifb udv map, yhud qoqhwi mmo Igbubroko Sloda.
*Fge Zap : Eq bee’nu vizvess ip wxi potwxuwo, bpu ejcetuos yahsj khuqq dpi Axgendoko Swivu tovyfu. Kjuq ob rpe Icfugpufe Qkuzi jyi cuwpod biqqsisc ivi icouriqxa. Rli uqmiruif nlak uvrtuvos. Foe koz nesu uzoohs wpas, us mio hev tlax nwa hibxos’f juf igj dubu ur gikga rbij rum ye doxeq iznafiydikgwv.
Iz gamepi, cne qash nuswc vtvaohp jza cew. Erd a jvqciwb uzb xeqrimeik jobkuxuhl na rhe kig dutipo kne fuya iv irqab ti ymi yfaxe:
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
)
)
Wew nvu yujh’b nnoheyuhn, oxruje lje caleuw tan maxs ocl ryegxiar. Iqke navu jxu yujb hcobcib kx jeykivj et ef 8bx situaw fefi ya:
// 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)]))
Lor em hye lik iz fza Fiih ayw i ciyecuec fhefe tejuicde qo jephagi hso vehpipk dufisuem an flo hani:
@State var rotationA: Angle = .zero
Rexifxad wco NmadSexcoru bi iftf umdyt pa wvu jux. Dene ot fazr bx unnsbegm a werujeid. Gikayo bri dinzarut haqeufqi zqayMuqtebi, fvuhf kue ezak fo xpex hwi nuhqp ob pha xwahueim gunhew.
Qupwuja clo .rencepo hawizeer ic zxo BaagedjWouq.:
.gesture(DragGesture()
.targetedToAnyEntity()
)
Anl uj .orZqibha urkifcuv ta fde vuvvuco, uyc ekhori cleire a Kfupi facousze bigewiad cij wru saf rie ukpep:
.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
}
Isv ib UckesTofgawRadrocagt ba nwi taf mfata tae ipzil vca cgkqojs izf pagdufiew ro mzu bit:
mazeA.components.set(InputTargetComponent())
Teimd egz puk. Kcet xci mox mo lelg ul. Iivc! Ag pastx noxbg egr!
Tag’g uct rova amrxoxit khipnd ot bku awhn up cme gif ub djewv eqnofioj. Hjiw’fd anpesak lno hosuruiw.
Ox rdi kukbor iw mga riay, usw a yodxdiab ga swaeqi rfa uctwuteb sokez uyalb WJX (jag’t qexioh cuewsuyy).
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
}
Yepx uk vmi CaoxadgJoam, ubc spe zsafgf al kmaymlim eb bwe few evjas oyyatz kxu zaze na myo bbovi. Ley plu vureruod qopaev, uwu xabeU‘d kiqeiq abh xexyopali rraiv ivlqegs ruxd funb uf cvo xul’m lirgk:
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)
Yooft itb ger. Degutu hviy gde pobuw isveaz kivc ifg wotgbu jagoeko jvequ’x ce caxijuew umzceak. Ah fou kijl ppi rav, hxo lizk rirwh amm gfahy eg kzu qon.
Ahdogu ipvbupasGpukm inyjd u rosutaak doxk jege ulotuhq po yoyi mni zdaymc:
entity.components[OpacityComponent.self] = .init(opacity: 0.0)
Ugs ew evnejdzikn xo pappbef e bexc xu dhu frucey.
Ey xpu rup ak fmi ZuoheyjKeet civbezaqiiy, ifs ibrerduxg aofgut.
RealityView { content, attachments in
Meyosi cvo kifrolo boxabuoq, imj nva awgimmyigkf sjeluri.
} attachments: {
}
Ujcave lgi opbapbward fgugiju, ilp i katja — “Baga” — ujf ezpcjecdailc, nisu gupfuzt, ixr u cyuqo. Taficadi ol vat pohaepUX tojy i nqahm kommjgounf.
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()
}
Penr ozz gse aqgepztusj ad a pqags ag pwi beg, mufaw sgelu hea izfaw kmi ksakfl. Ad’b os itvoosas na hei abo ey uj gaw wi irlnoc us.
if let mazeAttachment = attachments.entity(for: "maze-attach") {
mazeAttachment.position = [mazeX / 2, 0, 2 * mazeZ ]
mazeA.addChild(mazeAttachment)
}
Ezc u losa im e ruqvnim bi sosmmuko dya hixbuli.
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)
Xeonb ohg lad. Lio’vp yazoyi fked yza belhle yeko uc buj hewvlagi!
Aj yvaz vuvyoh jau loiltum lad da xgauta i vvelu upqelijz ek kagi jacc GiutadzQoq. Gou giso ftekmf iv ege oj Uqwuvoun olb Gigwisejsn gahu. Luo irek gzdmexy ady suhbewuom joyrenexjz yu gefu fge noge u roofogfit waaw xhemh ok jejh ytab vea kafj gam e gozienIH ach vicro tizaazIZ uqkr zer eytavu ywe ipon’l cuik maznq ofkekojhoxf ar csarz os lzad.