ARCore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

ARCore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдПрдВ


рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрд╕рд▓реА рджреБрдирд┐рдпрд╛ рдореЗрдВ 3D рдореЙрдбрд▓ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред Google рдХреА ARCore рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ 2 рдбреА рдЫрд╡рд┐ (рдЪрд┐рддреНрд░ рдпрд╛ рд╡реАрдбрд┐рдпреЛ) рдореЗрдВ рдкреВрд░реНрдг 3 рдбреА рдореЙрдбрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред


рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ ARCore рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╡рд┐ рдореЗрдВ рдПрдХ 3 рдбреА рдореЙрдбрд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХреЛрдВ, рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░реЛрдВ, рдкрддреНрд░рд┐рдХрд╛рдУрдВ рдЖрджрд┐ рдореЗрдВред


рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдбрд╛рдЗрд╡рд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд┐рдЫрд▓реЗ рджреЛ рд▓реЗрдЦреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓ AR рд╢рдмреНрджреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдБрдЧреЗ:



рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЪрд┐рддреНрд░ рдХреНрдпрд╛ рд╣реИрдВ?


рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдПрдЖрд░рдХреЛрд░ рдореЗрдВ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЪрд┐рддреНрд░ рдЖрдкрдХреЛ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдкреЛрд╕реНрдЯрд░ рдпрд╛ рдЙрддреНрдкрд╛рдж рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЬреИрд╕реЗ "2 рдбреА" рдЫрд╡рд┐рдпреЛрдВ рдХреЛ "рдЪреЗрддрди" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдк ARCore рдореЗрдВ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдпрд╣ рдЖрдкрдХреЛ AR рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рдЙрдирдХреЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдбрд┐рдпреЛ рд╢реВрдЯ рдХрд░рддреЗ рд╕рдордпред рдФрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ 3D рдореЙрдбрд▓ рдХреЛ 2D рдЫрд╡рд┐ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛рдПрдВ


рдпрд╣рд╛рдВ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ:


  • ARCore рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ 20 рд╕рдВрджрд░реНрдн рдЫрд╡рд┐рдпреЛрдВ рддрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рднреМрддрд┐рдХ рд╡рд┐рдорд╛рди рд╕рдорддрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХрд╛ рдХреНрд╖реЗрддреНрд░рдлрд▓ 15 рд╕реЗрдореА x 15 рд╕реЗрдореА рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • ARCore рдЪрд▓рддреА рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рд╕рд╣реА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди


рдпрд╣рд╛рдБ ARCore рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВ:


  • рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЪрд┐рддреНрд░ PNG, JPEG рдФрд░ JPG рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
  • рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рд░рдВрдЧ рдпрд╛ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рд╣реИред
  • рдЫрд╡рд┐ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрдо рд╕реЗ рдХрдо 300 x 300 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИред
  • рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди (рдЬреИрд╕реЗ рдкреИрдЯрд░реНрди рдпрд╛ рдкреЛрд▓реНрдХрд╛ рдбреЙрдЯреНрд╕) рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЖрдкрдХреА рдЫрд╡рд┐ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП arcoreimg рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрдо рд╕реЗ рдХрдо 75 рдЕрдВрдХ рдХреА рд░реЗрдЯрд┐рдВрдЧ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред

рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ arcoreimg рдЙрдкрдХрд░рдг:


  • рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ Android рдХреЗ рд▓рд┐рдП ARCore SDK рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред
  • рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред
  • рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдЯреВрд▓реНрд╕> arcoreimg> рд╡рд┐рдВрдбреЛрдЬрд╝ (рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдпрд╛ macOS рд╣реЛ) рдкрд░ рдЬрд╛рдПрдВред
  • рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рдкреНрд░реЙрдореНрдкреНрдЯ рдЦреЛрд▓реЗрдВред
  • рдФрд░ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рджрд░реНрдЬ рдХрд░реЗрдВ:

