Slide 1

Slide 1 text

̍೔ͰͰ͖Δʂ ARCore͜ͱ͸͡Ί @zukkey59 potatotips #54 1

Slide 2

Slide 2 text

2 w FVSFLB*OD w 1BJST"OESPJE&OHJOFFS w 5XJUUFS![VLLFZ ࣗݾ঺հ ٕज़ॻయ̐Ͱɺຊग़͠·ͨ͠ʂ

Slide 3

Slide 3 text

3 w6OJUZͰ͸ͳ͘"OESPJE4UVEJPͰ w"3$PSFʹڵຯ͕͋Δਓ͕खܰʹࢼͤΔΑ͏ʹ̍೔͋Ε͹Ͱ͖Δ͜ͱͷ঺հ ࠓ೔࿩͢͜ͱ

Slide 4

Slide 4 text

4 w4DFOFGPSN w"SHVNFOUFE*NBHFT w$MPVE"ODIPST ARCoreͰͰ͖Δ͜ͱ

Slide 5

Slide 5 text

5 w4DFOFGPSNࠓ೔࿩͢ͷ͸ίίʂ w"SHVNFOUFE*NBHFT w$MPVE"ODIPST ARCoreͰͰ͖Δ͜ͱ

Slide 6

Slide 6 text

6 w Α͋͘Δ̏%ϞσϧΛදࣔͯ͠ಈ͔ͨ͠ΓͰ͖Δ΍ͭ Sceneform

Slide 7

Slide 7 text

7 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ

Slide 8

Slide 8 text

8 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene

Slide 9

Slide 9 text

9 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node ਌ͷNodeੜ੒ʂ

Slide 10

Slide 10 text

10 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node Transform Node ੜ੒ʂ

Slide 11

Slide 11 text

11 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene Anchor Node Transform Node ௥Ճʂ

Slide 12

Slide 12 text

12 wγʔϯΛߏஙͯ͠ɺੜ੒͞ΕΔԾ૝ΦϒδΣΫτͰ͋Δ/PEFΛ௥Ճ͢Δ ARΛදࣔ͢ΔྲྀΕ Scene ௥Ճͨ͠ࢠͷNode͸ɺ Ҡಈͨ͠Γɺઃఆ͢Ε͹֦ॖͨ͠Γɺճసͨ͠ΓͰ͖Δ

Slide 13

Slide 13 text

13 wඪ४Ͱ༻ҙ͞Ε͍ͯΔ"OESPJEͷ8JEHFUΛදࣔ͢Δ͜ͱ͕Ͱ͖Δ AndroidͷWidgetͷදࣔ

Slide 14

Slide 14 text

wද͍ࣔͨ͠8JEHFUͷϨΠΞ΢τΛผʹ༻ҙ͢Δ JUFN@JNBHFYNM 14 AndroidͷWidgetͷදࣔ

Slide 15

Slide 15 text

15 w7JFX3FOEFSBCMFΫϥεΛ༻͍ͯɺϨΠΞ΢τͷYNMΛࢦఆͯ͠ 7JFX"DUJWJUZKBWB ViewRenderable.builder() .setView(this, R.layout.item_image) .build() .thenAccept(renderable -> viewRenderable = renderable); AndroidͷWidgetͷදࣔ

Slide 16

Slide 16 text

16 w7JFX3FOEFSBCMFΫϥεΛ༻͍ͯɺϨΠΞ΢τͷYNMΛࢦఆͯ͠ ϦιʔεΛಡΈࠐΈɺϨϯμϦϯά͢Δ 7JFX"DUJWJUZKBWB ViewRenderable.builder() .setView(this, R.layout.item_image) .build() .thenAccept(renderable -> viewRenderable = renderable); AndroidͷWidgetͷදࣔ

Slide 17

Slide 17 text

17 wϨϯμϦϯάͨ͠΋ͷΛԾ૝ΦϒδΣΫτͷ/PEFʹͯ͠ 7JFX"DUJWJUZKBWB TransformableNode view = new TransformableNode(arFragment.getTransformationSystem()); view.setParent(anchorNode); view.setRenderable(viewRenderable); AndroidͷWidgetͷදࣔ

Slide 18

Slide 18 text

18 wϨϯμϦϯάͨ͠΋ͷΛԾ૝ΦϒδΣΫτͷ/PEFʹͯ͠ ਌ͷ/PEF ΞϯΧʔ ʹ௥Ճ͢Δ 7JFX"DUJWJUZKBWB TransformableNode view = new TransformableNode(arFragment.getTransformationSystem()); view.setParent(anchorNode); view.setRenderable(viewRenderable); AndroidͷWidgetͷදࣔ

Slide 19

Slide 19 text

19 wؙɺ࢛֯ɺԁபͳͲͷදࣔΛ͢Δ͜ͱ͕Ͱ͖Δ ؙɺ࢛֯ɺԁபͳͲͷදࣔ

Slide 20

Slide 20 text

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); } ); ؙɺ࢛֯ɺԁபͳͲͷදࣔ

