การเริ่มต้นใช้งาน Sceneform

หน้านี้อธิบายแนวคิดหลักโดยการสํารวจโค้ดในตัวอย่างแอป Hello Sceneform หมายเหตุ:

  • ตัวอย่างนี้ใช้ Sceneform และ ARCore

    หากต้องการใช้ Sceneform โดยไม่ใช้ ARCore ให้ทําตามขั้นตอนด้านล่างโดยละเว้นข้อกําหนดด้านสิทธิ์การใช้ ARCore และ CAMERA ใช้ SceneView ใน เลย์เอาต์ของแอปตามที่อธิบายไว้ใน สร้างฉาก

  • แอปตัวอย่างนี้เขียนเป็นแอป AR จําเป็น

    ดูข้อมูลเพิ่มเติมเกี่ยวกับแอปAR ไม่บังคับเทียบกับ AR ที่ต้องมีได้ที่การเปิดใช้ ARCore

ในการเริ่มต้นใช้ Sceneform ในโปรเจ็กต์ คุณจะต้อง

  1. นําเข้าปลั๊กอิน Sceneform
  2. กําหนดค่าไฟล์ build.gradle ของโปรเจ็กต์
  3. อัปเดต AndroidManifest.xml
  4. ดําเนินการตรวจสอบรันไทม์และสร้างมุมมองฉาก
  5. สร้างการแสดงผลได้
  6. สร้างฉาก

นําเข้าปลั๊กอิน Sceneform ในโปรเจ็กต์

เมื่อติดตั้งแล้ว ปลั๊กอิน Sceneform จะช่วยให้คุณนําเข้า ดู และสร้างเนื้อหา 3 มิติได้ใน SDK ของ Sceneform สําหรับแอป AR ใน Android Studio ต้องใช้ Android Studio เวอร์ชัน 3.1 ขึ้นไป

วิธีติดตั้งปลั๊กอิน

  1. ใน Android Studio ให้เปิดการตั้งค่าปลั๊กอิน ดังนี้

    • Windows: ไฟล์ > การตั้งค่า > ปลั๊กอิน > เรียกดูที่เก็บข้อมูล

    • สําหรับ macOS: Android Studio > Preferences > ปลั๊กอิน

  2. คลิกเรียกดูที่เก็บ แล้วติดตั้งเครื่องมือ Google Sceneform (เบต้า)

