рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛

рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛


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


рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдФрд░ ARCore рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред


рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ


ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ ARCore рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо Android Studio рдФрд░ Sceneform SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рджреЛ рдореБрдЦреНрдп рдСрдкрд░реЗрд╢рди рд╣реИрдВ рдЬреЛ рд╕реНрд╡рддрдГ рд╕реБрдзрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


  1. ARCore рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВред
  2. рдХреИрдорд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред

Sceneform SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрди рджреЛ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Sceneform SDK рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред


рдЦрд╛рд▓реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдкрд░ build.gradle рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:


 dependencies { classpath 'com.google.ar.sceneform:plugin:1.5.0' } 

рдФрд░ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рдкрд░ build.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:


 implementation "com.google.ar.sceneform.ux:sceneform-ux:1.5.0" 

рдЕрдм рдЧреНрд░реЗрдбрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдмрд┐рд▓реНрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╕реАрдирдлреЙрд░реНрдо рдПрд╕рдбреАрдХреЗ рдФрд░ рд╕реАрдирдлреЙрд░реНрдо рдкреНрд▓рдЧрдЗрди рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ .sfb рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ 3 рдбреА рдореЙрдбрд▓ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдХреИрдорд░реЗ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ 3 рдбреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ, рджреЗрдЦрдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рднреА рдХрд░реЗрдВрдЧреЗред


рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛


рдЕрдм рдЬрдм рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ Sceneform SDK рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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


рдЕрдкрдиреА рдореБрдЦреНрдп рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ activity_main.xml рдлрд╝рд╛рдЗрд▓ рд╣реИред рдФрд░ рджреГрд╢реНрдп рдЦрдВрдб рдЬреЛрдбрд╝реЗрдВ:


 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:name="com.google.ar.sceneform.ux.ArFragment" android:id="@+id/ux_fragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

рдореИрдВрдиреЗ match_parent рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рддрд╛рдХрд┐ рджреГрд╢реНрдп рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рд╣реЛред рдЖрдк рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдХрд╛рд░ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдВрдЧрддрддрд╛ рдЬрд╛рдБрдЪ


рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рд╣рдо рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ MainActivity ред рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:


 public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.e(TAG, "Sceneform requires Android N or later"); Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show(); activity.finish(); return false; } String openGlVersionString = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)) .getDeviceConfigurationInfo() .getGlEsVersion(); if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later"); Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) .show(); activity.finish(); return false; } return true; } ) { public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.e(TAG, "Sceneform requires Android N or later"); Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show(); activity.finish(); return false; } String openGlVersionString = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)) .getDeviceConfigurationInfo() .getGlEsVersion(); if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later"); Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) .show(); activity.finish(); return false; } return true; } 

рдпрд╣ рд╡рд┐рдзрд┐ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдЙрдкрдХрд░рдг рджреГрд╢реНрдп рдПрд╕рдбреАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдПрд╕рдбреАрдХреЗ рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ рд╕реНрддрд░ 27 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг 3.0 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдЗрди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреГрд╢реНрдп рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдХреНрд░реАрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЕрднреА рднреА рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ Sceneform SDK рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рд╕рдВрдЧрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ 3 рдбреА рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛


рдЕрдм рдЖрдкрдХреЛ рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ 3D рдореЙрдбрд▓ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рддреЛ рдЖрдк рдЗрди рдореЙрдбрд▓реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЖрдк рдкреЙрд▓реА рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП 3 рдбреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рднрдВрдбрд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред


рдкрд╛рд▓реА


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


рдкрд╛рд▓реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ 3 рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓реЗрдВрдЧреА:


  1. .mtl рдлрд╝рд╛рдЗрд▓
  2. .obj рдлрд╝рд╛рдЗрд▓
  3. .png рдлрд╝рд╛рдЗрд▓

рдЗрди рддреАрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ .obj рдлрд╛рдЗрд▓ред рдпрд╣ рдЖрдкрдХрд╛ рдореЙрдбрд▓ рд╣реИред рд╕рднреА 3 рдлрд╛рдЗрд▓ рдХреЛ рд╕рдорд▓рдкрдЯреНрдЯ -> "рдЕрдкрдиреЗ рдореЙрдбрд▓ рдлреЛрд▓реНрдбрд░" рдореЗрдВ рд░рдЦреЗрдВ ред


3D рдореЙрдбрд▓ рдХрд╛ рдкрде