Slide 21

Slide 21 text

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); } ); ؙɺ࢛֯ɺԁபͳͲͷදࣔ

Slide 22

Slide 22 text

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); ؙɺ࢛֯ɺԁபͳͲͷදࣔ

Slide 23

Slide 23 text

23 wϞσϦϯάͨ͠%ϞσϧΛදࣔ͢Δ͜ͱ͕Ͱ͖Δ 3DϞσϧͷදࣔ

Slide 24

Slide 24 text

24 w೚ҙͷϞσϦϯάϑΝΠϧΛಡΈࠐΉʹ͸ɺBQQͷCVJMEHSBEMFʹ ԼهΛهड़͢Δ͜ͱ͕ඞཁ CVJMEHSBEMF BQQ apply plugin: 'com.google.ar.sceneform.plugin' 3DϞσϧͷදࣔ

Slide 25

Slide 25 text

25 • Project > app ͷԼʹsampledataσΟϨΫτϦΛੜ੒͠ɺ objϑΝΠϧΛೖΕΔ(objϑΝΠϧҎ֎ʹ΋ɺFBXɺgITFͳͲରԠ͍ͯ͠Δ) 3DϞσϧͷදࣔ

Slide 26

Slide 26 text

26 • sampledataΛӈΫϦοΫͯ͠ɺ ɹNew > Sceneform Asset͔ΒӈͷΑ͏ʹ ɹઌ΄ͲೖΕͨobjϑΝΠϧΛಡΈࠐΉ 3DϞσϧͷදࣔ

Slide 27

Slide 27 text

27 • Sync͢Δͱɺappͷbuild.gradleͷதʹԼهͷίʔυ͕௥Ճ͞ΕΔ CVJMEHSBEMF BQQ sceneform.asset('sampledata/andy.obj', 'default', 'sampledata/andy.sfa', 'src/main/res/raw/andy') 3DϞσϧͷදࣔ

Slide 28

Slide 28 text

3DϞσϧͷಋೖ͕Ͱ͖ͨʂ 28

Slide 29

Slide 29 text

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; });

Slide 30

Slide 30 text

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; });

Slide 31

Slide 31 text

31 wಋೖ͔Β"3Λදࣔ͢Δ·Ͱɺׂͱ؆୯ʹͰ͖Δ w6OJUZͰ΍Δํ๏͕Α͘঺հ͞Ε͍ͯΔ͕ɺ طଘͷϓϩδΣΫτʹ௥Ճ͍ͨ͠ͱ͔͋Ε͹ɺ "OESPJE4UVEJPͰ΋ಋೖ͸؆୯ʹͰ͖ͦ͏ ͓ΘΓʹ

Slide 32

Slide 32 text

32 wࠓճ঺հͨ͠αϯϓϧ͸HJUIVCʹ͓͍ͯ͋ΔͷͰɺԼهΛ͝ཡ͍ͩ͘͞ IUUQTHJUIVCDPNZVUBSP"3$PSF4BNQMF ͓ΘΓʹ

Slide 33

Slide 33 text

33 CVJMEHSBEMFʹهड़ͱ֬ೝ "OESPJE.BOJGFTUʹهड़ %Ϟσϧಋೖ࣌ʹඞཁͳϓϥάΠϯΛೖΕΔ ิ଍ - ಋೖํ๏

Slide 34

Slide 34 text

34 wBQQͷCVJMEHSBEMFʹҎԼΛهड़͢Δ EFQFOEFODJFT\ ʜ JNQMJDBUJPObDPNHPPHMFBSTDFOFGPSNVYTDFOFGPSNVY` JNQMJDBUJPObDPNHPPHMFBSTDFOFGPSNVYDPSF` ʜ ^ build.gradleʹهड़ͱ֬ೝ

Slide 35

Slide 35 text

35 wϓϩδΣΫτͷCVJMEHSBEMFʹҎԼ͕هड़͞Ε͍ͯΔ͜ͱΛ֬ೝ BMMQSPKFDUT\ SFQPTJUPSJFT\ ʜ HPPHMF ʜ ^ ^ build.gradleʹهड़ͱ֬ೝ

Slide 36

Slide 36 text

36 wΧϝϥΛ࢖͏ͨΊҎԼΛهड़ … // ҎԼΛهड़ … Android Manifestʹهड़

Slide 37

Slide 37 text

37 w"3$PSFΛ༗ޮʹ͢Δ // ARαϙʔτ୺຤ඞਢͷ৔߹͸value=”required”, ඞਢʹ͠ͳ͍৔߹͸value=”optional” Android Manifestʹهड़

Slide 38

Slide 38 text

38 w1SFGFSFODFT1MVHJOT #SPXTF3FQPTJUPSJFTͰ (PPHMF4DFOFGPSN5PPMTΛݕࡧ͠ɺ ϓϥάΠϯΛೖΕΔ 3DϞσϧಋೖ࣌ʹඞཁͳϓϥάΠϯΛೖΕΔ