arcoreimg.exe eval-img --input_image_path=dog.png 

рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдХреЗ рд╕рд╛рде dog.png рдмрджрд▓реЗрдВред


рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдРрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛


рдЕрдм рдЬрдм рдЖрдкрдиреЗ ARCore рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ 75+ рдХреА рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫреА рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред


рдЦреБрд╢рдмреВ рдирд┐рд░реНрдорд╛рдг


рд╣рдо рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗред CustomArFragment рдирд╛рдордХ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ ArFragment рд╕реЗ ArFragment ред рдпрд╣рд╛рдБ CustomArFragment рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:


 package com.ayusch.augmentedimages; import android.util.Log; import com.google.ar.core.Config; import com.google.ar.core.Session; import com.google.ar.sceneform.ux.ArFragment; public class CustomArFragment extends ArFragment { @Override protected Config getSessionConfiguration(Session session) { getPlaneDiscoveryController().setInstructionView(null); Config config = new Config(session); config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE); session.configure(config); getArSceneView().setupSession(session); return config; } } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡рд┐рдорд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рд╣рдо рдЙрд╕ рд╕реНрдХреНрд░реАрди рд╕реЗ рд╣рд╛рде рдХреЗ рдЖрдЗрдХрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЦрдВрдбрд┐рдд рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рдорд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд┐рдорд╛рди рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдареЛрд╕ рдЫрд╡рд┐ рдорд┐рд▓рддреА рд╣реИред


рдлрд┐рд░ рд╣рдордиреЗ LATEST_CAMERA_IMAGE рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдореЛрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреИрдорд░рд╛ рдлреНрд░реЗрдо рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдЫрд╡рд┐ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЫрд╡рд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯрдЕрдк


рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЪрдпрдирд┐рдд рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ (рдЬрд┐рд╕реЗ рдЖрдк рднреМрддрд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдЬреЛрдбрд╝реЗрдВ (рдЗрд╕реЗ рдмрдирд╛рдПрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИ)ред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЪрд┐рддреНрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЬреИрд╕реЗ рд╣реА рдЯреБрдХрдбрд╝рд╛ рдкреИрджрд╛ рд╣реЛрдЧрд╛ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдирд╛ рд▓реЗрдВрдЧреЗред рд▓реЙрдЧ рдореЗрдВ рд╣рдо рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


 if ((((MainActivity) getActivity()).setupAugmentedImagesDb(config, session))) { Log.d("SetupAugImgDb", "Success"); } else { Log.e("SetupAugImgDb","Faliure setting up db"); } 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ CustomArFragment рдХреА CustomArFragment рджрд┐рдЦреЗрдЧрд╛:


 package com.ayusch.augmentedimages; import android.util.Log; import com.google.ar.core.Config; import com.google.ar.core.Session; import com.google.ar.sceneform.ux.ArFragment; public class CustomArFragment extends ArFragment { @Override protected Config getSessionConfiguration(Session session) { getPlaneDiscoveryController().setInstructionView(null); Config config = new Config(session); config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE); session.configure(config); getArSceneView().setupSession(session); if ((((MainActivity) getActivity()).setupAugmentedImagesDb(config, session))) { Log.d("SetupAugImgDb", "Success"); } else { Log.e("SetupAugImgDb","Faliure setting up db"); } return config; } } 

рдЬрд▓реНрдж рд╣реА рд╣рдо setupAugmentedImagesDb рдореЗрдВ setupAugmentedImagesDb рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ MainActivity ред рдЕрдм рд╣рдорд╛рд░реА CustomArFragment рдЬреЛрдбрд╝реЗрдВ:


 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:id="@+id/sceneform_fragment" android:name="com.ayusch.augmentedimages.CustomArFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.constraint.ConstraintLayout> 

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рдЬреЛрдбрд╝рдирд╛


рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЫрд╡рд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдЦреЛрдЬреЗрдВ рдФрд░ рдЫрд╡рд┐ рдореЗрдВ рдПрдХ 3 рдбреА рдореЙрдбрд▓ рдЬреЛрдбрд╝реЗрдВред


рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ setupAugmentedImagesDb MainActivity рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ:


 public boolean setupAugmentedImagesDb(Config config, Session session) { AugmentedImageDatabase augmentedImageDatabase; Bitmap bitmap = loadAugmentedImage(); if (bitmap == null) { return false; } augmentedImageDatabase = new AugmentedImageDatabase(session); augmentedImageDatabase.addImage("tiger", bitmap); config.setAugmentedImageDatabase(augmentedImageDatabase); return true; } private Bitmap loadAugmentedImage() { try (InputStream is = getAssets().open("blanket.jpeg")) { return BitmapFactory.decodeStream(is); } catch (IOException e) { Log.e("ImageLoad", "IO Exception", e); } return null; } 

рд╣рдордиреЗ рдПрдХ loadAugmentedImage рд╡рд┐рдзрд┐ рднреА рдмрдирд╛рдИ рд╣реИ рдЬреЛ рдПрдХ рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрди рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд┐рдЯрдореИрдк рджреЗрддрд╛ рд╣реИред


setupAugmentedImagesDb рд╣рдо рдкрд╣рд▓реЗ рдореМрдЬреВрджрд╛ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрдореЗрдЬ рдХреЛ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЛ рдмрд╛рдШ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ true рд╣реИ рдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред


рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ


рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐рдпрд╛рдВ рдЦреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╢реНрд░реЛрддрд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдлреНрд░реЗрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


MainActivity рдореЗрдВ MainActivity onCreate() рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝реЗрдВ:


 arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame); 

рдЕрдм onUpdateFrame рдкрд░ onUpdateFrame рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:


 @RequiresApi(api = Build.VERSION_CODES.N) private void onUpdateFrame(FrameTime frameTime) { Frame frame = arFragment.getArSceneView().getArFrame(); Collection<AugmentedImage> augmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage augmentedImage : augmentedImages) { if (augmentedImage.getTrackingState() == TrackingState.TRACKING) { if (augmentedImage.getName().equals("tiger") && shouldAddModel) { placeObject(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("Mesh_BengalTiger.sfb")); shouldAddModel = false; } } } } 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдлреНрд░реЗрдо рд╣реА рдорд┐рд▓рддрд╛ рд╣реИред рдПрдХ рдлреНрд░реЗрдо рдХреЛ рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рдЖрднрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗрддреЗ рд╣реИрдВред


рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдкрд░ рдЕрдкрдиреА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдо ARCore рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХреА рдЧрдИ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА frame.getUpdatedTrackables ред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ frame.getUpdatedTrackables ред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реА рдмрд╛рдШ рдХреА рдЫрд╡рд┐ рдлреНрд░реЗрдо рдореЗрдВ рдореМрдЬреВрдж рд╣реИред


рдпрджрд┐ рдХреЛрдИ рдорд┐рд▓рд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ 3D рдореЙрдбрд▓ рдХреЛ рдкрддрд╛ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред


рдиреЛрдЯред shouldAddModel рдзреНрд╡рдЬ shouldAddModel рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ 3D рдореЙрдбрд▓ рдЬреЛрдбрд╝ рд╕рдХреЗрдВред

рдПрдХ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдкрд░ рдПрдХ 3 рдбреА рдореЙрдбрд▓ рд░рдЦрдХрд░