рдЕрдм .obj рдлрд╛рдЗрд▓ рдкрд░ рд░рд╛рдЗрдЯ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЖрдпрд╛рдд рджреГрд╢реНрдп рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рди рдмрджрд▓реЗрдВ, рдмрд╕ рдЕрдЧрд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЧреНрд░реЗрдб рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВред


рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ 3D рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЖрдпрд╛рдд рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ 3D рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред


рдореЙрдбрд▓ рдирд┐рд░реНрдорд╛рдг


рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЗрди рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛:


 private static final String TAG = MainActivity.class.getSimpleName(); private static final double MIN_OPENGL_VERSION = 3.0; ArFragment arFragment; ModelRenderable lampPostRenderable; @Override @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkIsSupportedDeviceOrFinish(this)) { return; } setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse("LampPost.sfb")) .build() .thenAccept(renderable -> lampPostRenderable = 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; }); } { private static final String TAG = MainActivity.class.getSimpleName(); private static final double MIN_OPENGL_VERSION = 3.0; ArFragment arFragment; ModelRenderable lampPostRenderable; @Override @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkIsSupportedDeviceOrFinish(this)) { return; } setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse("LampPost.sfb")) .build() .thenAccept(renderable -> lampPostRenderable = 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; }); } 

рдкрд╣рд▓реЗ рд╣рдо arFragment рдкрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рджреГрд╢реНрдп рдХреЗ рднрдВрдбрд╛рд░рдг рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ModelRenderable рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред setSource рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ setSource рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ .sfb рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрдпрд╛рдд рд╣реЛрдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереАред thenAccept рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдЪрд░ lampPostRenderable рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред


рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ exceptionally рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рд╕рдм рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред


рдЕрдм рдЬрдм рдореЙрдбрд▓ lampPostRenderable рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд▓реЛрдб рдФрд░ рд╕реЗрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реАрди рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред


рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдЬреЛрдбрд╝рдирд╛


рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп arFragment рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкрд░реНрд╢ рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА onTap рд▓рд┐рдП onTap рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реНрдкрд░реНрд╢ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб onCreate рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:


 arFragment.setOnTapArPlaneListener( (HitResult hitresult, Plane plane, MotionEvent motionevent) -> { if (lampPostRenderable == null){ return; } Anchor anchor = hitresult.createAnchor(); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setParent(arFragment.getArSceneView().getScene()); TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem()); lamp.setParent(anchorNode); lamp.setRenderable(lampPostRenderable); lamp.select(); } ); 

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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо hitresult.createAnchor() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ hitresult.createAnchor() рд╕реЗ рдПрдХ рдПрдВрдХрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Anchor рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред


рдлрд┐рд░ рд╣рдо рдЗрд╕ рдПрдВрдХрд░ рд╕реЗ рдПрдХ рдиреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ AnchorNode рдХрд╣рд╛ AnchorNode рдФрд░ рдЗрд╕реЗ setParent рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ TransformableNode рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдиреЛрдб рд╕реЗ рдмрд╛рдБрдз рджреЗрдЧрд╛ред TransformableNode рдЕрднреА рднреА рдЙрд╕ рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЙрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ setRenderable рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ ModelRenderable рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓реА рдФрд░ рдЗрд╕реЗ lampPostRenderable рдирд╛рдо рджрд┐рдпрд╛ lampPostRenderable ?)ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо lamp.select() рдХрд╣рддреЗ рд╣реИрдВред lamp.select() рд╡рд┐рдзрд┐;


