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
69
Kotlin Multiplatform
mojage
0
53
Actions on Googleのアプリを作ってみた
mojage
0
130
SKStoreReviewController
mojage
0
470
スマホアプリ開発で位置情報をシミュレーションする
mojage
0
300
Other Decks in Programming
See All in Programming
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
250
Intent as Code
shoppingjaws
6
1k
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
510
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
480
AHC070解法紹介
eijirou
0
120
アクセシビリティから考える情報設計
high_g_engineer
0
380
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
700
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
420
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
440
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
140
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
Become a Pro
speakerdeck
PRO
31
6.3k
First, design no harm
axbom
PRO
2
1.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Designing for Timeless Needs
cassininazir
1
480
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
530
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
WCS-LA-2024
lcolladotor
0
830
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
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 ܀·Μ͡Ύ͏ා͍