Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
1日でできる!ARCoreことはじめ
Search
zukkey
August 23, 2018
Programming
1
3.3k
1日でできる!ARCoreことはじめ
初心者でARCoreに興味がある人のために
AR初心者の私が、1日あれば大体できることをまとめてみました
zukkey
August 23, 2018
Tweet
Share
More Decks by zukkey
See All by zukkey
Android Studioではじめる実践ARCore入門
zukkey
1
2k
Pairs JapanにおけるActionLogの目的と実装について
zukkey
0
950
Other Decks in Programming
See All in Programming
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
430
PostmanでAPIの動作確認が楽になった話
h455h1
0
170
Polars入門
daikikatsuragawa
1
100
Rubyでたのしむクリエイティブコーディング/Enjoy Creative coding with Ruby
chobishiba
1
180
Build Apps for iOS, Android & Desktop in 100% Kotlin With Compose Multiplatform (mDevCamp 2024)
zsmb
0
340
Java 22 Overview
kishida
1
180
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
140
Site Reliability Engineering for GMO
pyama86
8
1k
SIMD Parallel Programming with the Vector API
josepaumard
0
180
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Ruby Pattern Matching
bkuhlmann
0
930
Fragment Composition of GraphQL
quramy
7
1k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
17
6.4k
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
Building Adaptive Systems
keathley
31
1.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
241
1.2M
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
A Tale of Four Properties
chriscoyier
151
22k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Scaling GitHub
holman
457
140k
Product Roadmaps are Hard
iamctodd
44
9.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
14
1.6k
Building an army of robots
kneath
300
41k
Unsuck your backbone
ammeep
663
57k
Transcript
̍ͰͰ͖Δʂ ARCore͜ͱ͡Ί @zukkey59 potatotips #54 1
2 w FVSFLB*OD w 1BJST"OESPJE&OHJOFFS w 5XJUUFS![VLLFZ ࣗݾհ ٕज़ॻయ̐Ͱɺຊग़͠·ͨ͠ʂ
3 w6OJUZͰͳ͘"OESPJE4UVEJPͰ w"3$PSFʹڵຯ͕͋Δਓ͕खܰʹࢼͤΔΑ͏ʹ̍͋ΕͰ͖Δ͜ͱͷհ ࠓ͢͜ͱ
4 w4DFOFGPSN w"SHVNFOUFE*NBHFT w$MPVE"ODIPST ARCoreͰͰ͖Δ͜ͱ
5 w4DFOFGPSNࠓ͢ͷίίʂ w"SHVNFOUFE*NBHFT w$MPVE"ODIPST ARCoreͰͰ͖Δ͜ͱ
6 w Α͋͘Δ̏%ϞσϧΛදࣔͯ͠ಈ͔ͨ͠ΓͰ͖Δͭ Sceneform
7 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ
8 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene
9 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node ͷNodeੜʂ
10 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node Transform Node ੜʂ
11 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node Transform Node Ճʂ
12 wγʔϯΛߏஙͯ͠ɺੜ͞ΕΔԾΦϒδΣΫτͰ͋Δ/PEFΛՃ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Ճͨ͠ࢠͷNodeɺ Ҡಈͨ͠Γɺઃఆ͢Ε֦ॖͨ͠Γɺճసͨ͠ΓͰ͖Δ
13 wඪ४Ͱ༻ҙ͞Ε͍ͯΔ"OESPJEͷ8JEHFUΛදࣔ͢Δ͜ͱ͕Ͱ͖Δ AndroidͷWidgetͷදࣔ
wද͍ࣔͨ͠8JEHFUͷϨΠΞτΛผʹ༻ҙ͢Δ JUFN@JNBHFYNM <?xml version="1.0" encoding="utf-8"?> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/eure"
xmlns:android="http://schemas.android.com/apk/res/android" /> 14 AndroidͷWidgetͷදࣔ
15 w7JFX3FOEFSBCMFΫϥεΛ༻͍ͯɺϨΠΞτͷYNMΛࢦఆͯ͠ 7JFX"DUJWJUZKBWB ViewRenderable.builder() .setView(this, R.layout.item_image) .build() .thenAccept(renderable ->
viewRenderable = renderable); AndroidͷWidgetͷදࣔ
16 w7JFX3FOEFSBCMFΫϥεΛ༻͍ͯɺϨΠΞτͷYNMΛࢦఆͯ͠ ϦιʔεΛಡΈࠐΈɺϨϯμϦϯά͢Δ 7JFX"DUJWJUZKBWB ViewRenderable.builder() .setView(this, R.layout.item_image) .build() .thenAccept(renderable ->
viewRenderable = renderable); AndroidͷWidgetͷදࣔ
17 wϨϯμϦϯάͨ͠ͷΛԾΦϒδΣΫτͷ/PEFʹͯ͠ 7JFX"DUJWJUZKBWB TransformableNode view = new TransformableNode(arFragment.getTransformationSystem()); view.setParent(anchorNode);
view.setRenderable(viewRenderable); AndroidͷWidgetͷදࣔ
18 wϨϯμϦϯάͨ͠ͷΛԾΦϒδΣΫτͷ/PEFʹͯ͠ ͷ/PEF ΞϯΧʔ ʹՃ͢Δ 7JFX"DUJWJUZKBWB TransformableNode view = new
TransformableNode(arFragment.getTransformationSystem()); view.setParent(anchorNode); view.setRenderable(viewRenderable); AndroidͷWidgetͷදࣔ
19 wؙɺ࢛֯ɺԁபͳͲͷදࣔΛ͢Δ͜ͱ͕Ͱ͖Δ ؙɺ࢛֯ɺԁபͳͲͷදࣔ
20 w࢛֯ΛྫʹͱΔͱɺԼهͷΑ͏ʹ.BUFSJBM'BDUPSZΫϥεΛ༻͍ͯ$PMPSΛࢦఆ͠ 7JFX"DUJWJUZKBWB MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.BLUE)) .thenAccept( material -> {
blueSquareRenderable = ShapeFactory.makeCube(new Vector3(0.2f, 0.15f, 0.2f), new Vector3(0.0f, 0.15f, 0.0f), material); } ); ؙɺ࢛֯ɺԁபͳͲͷදࣔ
21 w࢛֯ΛྫʹͱΔͱɺԼهͷΑ͏ʹ.BUFSJBM'BDUPSZΫϥεΛ༻͍ͯ$PMPSΛࢦఆ͠ ࢛֯ܗΛ࡞ͯ͠ϨϯμϦϯά͢Δ 7JFX"DUJWJUZKBWB MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.BLUE)) .thenAccept( material ->
{ blueSquareRenderable = ShapeFactory.makeCube(new Vector3(0.2f, 0.15f, 0.2f), new Vector3(0.0f, 0.15f, 0.0f), material); } ); ؙɺ࢛֯ɺԁபͳͲͷදࣔ
22 wؙԁபΛද͍ࣔͨ͠߹4IBQF'BDUPSZΫϥεʹ͋ΔNBLF4QIFSFͱ NBLF$ZMJOEFSΛ༻͍Δ͜ͱͰ࣮ݱͰ͖Δ #BMM"DUJWJUZKBWB ShapeFactory.makeSphere(0.1f, new Vector3(0.0f, 0.15f, 0.0f), material);
}); $ZMJOEFS"DUJWJUZKBWB ShapeFactory.makeCylinder(0.1f, 0.3f, new Vector3(0.0f, 0.15f, 0.0f), material); ؙɺ࢛֯ɺԁபͳͲͷදࣔ
23 wϞσϦϯάͨ͠%ϞσϧΛදࣔ͢Δ͜ͱ͕Ͱ͖Δ 3DϞσϧͷදࣔ
24 wҙͷϞσϦϯάϑΝΠϧΛಡΈࠐΉʹɺBQQͷCVJMEHSBEMFʹ ԼهΛهड़͢Δ͜ͱ͕ඞཁ CVJMEHSBEMF BQQ apply plugin: 'com.google.ar.sceneform.plugin' 3DϞσϧͷදࣔ
25 • Project > app ͷԼʹsampledataσΟϨΫτϦΛੜ͠ɺ objϑΝΠϧΛೖΕΔ(objϑΝΠϧҎ֎ʹɺFBXɺgITFͳͲରԠ͍ͯ͠Δ) 3DϞσϧͷදࣔ
26 • sampledataΛӈΫϦοΫͯ͠ɺ ɹNew > Sceneform Asset͔ΒӈͷΑ͏ʹ ɹઌ΄ͲೖΕͨobjϑΝΠϧΛಡΈࠐΉ 3DϞσϧͷදࣔ
27 • Sync͢Δͱɺappͷbuild.gradleͷதʹԼهͷίʔυ͕Ճ͞ΕΔ CVJMEHSBEMF BQQ sceneform.asset('sampledata/andy.obj', 'default', 'sampledata/andy.sfa', 'src/main/res/raw/andy')
3DϞσϧͷදࣔ
3DϞσϧͷಋೖ͕Ͱ͖ͨʂ 28
29 w%σʔλͷϦιʔεΛಡΈࠐΜͰϨϯμϦϯά͢Δ 3DϞσϧͷදࣔ .PEFM"DUJWJUZKBWB ModelRenderable.builder() .setSource(this, R.raw.andy) .build() .thenAccept(renderable ->
andyRenderable = renderable) .exceptionally( throwable -> { Toast toast = Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); return null; });
30 w%σʔλͷϦιʔεΛಡΈࠐΜͰϨϯμϦϯά͢Δ 3DϞσϧͷදࣔ .PEFM"DUJWJUZKBWB ModelRenderable.builder() .setSource(this, R.raw.andy) .build() .thenAccept(renderable ->
andyRenderable = renderable) .exceptionally( throwable -> { Toast toast = Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); return null; });
31 wಋೖ͔Β"3Λදࣔ͢Δ·Ͱɺׂͱ؆୯ʹͰ͖Δ w6OJUZͰΔํ๏͕Α͘հ͞Ε͍ͯΔ͕ɺ طଘͷϓϩδΣΫτʹՃ͍ͨ͠ͱ͔͋Εɺ "OESPJE4UVEJPͰಋೖ؆୯ʹͰ͖ͦ͏ ͓ΘΓʹ
32 wࠓճհͨ͠αϯϓϧHJUIVCʹ͓͍ͯ͋ΔͷͰɺԼهΛ͝ཡ͍ͩ͘͞ IUUQTHJUIVCDPNZVUBSP"3$PSF4BNQMF ͓ΘΓʹ
33 CVJMEHSBEMFʹهड़ͱ֬ೝ "OESPJE.BOJGFTUʹهड़ %Ϟσϧಋೖ࣌ʹඞཁͳϓϥάΠϯΛೖΕΔ ิ - ಋೖํ๏
34 wBQQͷCVJMEHSBEMFʹҎԼΛهड़͢Δ EFQFOEFODJFT\ ʜ JNQMJDBUJPObDPNHPPHMFBSTDFOFGPSNVYTDFOFGPSNVY` JNQMJDBUJPObDPNHPPHMFBSTDFOFGPSNVYDPSF` ʜ ^ build.gradleʹهड़ͱ֬ೝ
35 wϓϩδΣΫτͷCVJMEHSBEMFʹҎԼ͕هड़͞Ε͍ͯΔ͜ͱΛ֬ೝ BMMQSPKFDUT\ SFQPTJUPSJFT\ ʜ HPPHMF ʜ ^ ^
build.gradleʹهड़ͱ֬ೝ
36 wΧϝϥΛ͏ͨΊҎԼΛهड़ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=“zukkey.whiskey.arcoresample"> … // ҎԼΛهड़ <uses-permission android:name="android.permission.CAMERA"
/> … </manifest> Android Manifestʹهड़
37 w"3$PSFΛ༗ޮʹ͢Δ <application … > // ARαϙʔτඞਢͷ߹value=”required”, ඞਢʹ͠ͳ͍߹value=”optional” <meta-data android:name="com.google.ar.core"
android:value="required" /> </application> Android Manifestʹهड़
38 w1SFGFSFODFT1MVHJOT #SPXTF3FQPTJUPSJFTͰ (PPHMF4DFOFGPSN5PPMTΛݕࡧ͠ɺ ϓϥάΠϯΛೖΕΔ 3DϞσϧಋೖ࣌ʹඞཁͳϓϥάΠϯΛೖΕΔ