рдУрд╣! рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдмреНрджрд╛рд╡рд▓реАред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдореИрдВ рдЕрдм рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛ рджреВрдВрдЧрд╛:


  1. рджреГрд╢реНрдп : рдпрд╣ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рд╕рднреА 3D рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗред рдпрд╣ рджреГрд╢реНрдп рдПрдЖрд░ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред


  2. HitResult : рдпрд╣ рдЕрдирдВрдд рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реЗрдЦрд╛ (рдпрд╛ рдХрд┐рд░рдг) рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреА рдмрд╛рдд рдХреЛ рдмрддрд╛рддреА рд╣реИред


  3. рдПрдВрдХрд░ : рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд╛рди рдФрд░ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдЗрд╕реЗ рддреНрд░рд┐-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x, y, z) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреЛрдЬрд╝ рд╕реНрдЯреЗрдЬ рдкрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордиреНрд╡рдп рд╕реНрдерд╛рди рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордиреНрд╡рдп рд╕реНрдерд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


  4. рдПрдВрдХрд░ рдиреЛрдб : рдпрд╣ рдПрдХ рдиреЛрдб рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЦреБрдж рдХреЛ рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓рд╛ рдиреЛрдб рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рдорд╛рди рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


  5. TransformableNode : рдпрд╣ рд╡рд╣ рдиреЛрдб рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдШреБрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдирд╛рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓ред



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


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:


 package com.ayusch.arcorefirst; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.net.Uri; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.widget.Toast; import com.google.ar.core.Anchor; import com.google.ar.core.HitResult; import com.google.ar.core.Plane; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final double MIN_OPENGL_VERSION = 3.0; ArFragment arFragment; ModelRenderable lampPostRenderable; @Override @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkIsSupportedDeviceOrFinish(this)) { return; } setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse("LampPost.sfb")) .build() .thenAccept(renderable -> lampPostRenderable = 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; }); arFragment.setOnTapArPlaneListener( (HitResult hitresult, Plane plane, MotionEvent motionevent) -> { if (lampPostRenderable == null){ return; } Anchor anchor = hitresult.createAnchor(); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setParent(arFragment.getArSceneView().getScene()); TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem()); lamp.setParent(anchorNode); lamp.setRenderable(lampPostRenderable); lamp.select(); } ); } public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.e(TAG, "Sceneform requires Android N or later"); Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show(); activity.finish(); return false; } String openGlVersionString = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)) .getDeviceConfigurationInfo() .getGlEsVersion(); if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later"); Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) .show(); activity.finish(); return false; } return true; } } { package com.ayusch.arcorefirst; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.net.Uri; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.widget.Toast; import com.google.ar.core.Anchor; import com.google.ar.core.HitResult; import com.google.ar.core.Plane; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final double MIN_OPENGL_VERSION = 3.0; ArFragment arFragment; ModelRenderable lampPostRenderable; @Override @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkIsSupportedDeviceOrFinish(this)) { return; } setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse("LampPost.sfb")) .build() .thenAccept(renderable -> lampPostRenderable = 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; }); arFragment.setOnTapArPlaneListener( (HitResult hitresult, Plane plane, MotionEvent motionevent) -> { if (lampPostRenderable == null){ return; } Anchor anchor = hitresult.createAnchor(); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setParent(arFragment.getArSceneView().getScene()); TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem()); lamp.setParent(anchorNode); lamp.setRenderable(lampPostRenderable); lamp.select(); } ); } public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.e(TAG, "Sceneform requires Android N or later"); Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show(); activity.finish(); return false; } String openGlVersionString = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)) .getDeviceConfigurationInfo() .getGlEsVersion(); if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later"); Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) .show(); activity.finish(); return false; } return true; } } ) { package com.ayusch.arcorefirst; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.net.Uri; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.widget.Toast; import com.google.ar.core.Anchor; import com.google.ar.core.HitResult; import com.google.ar.core.Plane; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final double MIN_OPENGL_VERSION = 3.0; ArFragment arFragment; ModelRenderable lampPostRenderable; @Override @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkIsSupportedDeviceOrFinish(this)) { return; } setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse("LampPost.sfb")) .build() .thenAccept(renderable -> lampPostRenderable = 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; }); arFragment.setOnTapArPlaneListener( (HitResult hitresult, Plane plane, MotionEvent motionevent) -> { if (lampPostRenderable == null){ return; } Anchor anchor = hitresult.createAnchor(); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setParent(arFragment.getArSceneView().getScene()); TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem()); lamp.setParent(anchorNode); lamp.setRenderable(lampPostRenderable); lamp.select(); } ); } public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.e(TAG, "Sceneform requires Android N or later"); Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show(); activity.finish(); return false; } String openGlVersionString = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)) .getDeviceConfigurationInfo() .getGlEsVersion(); if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later"); Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) .show(); activity.finish(); return false; } return true; } } 

рдмрдзрд╛рдИ! рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ ARCore рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЖрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рд╕рд░рд▓ рдПрдЖрд░рдХреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдЖрдкрдХреА рдкрд╣рд▓реА рдирдЬрд╝рд░ рдереАред рдЕрдЧрд▓реЗ рдкрд╛рда рдореЗрдВ, рдореИрдВ ARCore рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рддрд▓реНрд▓реАрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

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


All Articles