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.4k
1日でできる!ARCoreことはじめ
初心者でARCoreに興味がある人のために
AR初心者の私が、1日あれば大体できることをまとめてみました
zukkey
August 23, 2018
Tweet
Share
More Decks by zukkey
See All by zukkey
Android Studioではじめる実践ARCore入門
zukkey
1
2.1k
Pairs JapanにおけるActionLogの目的と実装について
zukkey
0
960
Other Decks in Programming
See All in Programming
HMSコンペ 11th Solution (team : kansai-kaggler)
t88
1
680
Activities at Cairo Library
cairolibrary720
0
1.2k
Play Billing Library 7.0.0 変更点まとめ@potatotips#88
kako351
0
160
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
15
8.5k
TiDB Serverless ~理想のServerless DBを考える~
soso_15315
1
160
CSC307 Lecture 06
javiergs
PRO
0
360
継続的な活動で築く地方エンジニアの道
myamashii
2
350
SRE チーム立ち上げ前に考えたこと・取り組んだこと / Considerations and Preparations Before Establishing an SRE Team
mackey0225
3
320
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
Terraformテスト入門
msato
0
530
生成AIをkintoneに連携してみた
hideg
0
230
Folding Cheat Sheet #7
philipschwarz
PRO
0
150
Featured
See All Featured
Speed Design
sergeychernyshev
9
270
Producing Creativity
orderedlist
PRO
340
39k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
12
3.8k
Stop Working from a Prison Cell
hatefulcrawdad
266
20k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
224
21k
Making Projects Easy
brettharned
111
5.7k
A Philosophy of Restraint
colly
200
16k
Designing on Purpose - Digital PM Summit 2013
jponch
113
6.6k
Designing with Data
zakiwarfel
96
5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.8k
The Art of Programming - Codeland 2020
erikaheidi
48
13k
The MySQL Ecosystem @ GitHub 2015
samlambert
248
12k
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Ϟσϧಋೖ࣌ʹඞཁͳϓϥάΠϯΛೖΕΔ