Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
栗まんじゅう問題を体感するアプリを作って入門した ARKit + SceneKit
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Sosuke Okubo
November 19, 2018
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
栗まんじゅう問題を体感するアプリを作って入門した ARKit + SceneKit
Sosuke Okubo
November 19, 2018
More Decks by Sosuke Okubo
See All by Sosuke Okubo
“Build trust through better privacy”を見たメモ
mojage
0
110
IPによる地域制限の浅い話
mojage
0
29
Android Robo Test
mojage
0
76
Kotlin Multiplatform
mojage
0
54
Actions on Googleのアプリを作ってみた
mojage
0
130
SKStoreReviewController
mojage
0
480
スマホアプリ開発で位置情報をシミュレーションする
mojage
0
300
Other Decks in Programming
See All in Programming
Next.js: The final boss of Web Performance
guaca
0
280
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
190
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
110
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
JIS keyboard support in Omarchy
lef237
0
130
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2.5k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
710
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
570
New Earth Scene 8
popppiees
4
2.7k
Prompt Engineering for Job Search
mfonobong
0
520
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Believing is Seeing
oripsolob
1
250
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
570
Build your cross-platform service in a week with App Engine
jlugia
234
19k
GraphQLとの向き合い方2022年版
quramy
50
15k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
From π to Pie charts
rasagy
1
400
We Have a Design System, Now What?
morganepeng
55
8.4k
Transcript
܀·Μ͡Ύ͏Λମײ͢ΔΞϓϦΛ࡞ͬͯೖͨ͠ "3,JU 4DFOF,JU 9UPOFࣾษڧձ 4PTVLF0LVCP
J1IPOF93 ങ͍·ͨ͠ʂ
࣮ફ"3,JU ങ͍·ͨ͠ʂ IUUQTCPPUIQNKBJUFNT
"3,JU w J04ͷ"VHNFOUFE3FBMJUZ'SBNFXPSL w J04ͰՃ"3,JU w J04"3,JU w J04"3,JU w
J1IPOFTҎ߱ͷͰར༻Մೳ w 5SVF%FQUIΧϝϥ͕ඞཁͳػೳ͕͋ΔͷͰ͝ͱʹ͞Βʹࡉ ੍͔͍ݶ༗Γ
4DFOF,JU w "QQMFۘͷ%HSBQIJDTGSBNFXPSL w J04ͰՃ w 9DPEFͰ6OJUZ&EJUPS෩ͷ։ൃՄೳ
6OJUZWT4DFOF,JU GPS"3,JU w 4DFOF,JU w 6*,JUͱΈ߹Θ͍ͤ͢ w ใ͕গͳ͍ w "3,JUͷ࠷৽ػೳ͕͙͑͢Δ
w ʢ6OJUZͱൺֱͯ͠ʣϏϧυָ͕ w 6OJUZ w 6OJUZͷεΩϧɾࢿ࢈͕ར༻Ͱ͖Δ w ใ͕ଟ͍ w "3,JUͷ࠷৽ͷػೳΛར༻͢Δʹʢجຊతʹʣ6OJUZ"3,JUQMVHJOͷରԠ͕ඞཁ w Ϗϧυ͕େม
"3ͷΑ͍ͱ͜Ζ w ݱ࣮ͰෆՄೳͳମݧΛݱ࣮ Λ֦ு͢Δ͜ͱͰମݧͰ͖Δ w ϙέϞϯ(0ࣗͨͪͷ֗ ʹϙέϞϯ͕͍Δͱࢥ͑Δ w *,&"1MBDFՈ۩Λങ͏લ ʹՈͷதʹՈ۩Λஔ͚Δ
IUUQTXXXBQQMFDPNKQJPTBVHNFOUFESFBMJUZ
܀·Μ͡Ύ͏ IUUQKBVODZDMPQFEJBJOGPXJLJ &"&#&&&&& &'&"$
܀·Μ͡Ύ͏Λ࡞Δ w #MFOEFS͔ΒEBFܗࣜ $PMMBEB Ͱॻ͖ग़͢ w ؒҧ͍ͳ͕̍͘͜͜൪େม
ϞσϧΛ9DPEFʹΠϯϙʔτ w ϝχϡʔͷʮ$POWFSUUP4DFOF,JUTDFOFpMFGPSNBU TDO ʯΛબͯ͠EBFܗࣜΛTDOܗࣜม w EBFܗࣜͷ··Ͱѻ͑Δͷඞͣ͠ඞཁͰͳ͍ w 4DFOF,JUTDFOFpMFͱ͍͏ͷɺ6OJUZͷ4DFOFͱ΄΅ಉ͡ͰΦϒδΣΫτΛஔͨ͠Γௐͨ͠ΓͰ͖Δ
ฏ໘Λݕग़͢Δ w DPOpHVSBUJPOɺଞʹ"30SJFOUBUJPO5SBDLJOH$POpHVSBUJPO "3'BDF5SBDLJOH$POpHVSBUJPO "3*NBHF5SBDLJOH$POpHVSBUJPO "30CKFDU4DBOOJOH$POpHVSBUJPOͳͲͷछྨ͕͋Δ w DPOpHVSBUJPOΑͬͯɺಘΒΕΔ"3"OLFSͷΫϥε͕มΘΔ w
"31MBOF"DIPSͷ߹ɺฏ໘ͷҐஔେ͖͞ͷใؚ͕·Ε͍ͯΔ w "3'BDF5SBDLJOH$POpHVSBUJPOͷ߹ɺ"3'BDF"ODIPSͱͳΓإͷ͖ύʔπʹؔ͢Δใؚ͕·Ε͍ͯΔ let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] sceneView.session.run(configuration) // MARK: - ARSCNViewDelegate func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { guard let planeAnchor = anchor as? ARPlaneAnchor else { fatalError() } import UIKit import SceneKit import ARKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView!
λοϓͨ͠ฏ໘ʹϞσϧΛஔ͘ w λοϓͷݕग़ʹී௨ʹ6*,JUͷΫϥε͕ར༻Ͱ͖Δ w "34$/7JFX͕IJU5FTUϝιου͓࣋ͬͯΓɺฦΓͰ͋Δ"3)JU5FTU3FTVMUΫϥε͕4DFOFͷ࠲ඪΛಘΒΕΔ w IJU5FTUϝιουͷUZQFTҾɺ"3)JU5FTU3FTVMU3FTVMU5ZQFͱͳ͓ͬͯΓฏ໘Ͱͳ͘ಛͱIJU͢Δ ͔ͳͲΛ֬ೝͰ͖Δ w ࠓճ܀·Μ͡Ύ͏Λޙ΄Ͳ૿৩ͤ͞ΔͨΊʹɺ༻ҙ͓͍ͯͨ͠܀·Μ͡Ύ͏ϊʔυΛΫϩʔϯͯ͠Ճ͢Δ
let gesture = UITapGestureRecognizer(target: self, action: #selector(onTapSceneView)) sceneView.addGestureRecognizer(gesture) @objc func onTapSceneView(sender: UITapGestureRecognizer) { let location = sender.location(in: sceneView) let hitTestResult = sceneView.hitTest(location, types: .existingPlaneUsingExtent) if let result = hitTestResult.first { let node = kuriNode.clone() node.position = SCNVector3( result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z ) sceneView.scene.rootNode.addChildNode(node) } }
ཧԋࢉΛద༻ͤ͞Δ w 4$//PEFͷQIZTJDT#PEZϓϩύςΟʹ4$/1IZTJDT#PEZ ΠϯελϯεΛՃ͢Δ w 4DFOFͷΦϒδΣΫτɺΠϯεϖΫλ͔ΒઃఆՄೳ w 1IZTJDT#PEZͷUZQFʹɺTUBUJD EZOBNJD LJOFNBUJD
͕͋Δ w ࠓճͷ߹ɺ܀·Μ͡Ύ͏͕EZOBNJDͰɺ·Μ͡Ύ ͏͕ஔ͔ΕΔฏ໘͕TUBUJDͱ͢Δ let shape = SCNPhysicsShape(geometry: planeNode.geometry!, options: nil) planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: shape) planeNode.physicsBody?.categoryBitMask = 2
࣌ؒܦաͰϊʔυΛ૿৩͢Δ w 4DFOF,JUͰ5JNFSͷΑ͏ͳఆظ࣮ߦΛߦ͏ʹ4$/"DUJPOSFQFBU'PSFWFSΛ༻͢Δ w 4$/"DUJPOɺ4$/"DUJPOTFRVFODFͳͲΛ͏͜ͱͰෳͷ4$/"DUJPOΛΈ߹ΘͤΔ͜ͱ͕Ͱ͖Δ w 4$/"DUJPO4$//PEFͷSVO"DUJPOͰ࣮ߦͰ͖Δ w ࠓճͷ߹ɺඵ͝ͱʹݱࡏͷ܀·Μ͡Ύ͏Λͷ͚ͩ͞ΒʹϊʔυΛՃ͍ͯ͠Δ w
࣮ࡍͷόΠόΠϯ͝ͱ let position = SCNVector3(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y + 0.05, result.worldTransform.columns.3.z) let wait = SCNAction.wait(duration: 5) let add = SCNAction.run { (node) in if self.count > 0 { for _ in 0..<self.count { self.addKuriNode(parentNode: node, position: position) } self.count += self.count } else { self.addKuriNode(parentNode: node, position: position) self.count += 1 } } let repeatForever = SCNAction.repeatForever(SCNAction.sequence([add, wait])) sceneView.scene.rootNode.runAction(repeatForever)
Ͱ͖ͨͷ
·ͱΊ w 4DFOF,JUใ͕গͳ͍͕ۤ࿑͢Δ͕ɺ"3,JU Ͱ࡞Γ͍ͨͷΛͬ͘͞ͱ࡞ͬͯΈΔͷʹ ͍͍ͯΔʢͱࢥ͏ʣ w "3,JUָ͍͠ w ܀·Μ͡Ύ͏ා͍