คู่มือนี้จะอธิบายวิธีใช้ Geospatial Creator เพื่อเขียนสคริปต์ C# เพื่อทำงานที่พบได้ทั่วไปอย่างรวดเร็ว เช่น การสร้างและย้ายARGeospatialCreatorAnchor
ออบเจ็กต์ในโหมดแก้ไขของ Unity ซึ่งอาจมีประโยชน์ในการสร้างจุดยึดหลายรายการจากรายการที่กำหนดไว้ล่วงหน้า เช่น สเปรดชีตหรือไฟล์ KML
Geospatial Creator ใน Unity ช่วยให้คุณดูตัวอย่างเนื้อหาภูมิสารสนเทศใน Unity Editor ได้ คู่มือเริ่มต้นใช้งานจะแนะนำเครื่องมือสร้างข้อมูลเชิงพื้นที่และแนะนำวิธีสร้างประสบการณ์ AR ที่เปิดใช้ข้อมูลเชิงพื้นที่ครั้งแรกด้วยโปรแกรมเขียนโค้ดเพียงเล็กน้อยโดยใช้ UI ของ Unity Editor สำหรับโปรเจ็กต์ขั้นสูง คุณอาจต้องสร้างและจัดการ GameObject ของ Creator แบบเชิงพื้นที่โดยใช้โปรแกรมแทนการใช้ UI ของ Unity Editor
คู่มือนี้ถือว่าคุณคุ้นเคยกับแนวคิดพื้นฐานของ Geospatial Creator ที่แนะนำไว้ใน "เริ่มต้นใช้งานอย่างรวดเร็ว" และพร้อมที่จะเริ่มเพิ่มจุดยึดของ Geospatial Creator ไปยังฉาก คุณจะต้องเปิดใช้ Geospatial Creator และกำหนดค่าด้วยคีย์ API รวมถึงวัตถุเซสชัน AR เริ่มต้นในฉาก หากเริ่มต้นจากต้น ให้ทำตามคู่มือเริ่มต้นใช้งานฉบับย่อจนจบ รวมถึงอ่านส่วน"เปิดใช้ Geospatial Creator" ก่อนดำเนินการต่อ
เริ่มต้นใช้งาน
ในตัวอย่างนี้ สมมติว่าคุณมีชุดสถานที่ที่รู้จักรอบๆ ศาลาว่าการในซานฟรานซิสโก แคลิฟอร์เนีย สหรัฐอเมริกา ซึ่งคุณต้องการวางเนื้อหา AR คุณจะต้องสร้างออบเจ็กต์จุดยึดในแต่ละตำแหน่งเหล่านี้ จากนั้นแนบเรขาคณิตพื้นฐานกับจุดยึดเหล่านั้น
ก่อนสร้างจุดยึด คุณควรระบุ ARGeospatialCreatorOrigin
ซึ่งเป็นจุดอ้างอิงสำหรับการแปลงละติจูด ลองจิจูด และระดับความสูงจากและไปยังพิกัดโลกของ Unity
ต้นทางจะมีคอมโพเนนต์ย่อย CesiumGeoreference
และออบเจ็กต์ย่อย Cesium3DTileset
ด้วย ซึ่งจะช่วยให้ Cesium แสดงผลพื้นที่โดยรอบในมุมมองฉากของเครื่องมือแก้ไข Unity ได้ โดยคุณจะต้องมีคีย์ Google Maps TILEs API ตามที่อธิบายไว้ในเริ่มต้นใช้งานอย่างรวดเร็ว
สร้างต้นทาง
API สําหรับ Geospatial Creator มีเมธอดแฟกทอรีเพื่อสร้าง ARGeospatialCreatorOrigin
ในฉากและเพิ่มคอมโพเนนต์ Cesium ที่จําเป็น
โค้ดต่อไปนี้จะสร้างจุดเริ่มต้นที่ละติจูด ลองจิจูด และระดับความสูงใกล้เคียงกัน และใช้คีย์ Map Tiles API ที่ระบุ
ARGeospatialCreatorOrigin origin =
GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");
โดยค่าเริ่มต้น ออบเจ็กต์นี้จะวางอยู่ที่ (0, 0, 0) ในพิกัดโลกของ Unity ซึ่งเหมาะกับตัวอย่างนี้
รับข้อมูลอ้างอิง ARAnchorManager
ต้องมี ARAnchorManager
เพื่อแก้ไขหมุดยึดเชิงพื้นที่ขณะรันไทม์ คุณจึงต้องมีข้อมูลอ้างอิงถึง ARAnchorManager
ในฉากด้วย หากคุณเริ่มต้นด้วยแอปพลิเคชันตัวอย่างเชิงพื้นที่ที่มาพร้อมกับส่วนขยาย ARCore โปรแกรมจัดการหมุดจะแนบอยู่กับ GameObject "ต้นทางเซสชัน AR" สมมติว่าคุณมีผู้จัดการจุดยึด 1 รายการในฉาก คุณจะได้รับข้อมูลอ้างอิงดังต่อไปนี้
ARAnchorManager anchorManager =
Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];
เมื่อคุณมีต้นทางและผู้จัดการจุดยึดแล้ว ก็เริ่มสร้างออบเจ็กต์ ARGeospatialCreatorAnchor
ได้
สร้างจุดยึดภูมิประเทศ
พิจารณาอาร์เรย์ 2 มิติของค่า double
ต่อไปนี้ ซึ่งแสดงละติจูดและลองจิจูดที่แม่นยำของ 3 จุดทางด้านตะวันออกของศาลาว่าการในซานฟรานซิสโก แคลิฟอร์เนีย สหรัฐอเมริกา
double[,] _cityHallEastPoints = {
{ 37.77936, -122.418617 }, // in front of city hall
{ 37.77965, -122.418680 }, // right of city hall
{ 37.77917, -122.418577 }}; // left of city hall
สมมติว่าคุณต้องการวางลูกบาศก์ขนาด 1 เมตรที่แต่ละตำแหน่งเหล่านี้ที่ระดับพื้นดินในแอปพลิเคชัน AR โค้ดต่อไปนี้จะสร้างออบเจ็กต์ ARGeospatialCreatorAnchor
และกำหนดค่าที่เหมาะสมให้กับพร็อพเพอร์ตี้
for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
ARGeospatialCreatorAnchor anchor =
new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
anchor.Origin = origin;
anchor.AnchorManager = anchorManager;
anchor.Latitude = _cityHallEastPoints[i, 0];
anchor.Longitude = _cityHallEastPoints[i, 1];
anchor.AltitudeType = AnchorAltitudeType.Terrain;
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.parent = anchor.transform;
}
ซึ่งจะสร้างจุดยึดของภูมิประเทศที่แต่ละจุด Geospatial Creator จะวางจุดยึดโดยอัตโนมัติที่พิกัดโลกของ Unity ที่เหมาะสม โดยคำนวณตำแหน่งของจุดยึดสัมพันธ์กับวัตถุ ARGeospatialCreatorOrigin
หากต้องการปรับระดับความสูงของจุดยึดภูมิประเทศ ให้ตั้งค่าพร็อพเพอร์ตี้ Altitude
เป็นเมตรเหนือหรือใต้พื้นผิวภูมิประเทศ
รันไทม์จะแก้ไขจุดยึดภูมิประเทศที่ระดับพื้นดินสําหรับแอปที่ทํางานอยู่ โดยมีการถ่วงดุลด้วยพร็อพเพอร์ตี้ Altitude
อย่างไรก็ตาม ในมุมมองฉากของเครื่องมือแก้ไข วัตถุจะแสดงผลที่ระดับความสูง 0 ของ WGS84 โดยค่าเริ่มต้น ซึ่งไม่ได้สัมพันธ์กับเรขาคณิตของชิ้นส่วน 3 มิติ ซึ่งมักไม่ใช่ตำแหน่งที่คุณต้องการเห็น ดังนั้นคุณจึงลบล้างความสูงเริ่มต้นของแอนคอร์ในมุมมองฉากของ Editor ได้โดยการตั้งค่าพร็อพเพอร์ตี้ UseEditorAltitudeOverride
เป็น true
และระบุความสูงเป็นเมตร WGS84 โดยใช้พร็อพเพอร์ตี้ EditorAltitudeOverride
ดังนี้
anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza
พร็อพเพอร์ตี้ 2 รายการนี้จะไม่มีผลนอกโหมดเครื่องมือแก้ไข และจะไม่ได้รับการคอมไพล์ลงในแอปที่ทำงานอยู่
สร้างจุดยึดบนหลังคา
สมมติว่าคุณต้องการวางจุดยึดบนหลังคาของศาลากลาง สำหรับจุดยึดถัดไป คุณสร้างแอตทริบิวต์นี้ได้ด้วยวิธีเดียวกันทุกประการ ยกเว้นการตั้งค่าพร็อพเพอร์ตี้ AltitudeType
เป็น AnchorAltitudeType.Rooftop
ARGeospatialCreatorAnchor cityHallRoofAnchor =
new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;
GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;
คุณสามารถปรับระดับความสูงของจุดยึดบนหลังคาในมุมมองฉากของผู้แก้ไขได้โดยใช้พร็อพเพอร์ตี้ UseEditorAltitudeOverride
และ EditorAltitudeOverride
ซึ่งคล้ายกับการปรับจุดยึดภูมิประเทศ ในตัวอย่างนี้ ความสูงของหลังคาตาม WGS84 อยู่ที่ประมาณ 10.7 เมตร
สร้างจุดยึดที่ระดับความสูงที่เฉพาะเจาะจง
จุดสังเกตสุดท้ายจะอยู่ที่ด้านบนสุดของโดมของศาลาว่าการ ระดับความสูงที่แม่นยำมีความสำคัญสำหรับจุดยึดนี้ คุณจึงต้องตั้งค่าอย่างชัดเจนโดยใช้จุดยึด WGS84 แทนจุดยึดบนพื้นดินหรือบนหลังคา
ARGeospatialCreatorAnchor cityHallDomeAnchor =
new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;
GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;
คุณไม่จำเป็นต้องใช้การลบล้างระดับความสูงสำหรับเอดิเตอร์เท่านั้น เนื่องจากระบบได้ระบุระดับความสูงตาม WGS84 ไว้แล้ว แน่นอนว่าหากความสูงของเรขาคณิตของชิ้นส่วนแผนที่ในเครื่องมือแก้ไขไม่ถูกต้องเมื่อเทียบกับโลกแห่งความเป็นจริง คุณยังคงใช้การลบล้างของเครื่องมือแก้ไขเพื่อจัดตำแหน่งจุดยึดในมุมมองฉากใหม่ได้