Class Project : Multi Player Mixed Reality Exploration with Hololens 2

Class Project : Multi Player Mixed Reality Exploration with Hololens 2

Microsoft Hololens 2 เป็นแว่นตาอัจฉริยะที่พัฒนาขึ้นโดยบริษัท Microsoft ที่สามารถนำวัตถุที่สร้างมาปรากฏซ้อมทับกับภาพความเป็นจริง หรือ mixed reality ทำให้ผู้สวมใส่สามารถที่จะจับต้องหรือมีประติสัมพันธ์กับวัตถุได้ โดยทาง Microsoft ได้ Hololens 2 ขึ้นเพื่อพัฒนาการเรียนรู้ในปัจจุบันให้มีประสิทธิภาพมากขึ้นการได้จำลองสถานการณ์ หรือ สภาพแวดล้อมจำลอง เพื่อให้ผู้ใช้สามารถเข้าถึงการเรียนรู้ในสถานที่จริง โดยไม่ต้องไปสถานที่จริง

Mixed Reality หรือ MR คือ เทคโนโลยีความเป็นจริงแบบผสม โดยสามารถสร้างหรือนำเอาวัตถุมาปรากฏอยู่ในโลกความเป็นจริง นอกจากการมองเห็นแล้ว MR ยังครอบคลุมถึงการรับรู้อื่นๆ เช่น การได้ยิน การสัมผัส กลิ่น และรสชาติ

โดยรายวิชา FRA500 TOPIC I : Human-Robotics Interface (HRI) ต้องการให้ผู้ใช้งานมีประติสัมพันธ์หรือการตอบสนองระหว่างผู้ใช้งาน 2 คนหรือมากกว่า ผ่าน Hololens 2 โดยสามารถเห็นวัตถุเดียวกันที่อยู่ตรงหน้าได้โดยผู้จัดทำต้องการให้ผู้ใช้งานได้รับประสบการณ์การประลองเวทมนต์ ที่ผู้เล่นทั้งสองต้องสวมบทบาทเป็นจอมเวทไฟ และโจมตีคู่ต่อสู้จนกว่าจะชนะ

การใช้ photon ในการส่งตำแหน่งของผู้ใช้และวัตถุ

ในการเล่นเกมแบบ multiplayer หรือ ผู้เล่นหลายคน ทางกลุ่มเราใช้ Photon unity network เป็น server หลักในการส่งข้อมูลตำแหน่งของผู้ใช้และวัตถุ เพื่อให้ผู้ใช้เห็นวัตถุในตำแหน่งเดียวกันได้

ตัวอย่าง code ที่เราใช้ในการส่งตำแหน่งของผู้ใช้และวัตถุ

       private void StartGame()
        {
            CreatPlayer();

            if (!PhotonNetwork.IsMasterClient) return;

            if (TableAnchor.Instance != null) CreateInteractableObjects();
        }

        private void CreatPlayer()
        {
            var player = PhotonNetwork.Instantiate(photonUserPrefab.name, Vector3.zero, Quaternion.identity);
        }

โดย code ในส่วนนี้เป็นการประกาศสร้าง Object Player เมื่อเติมคำว่า PhotonNetwork เป็นการประกาศว่า Object นั้นถูกสร้างขั้นใน PhotonNetwork ตามรหัส Server ทำให้ผู้ใช้คนอื่นสามารถมองเห็นวัตถุเดียวกันได้ โดยเราสามารถประกาศ Object อื่นๆ ให้อยู่ใน PhotonNetwork ได้ เช่น

 ตัวอย่าง code ที่เราใช้ในการยิงลูกไฟ และเกาะป้องกัน

    public void ShootFire()
    {
        delectFire();   
        Debug.Log("Pew pew");
        soundfire.Play();
        GameObject fireball = PhotonNetwork.Instantiate(projectile.name,shootingpoint.transform.position,Quaternion.identity);
        Rigidbody rb = fireball.GetComponent<Rigidbody>();
        rb.velocity = shootingpoint.transform.forward * projectilespeed;
        Destroy (fireball,3.5f);
    }
    public void CreatedBarrier()
    {   
        GameObject BR = PhotonNetwork.Instantiate(Barrier.name,indexKnuckleObject.transform.position,indexKnuckleObject.transform.rotation);
        Destroy (BR,5f);
    }

