เนื้อหา
- แสดงเนื้อหา 3 มิติด้วยโพลี
- สร้างโครงการสร้างแบบจำลอง 3 มิติ
- สร้างบัญชี Google Cloud Platform
- รับรหัส Poly API ของคุณ
- การพึ่งพาโครงการ: ส่วนขยายเชื้อเพลิง P3D และ Kotlin
- การเพิ่มคีย์ API ของคุณ
- การดึงเนื้อหา
- การสร้างหน้าจอที่สอง: การเพิ่มการนำทาง
- สร้างผ้าใบ 3 มิติ
- วาดบนผืนผ้าใบของ P3D
- ทดสอบโครงการของคุณ
- ห่อ
- ที่เกี่ยวข้อง
คุณมีความคิดที่ดีสำหรับแอพมือถือเสมือนจริง (VR) หรือเพิ่มความเป็นจริง (AR) แต่ไม่มีความคิดว่าจะนำวิสัยทัศน์ของคุณมาสู่ชีวิตได้อย่างไร?
นอกจากว่าคุณเป็นนักพัฒนา Android ที่เคยเป็นศิลปิน 3D ที่มีประสบการณ์แล้วการสร้างเนื้อหาทั้งหมดที่จำเป็นในการส่งมอบประสบการณ์ 360 องศาที่ดื่มด่ำอาจเป็นกระบวนการที่น่ากลัว
เพียงเพราะคุณไม่มีเวลาทรัพยากรหรือประสบการณ์ที่จำเป็นในการสร้างแบบจำลอง 3 มิติ ไม่ หมายความว่าคุณไม่สามารถสร้างแอปมือถือ VR หรือ AR ที่ยอดเยี่ยมได้! มีแหล่งข้อมูล 3 มิติขนาดใหญ่ที่สามารถใช้ได้อย่างอิสระบน World Wide Web รวมถึง API เฟรมเวิร์กและไลบรารีทั้งหมดที่คุณต้องการดาวน์โหลดและแสดงเนื้อหาเหล่านี้ในแอปพลิเคชัน Android ของคุณ
อ่านต่อไป: ตอนนี้คุณสามารถเยี่ยมชมเว็บไซต์ใด ๆ โดยใช้ Daydream VR แม้แต่อันนั้น
ในบทความนี้เราจะดูที่โพลีแหล่งเก็บข้อมูลออนไลน์และ API ที่สร้างเนื้อหา 3 มิตินับพันที่ปลายนิ้วของคุณ ในตอนท้ายของบทความนี้คุณจะได้สร้างแอปที่ดึงเนื้อหา 3D โพลีตอนรันไทม์จากนั้นแสดงผลโดยใช้การประมวลผลยอดนิยมสำหรับห้องสมุด Android
แสดงเนื้อหา 3 มิติด้วยโพลี
หากคุณเคยแต่งแต้มในการพัฒนาความสามัคคีแล้วพื้นที่เก็บข้อมูลโพลีจะคล้ายกับที่เก็บสินทรัพย์ Unity - ยกเว้นว่าทุกอย่างในโพลีนั้นฟรี!
โมเดล 3 มิติของ Poly หลายรุ่นมีการเผยแพร่ภายใต้ใบอนุญาต Creative Commons ดังนั้นคุณสามารถใช้แก้ไขและรีมิกซ์เนื้อหาเหล่านี้ได้ฟรีตราบใดที่คุณให้เครดิตแก่ผู้สร้างที่เหมาะสม
โมเดล 3 มิติทั้งหมดของ Poly ได้รับการออกแบบให้เข้ากันได้กับแพลตฟอร์ม VR และ AR ของ Google เช่น Daydream และ ARCore แต่คุณสามารถใช้งานได้ทุกที่และทุกเวลาที่ต้องการ - คุณสามารถใช้กับ ARKit ของ Apple ได้!
เมื่อพูดถึงการดึงและแสดงสินทรัพย์โพลีคุณมีสองตัวเลือก ประการแรกคุณสามารถดาวน์โหลดเนื้อหาลงในคอมพิวเตอร์ของคุณจากนั้นนำเข้าสู่ Android Studio เพื่อให้พวกเขามาพร้อมกับแอปพลิเคชันของคุณและมีส่วนร่วมในขนาด APK หรือคุณสามารถดึงเนื้อหาเหล่านี้ได้ในขณะใช้งานโดยใช้ Poly API
Poly API ที่ใช้ข้ามแพลตฟอร์มเป็นแพลตฟอร์มแบบ REST ให้การเข้าถึงแบบอ่านโปรแกรมอย่างเดียวสำหรับคอลเลกชันโมเดล 3 มิติขนาดใหญ่ของโพลี สิ่งนี้มีความซับซ้อนมากกว่าการรวมสินทรัพย์กับ APK ของคุณ แต่มีประโยชน์หลายประการในการเรียกคืนเนื้อหาโพลีที่รันไทม์โดยเฉพาะอย่างยิ่งที่ช่วยให้ขนาด APK ของคุณอยู่ภายใต้การควบคุมซึ่งอาจส่งผลกระทบต่อจำนวนคนที่ดาวน์โหลดใบสมัครของคุณ
คุณยังสามารถใช้ Poly API เพื่อให้ทางเลือกแก่ผู้ใช้ของคุณมากขึ้นตัวอย่างเช่นหากคุณกำลังพัฒนาเกมมือถือคุณสามารถให้ผู้ใช้ของคุณเลือกจากตัวละครที่หลากหลาย
เนื่องจากคุณสามารถปรับเปลี่ยนโมเดล Poly ได้คุณสามารถให้ผู้ใช้ปรับแต่งตัวละครที่เลือกตัวอย่างเช่นโดยการเปลี่ยนสีผมหรือสีตาหรือโดยการรวมเข้ากับสินทรัพย์ Poly อื่น ๆ เช่นอาวุธและชุดเกราะที่แตกต่างกัน ด้วยวิธีนี้ Poly API สามารถช่วยคุณส่งมอบเนื้อหา 3 มิติที่น่าประทับใจพร้อมขอบเขตมากมายสำหรับการปรับประสบการณ์ให้เป็นส่วนตัว - และทั้งหมดสำหรับการทำงานเล็ก ๆ น้อย ๆ ผู้ใช้ของคุณจะมั่นใจได้ว่าคุณได้ใช้เวลาเป็นตันในการสร้างแบบจำลอง 3 มิติเหล่านี้อย่างพิถีพิถัน!
สร้างโครงการสร้างแบบจำลอง 3 มิติ
เราจะสร้างแอปพลิเคชันที่ดึงเนื้อหาโพลีเฉพาะเมื่อเปิดใช้งานแอปพลิเคชันครั้งแรกจากนั้นแสดงเนื้อหานั้นในโหมดเต็มหน้าจอตามคำขอของผู้ใช้
เพื่อช่วยเราดึงเนื้อหานี้ฉันจะใช้เชื้อเพลิงซึ่งเป็นห้องสมุดเครือข่าย HTTP สำหรับ Kotlin และ Android เริ่มต้นด้วยการสร้างโครงการใหม่ด้วยการตั้งค่าที่คุณเลือก แต่เมื่อได้รับแจ้งให้เลือก“ รวมการสนับสนุน Kotlin”
การโทรทั้งหมดที่คุณทำกับ Poly API จะต้องมีคีย์ API ซึ่งใช้เพื่อระบุแอปของคุณและบังคับใช้ขีด จำกัด การใช้งาน ในระหว่างการพัฒนาและทดสอบคุณมักจะใช้คีย์ API ที่ไม่ จำกัด แต่ถ้าคุณมีแผนที่จะปล่อยแอพนี้คุณจะต้องใช้คีย์ API ที่ จำกัด โดย Android
ในการสร้างคีย์ที่ถูก จำกัด คุณจะต้องทราบใบรับรองการลงนาม SHA-1 ของโครงการดังนั้นให้รับข้อมูลนี้ทันที:
- เลือกแท็บ“ Gradle” ของ Android Studio (ที่เคอร์เซอร์อยู่ในตำแหน่งในภาพหน้าจอต่อไปนี้) นี่เป็นการเปิดแผง "โครงการ Gradle"
- ในแผง "โครงการ Gradle" ให้ดับเบิลคลิกเพื่อขยาย "รูทโครงการ" จากนั้นเลือก "งาน> Android> รายงานการลงชื่อ" ซึ่งจะเปิดแผงใหม่ที่ด้านล่างของหน้าต่าง Android Studio
- เลือกปุ่ม“ สลับการประมวลผล / โหมดข้อความ” (ซึ่งเคอร์เซอร์อยู่ในตำแหน่งในภาพหน้าจอต่อไปนี้)
ขณะนี้แผง "Run" จะอัปเดตเพื่อแสดงข้อมูลจำนวนมากเกี่ยวกับโครงการของคุณรวมถึงลายนิ้วมือ SHA-1
สร้างบัญชี Google Cloud Platform
ในการรับคีย์ API ที่จำเป็นคุณจะต้องมีบัญชี Google Cloud Platform (GPC)
หากคุณไม่มีบัญชีคุณสามารถลงทะเบียนเพื่อทดลองใช้ฟรี 12 เดือนโดยไปที่หน้าลองแพลตฟอร์มคลาวด์สำหรับฟรีและทำตามคำแนะนำ โปรดทราบว่าจำเป็นต้องใช้บัตรเครดิตหรือบัตรเดบิต แต่ตามหน้าคำถามที่พบบ่อยจะใช้เพื่อยืนยันตัวตนของคุณและ“ คุณจะไม่ถูกเรียกเก็บเงินหรือเรียกเก็บเงินในระหว่างการทดลองใช้ฟรี”
รับรหัส Poly API ของคุณ
เมื่อลงทะเบียนเรียบร้อยแล้วคุณสามารถเปิดใช้งาน Poly API และสร้างคีย์ของคุณ:
- ตรงไปที่ GCP Console
- เลือกไอคอนมีเส้นขอบที่มุมบนซ้ายแล้วเลือก“ APIs & Services> Dashboard”
- เลือก“ เปิดใช้งาน API และบริการ”
- ในเมนูด้านซ้ายเลือก“ อื่น ๆ ”
- เลือกการ์ด“ โพลี API”
- คลิกปุ่ม "เปิดใช้งาน"
- หลังจากนั้นสักครู่คุณจะถูกนำไปที่หน้าจอใหม่ เปิดเมนูด้านข้างแล้วเลือก“ API และบริการ> ข้อมูลรับรอง”
- ในป๊อปอัปที่ตามมาเลือก "จำกัด คีย์"
- ตั้งชื่อให้กับคีย์ของคุณ
- ภายใต้“ ข้อ จำกัด ของแอปพลิเคชัน” เลือก“ แอพ Android”
- เลือก“ เพิ่มชื่อแพ็คเกจและลายนิ้วมือ”
- คัดลอก / วางลายนิ้วมือ SHA-1 ของโครงการของคุณลงในฟิลด์“ ลายเซ็นใบรับรองลายเซ็น”
- ป้อนชื่อแพ็คเกจของโครงการของคุณ (จะปรากฏในรายการของคุณและที่ด้านบนของไฟล์ทุกชั้น)
- คลิก“ บันทึก”
ตอนนี้คุณจะถูกนำไปที่หน้าจอ“ หนังสือรับรอง” ของโครงการซึ่งมีรายการคีย์ API ทั้งหมดของคุณ - รวมถึงคีย์ API ที่เปิดใช้งานโพลีที่คุณเพิ่งสร้างขึ้น
การพึ่งพาโครงการ: ส่วนขยายเชื้อเพลิง P3D และ Kotlin
ในการดึงและแสดงเนื้อหาโพลีเราต้องการความช่วยเหลือจากห้องสมุดเพิ่มเติม:
- เชื้อเพลิง ปัจจุบันโพลีไม่มีชุดเครื่องมือ Android อย่างเป็นทางการดังนั้นคุณจะต้องทำงานกับ API โดยตรงโดยใช้ส่วนต่อประสาน REST เพื่อให้กระบวนการนี้ง่ายขึ้นฉันจะใช้ห้องสมุดเครือข่าย Fuel HTTP
- กำลังดำเนินการสำหรับ Android ฉันจะใช้ตัวแสดงผล P3D ของห้องสมุดนี้เพื่อแสดงเนื้อหาโพลี
เปิดไฟล์ build.gradle ของโครงการและเพิ่มสองไลบรารีนี้เป็นการอ้างอิงโครงการ:
การประยุกต์ใช้ {พึ่งพา fileTree (รวมถึง:, dir: libs) "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" การใช้งาน com.android.support:appcompat-v7:27.1.1 // เพิ่มคลังเชื้อเพลิง / / implementation com.github.kittinunf.fuel: fuel-android: 1.13.0 // เพิ่มการประมวลผลสำหรับเครื่องมือ Android // การใช้งาน org.p5android: processing-core: 4.0.1}
เพื่อให้รหัสของเรากระชับยิ่งขึ้นฉันจะใช้ส่วนขยาย Kotlin Android ด้วยดังนั้นลองเพิ่มปลั๊กอินนี้ในขณะที่เราเปิดไฟล์ build.gradle:
ใช้ปลั๊กอิน: kotlin-android-extensions
สุดท้ายเนื่องจากเรากำลังเรียกคืนเนื้อหาจากอินเทอร์เน็ตแอปของเราต้องได้รับอนุญาตจากอินเทอร์เน็ต เปิดรายการของคุณและเพิ่มรายการต่อไปนี้:
การเพิ่มคีย์ API ของคุณ
ทุกครั้งที่แอพของเราร้องขอเนื้อหาจาก Poly จำเป็นต้องมีคีย์ API ที่ถูกต้อง ฉันใช้ข้อความตัวยึดตำแหน่ง แต่คุณ ต้อง แทนที่ตัวยึดตำแหน่งนี้ด้วยคีย์ API ของคุณเองหากแอปพลิเคชันกำลังทำงานอยู่
ฉันยังเพิ่มการตรวจสอบเพื่อที่แอปพลิเคชันจะแสดงคำเตือนหากคุณลืมแทนที่ข้อความ“ INSERT-YOUR-API-KEY”:
นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity ระดับ MainActivity: AppCompatActivity () {วัตถุคู่หู {const val APIKey = "INSERT-YOUR-API-KEY"} แทนที่ความสนุกบนการสร้าง super.onCreate (hiddenInstanceState) setContentView (R.layout.activity_main) // ถ้าคีย์ API เริ่มต้นด้วย "INSERT" ... // ถ้า (APIKey.startsWith ("INSERT")) {// จากนั้นแสดง toast ต่อไปนี้ ... .// Toast.makeText (นี่คือ "คุณยังไม่ได้อัปเดตคีย์ API ของคุณ", Toast.LENGTH_SHORT) .show ()} else {... ... ...
การดึงเนื้อหา
คุณสามารถเลือกเนื้อหาใด ๆ ในเว็บไซต์ Google Poly แต่ฉันจะใช้ Planet Earth รุ่นนี้
คุณดึงเนื้อหาโดยใช้ ID ของมันซึ่งจะปรากฏในตอนท้ายของกระสุนกระสุน (เน้นในภาพหน้าจอก่อนหน้า) เรารวมรหัสเนื้อหานี้กับโฮสต์ Poly API ซึ่งเป็น“ https://poly.googleapis.com/v1”
นำเข้า android.content.Intent นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity นำเข้า android.widget.Toast นำเข้า com.github.kittinunf.fuel.android.extension.responseJson นำเข้า .httpDownload การนำเข้า com.github.kittinunf.fuel.httpGet นำเข้า kotlinx.android.synthetic.main.activity_main. * นำเข้าคลาส java.io.File MainActivity: AppCompatActivity () -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} แทนที่ความสนุกสนานในการสร้าง (saveInstanceState: Bundle?) {super.onCreate (hiddenInstanceState) setContentView (R.layout.activity_main) ถ้า ( APIKey.startsWith ("INSERT")) {Toast.makeText (นี่คือ "คุณยังไม่ได้อัปเดตคีย์ API ของคุณ", Toast.LENGTH_SHORT) .show ()} else {
ต่อไปเราต้องส่งคำขอ GET ไปยัง URL เนื้อหาโดยใช้วิธี httpGet () ฉันยังระบุด้วยว่าประเภทการตอบกลับต้องเป็น JSON:
นำเข้า android.content.Intent นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity นำเข้า android.widget.Toast นำเข้า com.github.kittinunf.fuel.android.extension.responseJson นำเข้า .httpDownload การนำเข้า com.github.kittinunf.fuel.httpGet นำเข้า kotlinx.android.synthetic.main.activity_main. * นำเข้าคลาส java.io.File MainActivity: AppCompatActivity () -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} แทนที่ความสนุกสนานในการสร้าง (saveInstanceState: Bundle?) {super.onCreate (hiddenInstanceState) setContentView (R.layout.activity_main) ถ้า ( APIKey.startsWith ("INSERT")) {Toast.makeText (นี่ "คุณยังไม่ได้อัปเดตคีย์ API ของคุณ", Toast.LENGTH_SHORT) .show ()} else {// โทรหาเซิร์ฟเวอร์แล้วส่งข้อมูลโดยใช้ “ listOf” method // assetURL.httpGet (listOf ("key" ถึง APIKey)) responseJson {request, response, result -> // ทำบางสิ่งด้วยการตอบกลับ // result.fold ({val as set = it.obj ()
เนื้อหาอาจมีหลายรูปแบบเช่น OBJ, GLTF และ FBX เราจำเป็นต้องตรวจสอบว่าสินทรัพย์อยู่ในรูปแบบ OBJ
ในขั้นตอนนี้ฉันจะดึงชื่อและ URL ของไฟล์ทั้งหมดที่เราต้องการดาวน์โหลด
รวมถึงไฟล์หลักของสินทรัพย์ (“ root”) รวมถึงไฟล์เนื้อหาและไฟล์พื้นผิวใด ๆ ที่เกี่ยวข้อง (“ ทรัพยากร”)
หากแอปพลิเคชันของเราไม่สามารถเรียกคืนเนื้อหาได้อย่างถูกต้องแสดงว่ามีขนมปังปิ้งแจ้งให้ผู้ใช้ทราบ
นำเข้า android.content.Intent นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity นำเข้า android.widget.Toast นำเข้า com.github.kittinunf.fuel.android.extension.responseJson นำเข้า .httpDownload การนำเข้า com.github.kittinunf.fuel.httpGet นำเข้า kotlinx.android.synthetic.main.activity_main. * นำเข้าคลาส java.io.File MainActivity: AppCompatActivity () -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} แทนที่ความสนุกสนานในการสร้าง (saveInstanceState: Bundle?) {super.onCreate (hiddenInstanceState) setContentView (R.layout.activity_main) ถ้า ( APIKey.startsWith ("INSERT")) {Toast.makeText (นี่คือ "คุณยังไม่ได้อัปเดตคีย์ API ของคุณ", Toast.LENGTH_SHORT) .show ()} อื่น {// ส่งคำขอ GET ไปยัง URL เนื้อหา // assetURL httpGet (listOf ("key" ถึง APIKey)) responseJson {request, response, result -> // ทำบางอย่างด้วยการตอบกลับ // result.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String หรือไม่ = null var materialLibraryURL: สตริง = null // ตรวจสอบรูปแบบของเนื้อหาโดยใช้อาร์เรย์ "รูปแบบ" // val assetFormats = asset.getJSONArray ("รูปแบบ") // วนดูทุกรูปแบบ // สำหรับ (i ใน 0 จนกระทั่ง assetFormats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // ใช้ formatType เพื่อระบุประเภทรูปแบบของทรัพยากรนี้ หากรูปแบบเป็น OBJ … .// if (currentFormat.getString ("formatType") == "OBJ") {//... จากนั้นเรียกไฟล์ 'root' ของทรัพยากรนี้เช่นไฟล์ OBJ // objectURL = currentFormat getJSONObject ("root") .getString ("url") // ดึงการอ้างอิงของไฟล์รูททั้งหมด / materialLibraryName = currentFormat.getJSONArray ("แหล่งข้อมูล") .getJSONObject ("ญาติ") ("ทรัพยากร") .getJSONObject (0). getString ("url") break}} objectURL !!. httpDownload (). ปลายทาง {_, _ -> ไฟล์ (filesDir, "globeAsset.obj")} .response {_ , _, result -> result.fold ({}, {// หากคุณไม่สามารถค้นหาหรือดาวน์โหลดไฟล์ OBJ ให้แสดงข้อผิดพลาด // Toast.makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). ปลายทาง {_, _ -> ไฟล์ (filesDir, materialLibraryName)} .response {_, _, ผลลัพธ์ -> result.fold ({}, {Toast makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT) .show ()})}}}
ณ จุดนี้หากคุณติดตั้งโครงการบนสมาร์ทโฟนหรือแท็บเล็ต Android หรืออุปกรณ์ Android เสมือน (AVD) ของคุณสินทรัพย์จะดาวน์โหลดสำเร็จ แต่แอปจะไม่แสดงจริง มาแก้ไขกันเถอะ!
การสร้างหน้าจอที่สอง: การเพิ่มการนำทาง
เรากำลังจะแสดงเนื้อหาในโหมดเต็มหน้าจอดังนั้นให้อัปเดตไฟล์ main_activity.xml ของเราเพื่อรวมปุ่มที่เมื่อแตะจะเปิดใช้งานกิจกรรมเต็มหน้าจอ
ตอนนี้ให้เพิ่ม onClickListener ไปที่ท้ายไฟล์ MainActivity.kt:
นำเข้า android.content.Intent นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity นำเข้า android.widget.Toast นำเข้า com.github.kittinunf.fuel.android.extension.responseJson นำเข้า .httpDownload การนำเข้า com.github.kittinunf.fuel.httpGet นำเข้า kotlinx.android.synthetic.main.activity_main. * นำเข้าคลาส java.io.File MainActivity: AppCompatActivity () -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} แทนที่ความสนุกสนานในการสร้าง (saveInstanceState: Bundle?) {super.onCreate (hiddenInstanceState) setContentView (R.layout.activity_main) ถ้า ( APIKey.startsWith ("INSERT")) {Toast.makeText (นี่คือ "คุณยังไม่ได้อัปเดตคีย์ API ของคุณ", Toast.LENGTH_SHORT) .show ()} else {assetURL.httpGet (listOf ("key" ถึง APIKey)) responseJson {request, response, result -> result.fold ({val asset = it.obj ()) var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: Str ไอเอ็นจี? = null val assetFormats = asset.getJSONArray ("format") สำหรับ (i ใน 0 จนกระทั่ง assetFormats.length ()) {val currentFormat = assetFormats.getJSONObject (i) ถ้า currentFormat.getString ("formatType") == "OBJ" ) {objectURL = currentFormat.getJSONObject ("root") .getString ("url") materialLibraryName "currentFormat.getJSONArray (" ทรัพยากร ") .getJSONObject (" ญาติ ") ) .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). ปลายทาง {_, _ -> ไฟล์ (filesDir, "globeAsset.obj")}. การตอบสนอง {_, _, ผลลัพธ์ -> result.fold ({}, {Toast.makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT) .show ()}) MaterialLibraryURL !! material. httpDownload (). ปลายทาง {_, _ -> ไฟล์ (filesDir, materialLibraryName)} .response {_, _, result -> result.fold ({}, {Toast.makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT) .show ()}),} {Toast.makeText (นี่คือ "ไม่สามารถดาวน์โหลดทรัพยากร", Toast.LENGTH_SHORT) .sh ow ()})} // ใช้งานปุ่ม // displayButton.setOnClickListener {val เจตนา = เจตนา (นี่, SecondActivity :: class.java) startActivity (เจตนา); }}}
สร้างผ้าใบ 3 มิติ
ตอนนี้มาสร้างกิจกรรมที่เราจะแสดงเนื้อหาของเราในโหมดเต็มหน้าจอ:
- ควบคุมคลิกไฟล์ MainActivity.kt ของโครงการของคุณแล้วเลือก“ ใหม่> ไฟล์ Kotlin / คลาส”
- เปิดเมนูแบบเลื่อนลง“ ชนิด” และเลือก“ คลาส”
- ตั้งชื่อคลาส“ SecondActivity” จากนั้นคลิก“ ตกลง”
ในการวาดวัตถุ 3 มิติเราจำเป็นต้องมีผ้าใบ 3 มิติ! ฉันจะใช้ตัวประมวลผล P3D ของตัวแสดงผลห้องสมุดของ Android ซึ่งหมายถึงการขยายคลาส PApplet โดยแทนที่เมธอด settings () และจากนั้นส่งผ่าน P3D เป็นอาร์กิวเมนต์ไปยังวิธี fullScreen () นอกจากนี้เรายังต้องสร้างคุณสมบัติที่แสดงถึงทรัพย์สินโพลีเป็นวัตถุ PShape
displayAsset ส่วนตัวสนุก () {val canvas3D = วัตถุ: PApplet () {var polyAsset: PShape? = การแทนที่การตั้งค่าความสนุกสนานเป็นโมฆะ () {เต็มหน้าจอ (PConstants.P3D)}
ต่อไปเราต้องเริ่มต้นวัตถุ PShape ด้วยการแทนที่เมธอด setup () เรียกใช้วิธี loadShape () จากนั้นผ่านพา ธ สัมบูรณ์ของไฟล์. obj:
แทนที่การตั้งค่าความสนุก () {polyAsset = loadShape (ไฟล์ (filesDir, "globeAsset.obj"). absolutePath)}
วาดบนผืนผ้าใบของ P3D
ในการวาดบนผืนผ้าใบ 3 มิตินี้เราจำเป็นต้องแทนที่เมธอด draw ():
ลบล้างความสนุกสนานในการวาด () {background (0) รูปร่าง (polyAsset)}}
ตามค่าเริ่มต้นสินทรัพย์จำนวนมากที่ดึงมาจาก Poly API นั้นมีขนาดเล็กกว่าดังนั้นหากคุณเรียกใช้รหัสนี้ตอนนี้คุณอาจไม่เห็นเนื้อหาขึ้นอยู่กับการกำหนดค่าหน้าจอของคุณ เมื่อสร้างฉาก 3 มิติโดยทั่วไปคุณจะต้องสร้างกล้องที่กำหนดเองเพื่อให้ผู้ใช้สามารถสำรวจฉากและดูเนื้อหา 3 มิติของคุณจากมุมมอง 360 องศา อย่างไรก็ตามนี่อยู่นอกเหนือขอบเขตของบทความนี้ดังนั้นฉันจะเปลี่ยนขนาดและตำแหน่งของเนื้อหาด้วยตนเองเพื่อให้แน่ใจว่าเหมาะกับหน้าจออย่างสะดวกสบาย
คุณสามารถเพิ่มขนาดของเนื้อหาได้โดยการส่งค่าลบให้กับวิธีการ scale ():
ขนาด (-10f)
คุณสามารถปรับตำแหน่งของสินทรัพย์ในพื้นที่ 3D เสมือนโดยใช้วิธีแปล () และพิกัดต่อไปนี้:
- เอ็กซ์ วางตำแหน่งสินทรัพย์ตามแนวแกนนอน
- วาย วางตำแหน่งสินทรัพย์ตามแนวแกนตั้ง
- Z. นี่คือแกน“ ความลึก / ความสูง” ซึ่งเปลี่ยนวัตถุ 2D เป็นวัตถุ 3 มิติ ค่าบวกจะสร้างการแสดงผลที่วัตถุกำลังเข้ามาหาคุณและค่าลบจะสร้างการแสดงผลที่วัตถุนั้นเคลื่อนไปจากคุณ
โปรดทราบว่าการแปลงเป็นแบบสะสมดังนั้นทุกสิ่งที่เกิดขึ้นหลังจากฟังก์ชันสะสมผลกระทบ
ฉันกำลังใช้สิ่งต่อไปนี้:
แปล (-50f, -100f, 10f)
นี่คือรหัสที่สมบูรณ์:
ลบล้างความสนุกสนานในการวาด () {background (0) scale (-10f) translate (-50f, -100f) // วาดเนื้อหาโดยการเรียก the shape () method // shape (polyAsset)}}
ต่อไปเราต้องสร้างไฟล์เลย์เอาต์ที่เกี่ยวข้องซึ่งเราจะเพิ่มผ้าใบ 3 มิติเป็นวิดเจ็ต FrameLayout:
- คลิกควบคุมโฟลเดอร์ "res> layout" ของโครงการ
- เลือก“ ไฟล์ทรัพยากรเลย์เอาต์”
- ตั้งชื่อไฟล์นี้ว่า“ activity_second” จากนั้นคลิก“ OK”
ตอนนี้เรามี“ asset_view” FrameLayout แล้วเราต้องแจ้งให้ SecondActivity ทราบ! พลิกกลับไปที่ไฟล์ SecondActivity.kt สร้างอินสแตนซ์ PFragment ใหม่และชี้ไปในทิศทางของวิดเจ็ต“ asset_view” ของเรา:
นำเข้า android.os.Bundle นำเข้า android.support.v7.app.AppCompatActivity นำเข้า kotlinx.android.synthetic.main.activity_second. * การนำเข้า processing.android.PFragment การนำเข้าการประมวลผล core.PApplet การนำเข้าการประมวลผล core .PShape นำเข้า java.io.File คลาส SecondActivity: AppCompatActivity () {แทนที่สนุก onCreate (saveInstanceState: Bundle?) {super.onCreate (saveInstanceState) setContentView (R.layout.activity_second) displayAsset ()} canvas3D = object: PApplet () {var polyAsset: PShape? = null override fun settings () {fullScreen (PConstants.P3D)} แทนที่การตั้งค่าความสนุก () {polyAsset = loadShape (ไฟล์ (filesDir, "globeAsset.obj"). absolutePath)} แทนที่ความสนุกแบบวาด () (พื้นหลัง (0) (-10f) แปล (-50f, -100f) รูปร่าง (polyAsset)}} // เพิ่มต่อไปนี้ // val assetView = PFragment (canvas3D) assetView.setView (asset_view นี่)}}
ขั้นตอนสุดท้ายคือการเพิ่ม SecondActivity ให้กับรายการของคุณ:
ทดสอบโครงการของคุณ
ตอนนี้เราพร้อมที่จะทดสอบโครงการที่เสร็จสมบูรณ์แล้ว! ติดตั้งบนอุปกรณ์ Android หรือ AVD ของคุณและตรวจสอบให้แน่ใจว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตที่ใช้งานได้ ทันทีที่แอปเปิดตัวแอปจะดาวน์โหลดเนื้อหาและคุณสามารถดูได้โดยกดปุ่ม "แสดงสินทรัพย์"
คุณสามารถดาวน์โหลดโครงการที่สมบูรณ์จาก GitHub
ห่อ
ในบทความนี้เราดูที่วิธีการใช้ Poly API เพื่อดึงเนื้อหา 3 มิติที่รันไทม์และวิธีการแสดงเนื้อหานั้นโดยใช้ห้องสมุดการประมวลผลสำหรับ Android คุณคิดว่า Poly API มีศักยภาพที่จะทำให้ผู้คนจำนวนมากเข้าถึง VR และ AR ได้หรือไม่? แจ้งให้เราทราบในความคิดเห็นด้านล่าง!
ที่เกี่ยวข้อง
- Google จะนำแอป AR ไปสู่“ หลายร้อยล้าน” ของอุปกรณ์ Android ในปี 2018
- Google จะสอนคุณเกี่ยวกับ AI และการเรียนรู้ของเครื่องฟรี
- 15 เกม VR ที่ดีที่สุดสำหรับ Google Cardboard
- แอป VR ที่ดีที่สุด 10 อันดับสำหรับ Google Cardboard
- Google Fuchsia คืออะไร นี่เป็น Android ใหม่หรือไม่
- Google Duplex คืออะไร - คุณสมบัติวันที่วางจำหน่ายและอื่น ๆ
- วิธีสร้างแอป VR สำหรับ Android ในเวลาเพียง 7 นาที
- ชุดหูฟัง VR มือถือ - ตัวเลือกที่ดีที่สุดของคุณคืออะไร?