กําหนดค่าไฟล์ build.gradle ของโปรเจ็กต์

  1. ตรวจสอบว่าโปรเจ็กต์ build.gradle มีที่เก็บ Maven ของ Google' ดังนี้

    allprojects {
        repositories {
            google()
            …
    
  2. อัปเดต app's build.gradle เพื่อเพิ่มทรัพยากร Dependency ของ ARCore และ UX ล่าสุด และตรวจสอบว่าการตั้งค่าโปรเจ็กต์ใช้ได้กับทั้ง 2 ไลบรารี

    android {
        …
        defaultConfig {
            // Sceneform requires minSdkVersion >= 24.
            minSdkVersion 24
            …
        }
        // Sceneform libraries use language constructs from Java 8.
        // Add these compile options if targeting minSdkVersion < 26.
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    dependencies {
        …
        // Provides ARCore Session and related resources.
        implementation 'com.google.ar:core:1.15.0'
    
        // Provides ArFragment, and other UX resources.
        implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'
    
        // Alternatively, use ArSceneView without the UX dependency.
        implementation 'com.google.ar.sceneform:core:1.15.0'
    }
    

อัปเดต AndroidManifest.xml

แก้ไข AndroidManifest.xml เพื่อระบุว่าแอปของคุณใช้ (AR OPTIONAL) หรือต้อง (AR ต้องระบุ) ARCore และ CAMERA:

<!-- Both "AR Optional" and "AR Required" apps require CAMERA permission. -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- Sceneform requires OpenGL ES 3.0 or later. -->
<uses-feature android:glEsVersion="0x00030000" android:required="true" />

<!-- Indicates that app requires ARCore ("AR Required"). Ensures the app is
     visible only in the Google Play Store on devices that support ARCore.
     For "AR Optional" apps remove this line. -->
<uses-feature android:name="android.hardware.camera.ar" />

<application>
    …
    <!-- Indicates that app requires ARCore ("AR Required"). Causes the Google
         Play Store to download and install Google Play Services for AR along
         with the app. For an "AR Optional" app, specify "optional" instead of
         "required".
    -->
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

ดําเนินการตรวจสอบรันไทม์และสร้างมุมมองฉาก

วิธีที่ง่ายที่สุดในการเริ่มต้นใช้งาน Sceneform และสร้างมุมมองฉากคือการใช้ ArFragment ซึ่งจะจัดการการจัดการเซสชัน ARCore โดยอัตโนมัติหลังจากดําเนินการตรวจสอบรันไทม์ของ ARCore ที่จําเป็น

  1. ตรวจสอบว่าติดตั้งบริการ Google Play สําหรับ AR เวอร์ชันที่ใช้งานร่วมกันได้หรือไม่ เพื่อแจ้งให้ผู้ใช้ติดตั้งหรืออัปเดตตามความจําเป็น

  2. ตรวจสอบว่าแอปมีสิทธิ์เข้าถึงกล้องหรือไม่ แล้วขอสิทธิ์จากผู้ใช้หากยังไม่ได้ให้สิทธิ์

หากแอปของคุณต้องขอสิทธิ์เพิ่มเติม หรือต้องการปรับแต่งวิธีและเวลาที่สร้างเซสชัน AR ให้ทําสิ่งต่อไปนี้แทน

  • สร้างคลาสย่อยของ ArFragment เพื่อขอสิทธิ์เพิ่มเติม

  • ใช้หรือขยาย ArSceneView โดยตรง แอปของคุณต้องตรวจสอบเวอร์ชัน ARCore แล้วเรียกใช้ setupSession() เพื่อสร้างเซสชัน ARCore ด้วยตนเองดังที่แสดงในตัวอย่างระบบสุริยะ

เมื่อผ่านการตรวจสอบแล้ว ArFragment จะสร้างสิ่งต่อไปนี้

  1. ArSceneView ที่เข้าถึงผ่าน getArSceneView() ได้มีลักษณะดังนี้

    • แสดงภาพจากเซสชันไปยังรูปภาพของกล้อง

    • แสดงภาพเคลื่อนไหว UX ในตัวของ Sceneform ซึ่งจะแสดงวิธีที่ผู้ใช้ควรจะย้ายโทรศัพท์เพื่อเปิดใช้งานประสบการณ์ AR

    • ตรวจพบไฮไลต์ Planes ที่ใช้ค่าเริ่มต้น PlaneRenderer

  2. ARCore Session เข้าถึงได้ผ่าน getSession()

หากต้องการใช้ ArFragment ในแอป ให้เพิ่มแอปไปยังเลย์เอาต์ของกิจกรรมดังที่แสดงใน activity_ux.xml ในตัวอย่าง Hello Sceneform

<fragment android:name="com.google.ar.sceneform.ux.ArFragment"
    android:id="@+id/ux_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

สร้างการแสดงผลได้

Renderable คือโมเดล 3 มิติที่สามารถวางไว้ที่ใดก็ได้ในฉากและมี Mesh วัสดุ และพื้นผิว

การแสดงภาพจะแสดงผลได้จากสิ่งต่อไปนี้

แอปตัวอย่างสร้างการแสดงภาพได้จากไฟล์เนื้อหา andy.obj แบบ 3 มิติ เมื่อนําเข้าเนื้อหานี้แล้ว ปลั๊กอิน Scenform จะอัปเดต app' build.gradle เพื่อใช้ปลั๊กอินและเพิ่ม sceneform.asset() สําหรับโมเดลที่นําเข้า ดังนี้

apply plugin: 'com.google.ar.sceneform.plugin'

sceneform.asset('sampledata/models/andy.obj', // 'Source Asset Path' specified during import.
                'default',                    // 'Material Path' specified during import.
                'sampledata/models/andy.sfa', // '.sfa Output Path' specified during import.
                'src/main/res/raw/andy')      // '.sfb Output Path' specified during import.

ทรัพยากร res/raw/andy ใช้ในการสร้าง ModelRenderable:

private ModelRenderable andyRenderable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    …

    ModelRenderable.builder()
        .setSource(this, R.raw.andy)
        .build()
        .thenAccept(renderable -> andyRenderable = renderable)
        .exceptionally(
            throwable -> {
            Log.e(TAG, "Unable to load Renderable.", throwable);
            return null;
        });
}

สร้างฉาก

ARSceneView มี Scene เชื่อมโยงอยู่ โหมดภาพเป็นโครงสร้างข้อมูลที่เหมือนต้นไม้ซึ่งเก็บ Node ที่เป็นออบเจ็กต์เสมือนจริงเพื่อแสดงผล

ในที่นี้ไฟล์แสดงผล Andy จะแนบอยู่กับโหนดรูทโดยตรง

Node node = new Node();
node.setParent(arFragment.getArSceneView().getScene());
node.setRenderable(andyRenderable);

แต่ละโหนดประกอบด้วยข้อมูลทั้งหมดที่ Sceneform จําเป็นต้องใช้ในการแสดงผล (รวมถึงตําแหน่ง การวางแนว และออบเจ็กต์ที่แสดงผลได้) รวมถึงการโต้ตอบกับโหนดดังกล่าว (รวมถึงรูปร่างการชนและ Listener เหตุการณ์)

โหนดจะเพิ่มลงในโหนดอื่นๆ ได้ ซึ่งจะสร้างความสัมพันธ์ระดับบนสุดและย่อย เมื่อโหนดเป็นโหนดย่อยของโหนดอื่น โหนดจะหมุน หมุน และปรับขนาดด้วยระดับบนสุด เช่น การเคลื่อนไหวแขนเมื่อเคลื่อนไหวร่างกาย โหนดหนึ่งมีโหนดย่อยๆ ได้หลายรายการ แต่มีโหนดหลักเพียงรายการเดียว จึงเป็นโครงสร้างคล้ายต้นไม้ โครงสร้างนี้เรียกว่ากราฟฉาก

Sceneform ในแต่ละเฟรมจะแสดงผลกราฟของฉากจากมุมมองกล้อง (โดยใช้การติดตามการเคลื่อนไหว ARCore) แอปจะโต้ตอบกับฉากได้ด้วยการฟังเหตุการณ์การแตะและท่าทางสัมผัส ทําการทดสอบ Hit โดยใช้โหนด และวาง Anchor ดูข้อมูลเพิ่มเติมได้ที่สร้างและโต้ตอบกับฉาก