โดย code ในส่วนนี้แสดงการ Object และใส่ความเร็วเพื่อให้ลูกไปพุ่งไปข้างหน้า

การออกแบบท่าทาง

ภายในตัว Hololens จะมีเทคโนโลยี Hand tracking ที่สามารถ Track มือของผู้ใช้ได้แม่นยำ ช่วยให้ผู้ใช้สามารถโต้ตอบและควบคุม User Interface ในรูปแบบ โฮโลแกรม ผ่านมือเปล่าได้อย่างง่ายดาย  อีกทั้ง Microsoft ยังอนุญาตให้นักพัฒนาสามารถเข้าถึงเทคโนโลยีนี้ได้ผ่านการเขียนสคริปต์ C# ใน Unity ดังนั้นทางกลุ่มเราจึงเลือกการสร้าง Hand Tracking สำหรับการ Track มือและท่าทางของผู้ใช้ โดยใช้ Hand tracking ของ Hololens

โดยการ Track มือโดยใช้ Hand tracking จะช่วยทำให้สามารถ Track ข้อต่อและจุดต่างๆตามมือได้โดยจะสร้างเป็น empty GameObjects ทั้งหมด 26  จุดดังรูป และเราสามารถเปลี่ยนสิ่งเหล่านี้ได้ ดังนั้นเราจึงทำการเปลี่ยนข้อต่อที่เราต้องการ track ได้แก่ ปลายนิ้วโป้ง ปลายนิ้วชี้ ปลายนิ้วกลาง และข้อนิ้วกลาง ด้วย Game Object และใส่ Component Collider (คำสั่งตรวจสอบการชนกันของ Game Object) เพื่อที่จะนำไปกำหนดเงื่อนไขเมื่อผู้ใช้มีการแสดงท่าทางที่นิ้วมีการสัมผัสโดนกัน

ตัวอย่าง Code การใช้ Collider การกำหนดเงื่อนไขการยิงลูกบอลไฟ

public class CallFire : MonoBehaviour
{
    int Create = 0;
    
    void OnTriggerEnter(Collider otherCollider)
    {
        if(otherCollider.gameObject.layer == 9)
        {
            Debug.Log("Call me on Fire!");
            HandTracking Fireball;
            Fireball = otherCollider.GetComponentInParent<HandTracking>();
            Fireball.MakeFire();
            Create = 1;

        }
    }
    void OnTriggerExit(Collider otherCollider)
    {
        if(otherCollider.gameObject.layer == 9)
        {
            if(Create == 1)
            {
                HandTracking Fireball;
                Fireball = otherCollider.GetComponentInParent<HandTracking>();
                Fireball.ShootFire();
                Create = 0;
            }
        }
    }
}

โดย code ส่วนนี้จะอยู่ใน GameObject ที่ติดอยู่ตรงส่วนปลายนิ้วโป้ง และกำหนดให้ GameObject ที่ติดอยู่ตรงส่วนปลายนิ้วกลางอยู่ layer ที่ 9  เมื่อ GameObject ที่ติดอยู่ตรงส่วนปลายนิ้วโป้ง มีการ Collider กับ GameObject ที่อยู่ใน layer ที่ 9 หรือก็คือปลายนิ้วกลาง แสดงว่าผู้ใช้มีการนำนิ้วโป้งกับนิ้วกลางมาสัมผัสกัน ก็จะเรียกใช้ ฟังก์ชั่น MakeFire ที่จะทำการสร้างลูกไฟขึ้นมาที่บริเวณปลายนิ้วชี้ และเมื่อปล่อยนิ้วโป้งกับนิ้วกลางออกจากกันก็จะเป็นการเรียกใช้ ฟังก์ชั่น ShootFire ที่จะทำการยิงลูกไฟออกไปจากนิ้ว

ซึ่งเราสามารถนำเอา Component Collider นี้ไปประยุกต์ใช้กับสิ่งต่างๆที่อยู่ในเกมเราได้มากมาย ไม่ว่าจะเป็น การแสดงท่าทางในการสร้างบาเรีย การคำนวณความเสียหายที่ได้รับจากการโดนยิง การเกิดเสียงต่างๆเมื่อ object มีการชนกัน ไม่ว่าจะเป็น เสียงตอนยิงลูกไฟ เสียงตอนเปิดบาเรีย เป็นต้น