рдЕрдм рдЬрдм рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреА рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдвреВрдВрдв рд▓реА рд╣реИ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ рдКрдкрд░ рдПрдХ 3D рдореЙрдбрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред placeObject рдФрд░ addNodeToScene рдЬреЛрдбрд╝реЗрдВ:


  • placeObject : рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП Uri рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ addNodeToScene рдкрджреНрдзрддрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдСрдмреНрдЬреЗрдХреНрдЯ рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдиреЛрдб рдХреЛ рджреГрд╢реНрдп рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • addNodeToScene : рдпрд╣ рд╡рд┐рдзрд┐ рдкрд░рд┐рдгрд╛рдореА рдПрдВрдХрд░ рд╕реЗ рдПрдХ рдиреЛрдб рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдФрд░ рдиреЛрдб рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬреНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреБрдбрд╝рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕ рдиреЛрдб рдХреЛ рдПрдВрдХрд░ рдиреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдордВрдЪ рдкрд░ рд░рдЦрддрд╛ рд╣реИред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ MainActivity рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 package com.ayusch.augmentedimages; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import com.google.ar.core.Anchor; import com.google.ar.core.AugmentedImage; import com.google.ar.core.AugmentedImageDatabase; import com.google.ar.core.Config; import com.google.ar.core.Frame; import com.google.ar.core.Session; import com.google.ar.core.TrackingState; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.FrameTime; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.rendering.Renderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode; import java.io.IOException; import java.io.InputStream; import java.util.Collection; public class MainActivity extends AppCompatActivity { ArFragment arFragment; boolean shouldAddModel = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); arFragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment); arFragment.getPlaneDiscoveryController().hide(); arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame); } @RequiresApi(api = Build.VERSION_CODES.N) private void placeObject(ArFragment arFragment, Anchor anchor, Uri uri) { ModelRenderable.builder() .setSource(arFragment.getContext(), uri) .build() .thenAccept(modelRenderable -> addNodeToScene(arFragment, anchor, modelRenderable)) .exceptionally(throwable -> { Toast.makeText(arFragment.getContext(), "Error:" + throwable.getMessage(), Toast.LENGTH_LONG).show(); return null; } ); } @RequiresApi(api = Build.VERSION_CODES.N) private void onUpdateFrame(FrameTime frameTime) { Frame frame = arFragment.getArSceneView().getArFrame(); Collection<AugmentedImage> augmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage augmentedImage : augmentedImages) { if (augmentedImage.getTrackingState() == TrackingState.TRACKING) { if (augmentedImage.getName().equals("tiger") && shouldAddModel) { placeObject(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("Mesh_BengalTiger.sfb")); shouldAddModel = false; } } } } public boolean setupAugmentedImagesDb(Config config, Session session) { AugmentedImageDatabase augmentedImageDatabase; Bitmap bitmap = loadAugmentedImage(); if (bitmap == null) { return false; } augmentedImageDatabase = new AugmentedImageDatabase(session); augmentedImageDatabase.addImage("tiger", bitmap); config.setAugmentedImageDatabase(augmentedImageDatabase); return true; } private Bitmap loadAugmentedImage() { try (InputStream is = getAssets().open("blanket.jpeg")) { return BitmapFactory.decodeStream(is); } catch (IOException e) { Log.e("ImageLoad", "IO Exception", e); } return null; } private void addNodeToScene(ArFragment arFragment, Anchor anchor, Renderable renderable) { AnchorNode anchorNode = new AnchorNode(anchor); TransformableNode node = new TransformableNode(arFragment.getTransformationSystem()); node.setRenderable(renderable); node.setParent(anchorNode); arFragment.getArSceneView().getScene().addChild(anchorNode); node.select(); } } 

рдЕрдм рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рди рдХрд░реЗрдВред рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрди рдХреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЕрдиреБрд╕рд╛рд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлреЛрди рдХреЛ рд░реЗрдлрд░реЗрдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдереЛрдбрд╝рд╛ рдКрдкрд░ рд▓реЗ рдЬрд╛рдПрдВред рдФрд░ рдЬреИрд╕реЗ рд╣реА ARCore рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ 3D рдореЙрдбрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


рдкрд░рд┐рдгрд╛рдо


рдпрд╣ рднреА рдкрдврд╝реЗрдВ: рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛

Source: https://habr.com/ru/post/hi439190/


All Articles