หน้านี้อธิบายแนวคิดหลักโดยการสํารวจโค้ดในตัวอย่างแอป Hello Sceneform หมายเหตุ:
ตัวอย่างนี้ใช้ Sceneform และ ARCore
หากต้องการใช้ Sceneform โดยไม่ใช้ ARCore ให้ทําตามขั้นตอนด้านล่างโดยละเว้นข้อกําหนดด้านสิทธิ์การใช้ ARCore และ CAMERA ใช้
SceneView
ใน เลย์เอาต์ของแอปตามที่อธิบายไว้ใน สร้างฉากแอปตัวอย่างนี้เขียนเป็นแอป AR จําเป็น
ดูข้อมูลเพิ่มเติมเกี่ยวกับแอปAR ไม่บังคับเทียบกับ AR ที่ต้องมีได้ที่การเปิดใช้ ARCore
ในการเริ่มต้นใช้ Sceneform ในโปรเจ็กต์ คุณจะต้อง
- นําเข้าปลั๊กอิน Sceneform
- กําหนดค่าไฟล์
build.gradle
ของโปรเจ็กต์ - อัปเดต
AndroidManifest.xml
- ดําเนินการตรวจสอบรันไทม์และสร้างมุมมองฉาก
- สร้างการแสดงผลได้
- สร้างฉาก
นําเข้าปลั๊กอิน Sceneform ในโปรเจ็กต์
เมื่อติดตั้งแล้ว ปลั๊กอิน Sceneform จะช่วยให้คุณนําเข้า ดู และสร้างเนื้อหา 3 มิติได้ใน SDK ของ Sceneform สําหรับแอป AR ใน Android Studio ต้องใช้ Android Studio เวอร์ชัน 3.1 ขึ้นไป
วิธีติดตั้งปลั๊กอิน
ใน Android Studio ให้เปิดการตั้งค่าปลั๊กอิน ดังนี้
Windows: ไฟล์ > การตั้งค่า > ปลั๊กอิน > เรียกดูที่เก็บข้อมูล
สําหรับ macOS: Android Studio > Preferences > ปลั๊กอิน
คลิกเรียกดูที่เก็บ แล้วติดตั้งเครื่องมือ Google Sceneform (เบต้า)
กําหนดค่าไฟล์ build.gradle
ของโปรเจ็กต์
ตรวจสอบว่าโปรเจ็กต์
build.gradle
มีที่เก็บ Maven ของ Google' ดังนี้allprojects { repositories { google() …
อัปเดต 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 ที่จําเป็น
ตรวจสอบว่าติดตั้งบริการ Google Play สําหรับ AR เวอร์ชันที่ใช้งานร่วมกันได้หรือไม่ เพื่อแจ้งให้ผู้ใช้ติดตั้งหรืออัปเดตตามความจําเป็น
ตรวจสอบว่าแอปมีสิทธิ์เข้าถึงกล้องหรือไม่ แล้วขอสิทธิ์จากผู้ใช้หากยังไม่ได้ให้สิทธิ์
หากแอปของคุณต้องขอสิทธิ์เพิ่มเติม หรือต้องการปรับแต่งวิธีและเวลาที่สร้างเซสชัน AR ให้ทําสิ่งต่อไปนี้แทน
สร้างคลาสย่อยของ
ArFragment
เพื่อขอสิทธิ์เพิ่มเติมใช้หรือขยาย
ArSceneView
โดยตรง แอปของคุณต้องตรวจสอบเวอร์ชัน ARCore แล้วเรียกใช้setupSession()
เพื่อสร้างเซสชัน ARCore ด้วยตนเองดังที่แสดงในตัวอย่างระบบสุริยะ
เมื่อผ่านการตรวจสอบแล้ว ArFragment
จะสร้างสิ่งต่อไปนี้
ArSceneView
ที่เข้าถึงผ่านgetArSceneView()
ได้มีลักษณะดังนี้แสดงภาพจากเซสชันไปยังรูปภาพของกล้อง
แสดงภาพเคลื่อนไหว UX ในตัวของ Sceneform ซึ่งจะแสดงวิธีที่ผู้ใช้ควรจะย้ายโทรศัพท์เพื่อเปิดใช้งานประสบการณ์ AR
ตรวจพบไฮไลต์
Planes
ที่ใช้ค่าเริ่มต้นPlaneRenderer
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 วัสดุ และพื้นผิว
การแสดงภาพจะแสดงผลได้จากสิ่งต่อไปนี้
ViewRenderable
มาตรฐานของ Android แสดงผลเป็นการ์ด 2 มิติแบบธรรมดาในฉาก 3 มิติ ในขณะเดียวกันก็รักษาความสามารถในการโต้ตอบด้วยการสัมผัสได้ไฟล์เนื้อหา 3D (OBJ, FBX, glTF) นําเข้า แปลง และดูตัวอย่างได้โดยใช้ปลั๊กอิน Android Studio ดูข้อมูลเพิ่มเติมได้ที่นําเข้าและแสดงตัวอย่างเนื้อหา 3 มิติ
สามารถรวมรูปร่างและวัสดุพื้นฐาน เข้าด้วยกันแบบเป็นโปรแกรมได้ เพื่อสร้างวัตถุที่ซับซ้อนขึ้นขณะรันไทม์
แอปตัวอย่างสร้างการแสดงภาพได้จากไฟล์เนื้อหา 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 ดูข้อมูลเพิ่มเติมได้ที่สร้างและโต้ตอบกับฉาก