การใช้ Mrtk กับวัตถุ

Mixed Reality Toolkit 2 (MRTK2) เป็นชุดเครื่องมือซึ่งประกอบไปด้วยชุดของ component และ features ที่หลากหลายซึ่งจะเข้ามาช่วยลดเวลาและลดความยุ่งยากในการสร้าง แอปพลิเคชั่น Mixed Reality โดยใน project นี้ ทางกลุ่มเราได้เลือกใช้ชุดเครื่องมือ MRTK มา 2 component ได้แก่

  1. Object manipulator เป็นเครื่องมือที่ช่วยให้ผู้ใช้สามารถหยิบจับ เคลื่อนย้าย หรือปรับขนาดวัตถุได้ ซึ่งเราจะนำมาใส่กับ GameObjects ที่เป็นแท่นสำหรับเพิ่มเลือด ก็จะช่วยให้ผู้ใช้สามารถหยิบจับ เคลื่อนย้าย แท่นดังกล่าว ไปไว้ยังจุดอื่นได้
  1. Slover เป็นเครื่องมือที่ช่วยอำนวยความสะดวกในการคำนวณตำแหน่งและการวางแนวของวัตถุ ซึ่งเราจะนำมาใส่กับป้ายแสดงสถานะเลือด ก็จะช่วยให้ป้ายแสดงสถานะเลือดสามารถเคลื่อนที่ตามผู้ใช้ได้ และภายใน Slover ก็จะประกอบไปด้วยสคริปต์อีกมากมาย ซึ่งใน project นี้เราได้เลือกใช้
    • SolverHandler ใช้สำหรับตั้งค่าวัตถุอ้างอิงเพื่อติดตาม ในที่นี้เราจะใช้เป็นส่วนหัว
    • Follow ใช้สำหรับกำหนดขอบเขตในการให้วัตถุติดตามโดยกำหนดให้อยู่ในช่วง 0.3-0.5 เมตร

คำสั่งมือ

แสดงผล

วิธีการเล่นเกม

ตัวอย่างการเล่นจริง

สามารถนำวิธีการ และหลักการ นี้ไปประยุกต์ในการเรียนรู้การทำ Game mutiplaer หรือ การทำ Mixed Reality เช่น การจำลองการผ่าตัด การจำลองการตีกอล์ฟ โดยที่ผู้สวมใส่สามารถมองเห็น หรือ มีปฏิสัมพันธ์กับผู้ใช้หลายคนได้ นอกจากนั้สามารถนำไปพัฒนาต่อ ในเรื่องการส่งตำแหน่งของผู้ใช้ให้อยู่ตำแหน่งที่ต้อง เนื่องจากว่าตำแหน่งของผู้ใช้ยังมีความคาดเคลื่อนอยู่ นอกจากนี้ยังสามารถพัฒนาเกมให้ท่าทาง และ ลูกเล่นมากขึ้นได้

GitHub

https://github.com/Foke37/FireBall_MixedReallity_HRIProject.git

photon package

mrtk package

mrtk

  • https://learn.microsoft.com/en-us/training/modules/learn-mrtk-tutorials/1-1-introduction
  • https://learn.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/mrtk2/features/ux-building-blocks/solvers/solver?view=mrtkunity-2022-05
  • https://learn.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/mrtk2/features/ux-building-blocks/solvers/solver?view=mrtkunity-20

HandTracking

  • https://www.youtube.com/watch?v=BKJ6sjJ9oao&ab_channel=RyanXR
  • https://learn.microsoft.com/en-us/dotnet/api/microsoft.mixedreality.toolkit.utilities.trackedhandjoint?view=mixed-reality-toolkit-unity-2020-dotnet-2.6.0
  • https://learn.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/mrtk2/features/input/hand-tracking?view=mrtkunity-2022-05

3d object

  • https://www.youtube.com/watch?v=VpllBs22rHU&list=LL&index=7&t=217s&ab_channel=AqsaNadeem

นาย พันธุ์ธัช ลิขิตบัณฑูร 63340500040
รับผิดชอบส่วน สร้าง Moddle และ การออกแบบเกม
นาย รณกร เมฆวิมานลอย 63340500051
รับผิดชอบส่วน server และ การออกแบบเกม