3B Nesne Düzenleme

Bu öğreticide Unity ile yaptığınız oyunların ve uygulamaların kullanıcı arabirimini zenginleştirmek için hareket ve iskelet girişi kullanma konusu tanıtılacaktır. El hareketleri tarafından denetlenen bir 3B imleç oluşturacağız. Sahnedeki nesneleri seçmek ve 3B alanda taşımak için bu imleci kullanacağız.

Bu öğreticinin tamamlanması yaklaşık 30 dakika sürer.

Nihai Sonucu İndir

Bu öğreticide elde edilen unity projesinin son bölümüne GitHub'daki açık kaynak örnek depomuzdan ulaşabilirsiniz. Depoyu kopyaladıktan sonra uygulamayı çalıştırmak için şu adımları izleyin:

  1. Unity'yi başlatın, Projeler sekmesinde Aç'ı seçin.
  2. Kopyalanan depodaki Unity\Tutorials\3D Nesne Düzenleme dizinine göz atın.
  3. Sahneyi çalıştırmak için yürüt düğmesine (veya Ctrl+P) basın.

Önkoşullar

Bu öğreticide, C# programlama dili hakkında temel bilgilere ve Unity ortamıyla ilgili bazı deneyimlere sahip olduğunuz varsayılır. Unity projeleri, sahneleri, oyun nesneleri ve betikleri oluşturmayı bildiğinizi varsayıyoruz.

Bu öğreticiye başlamadan önce Giriş öğreticisini tamamlamanızı öneririz. Burada ele alınan Unity prefabs için Project Prag araç setini bildiğinizi varsayıyoruz.

1. Adım - Sahne Hazırlığı

  1. Bu öğreticiye 3B Nesne İşleme - Sahne Hazırlama öğreticisinde elde edilen sahneyle başlıyoruz. Bu sahne, nesnelerin üzerine gelmenizi, nesneleri "yakalamanızı" ve uzayda yeni bir konuma taşımanızı sağlayan fare denetimli bir imleç içerir. Geçerli öğreticimizde, hareketler ve hareketler için fareyi değiştireceğiz ve imleci kontrol etmek için elimizi kullanacağız.

    Lütfen 3B Nesne İşleme - Sahne Hazırlama öğreticisini tamamlayın veya son ürününü edinmek için bu yönergeleri izleyin. 3B Nesne İşleme - Sahne Hazırlama öğreticisinin, Unity için Prag Projesi araç seti ile ilgili hiçbir malzemeyi kapsamadığını ve bunu atlayabilirsiniz.

  2. Unity'de , 3B Nesne İşleme - Sahne Hazırlama öğreticisinde oluşturulan son projeyi yükleyin. 3B Nesne Düzenleme sahnesini oynatın. Fareyi kullanarak nesneleri alıp taşıyabileceğinizden emin olun:

    Alma ve taşıma yönergeleri

    3. adımda, eli kullanarak bir nesneyi (yukarıdaki şekilde 2 numara) sürüklemeyi, 4. adımda ise eli kullanarak bir nesneyi kameraya (yukarıdaki şekilde 3 numara) taşımayı öğreneceğiz.

2. Adım - El İmleci

  1. GesturesManager ve UIManager prefablerini sahneye ekleyin (MicrosoftGesturesToolkit\Prefabs'tan). Hareketler Hizmeti ile iletişim kurmak için bu önkoşulları kullanacağız. Daha fazla ayrıntı için giriş öğreticisinin 2. adımına bakın.

  2. İmleci elinizle kontrol etmek için öncelikle el iskeleti bilgilerine erişim elde etmemiz gerekir. Hareket Hizmeti bir el iskeletini hesaplar ve bunu tüm abone istemcilere çerçeveler temelinde iletir. Sahnemizdeki GesturesManager oyun nesnesi , Gestures Hizmeti'nin istemcisi olarak görev yapar. GesturesManager'ınRegisterToSkeleton() ve UnregisterFromSkeleton() yöntemleri, el iskeleti akışına abone olmamızı ve abonelikten çıkmamızı sağlar.

    İmleç oyunu nesnesi etkin olduğunda el iskeleti bilgilerini almak istiyoruz. Lütfen Cursor betiğine OnEnable() ve OnDisable() yöntemleri için aşağıdaki uygulamayı ekleyin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

  3. Şimdi Hareket Hizmeti'nden gelen avuç içi konumunu, diğer iskelet bilgilerle birlikte ayıklayacağız. Ekrandaki İmleç konumunu hesaplamak için avuç içi konumunu kullanacağız.

    El iskeleti, aşağıdaki sol elle kullanılan koordinat sisteminde milimetre cinsinden sağlanır:

    El iskeleti koordinat sistemiKoordinat sistemi eksenlerini göstermek için burada bir RealSense™ kamerası kullandık. Aynı koordinat sisteminin Project Prag tarafından desteklenen tüm derinlik kameraları için de geçerli olduğunu unutmayın.

    İdeal olarak, sahnemizdeki Ana Kamera'nın elinizi gözlerinizin perspektifinden görmesini istiyoruz. Bunu başarabilirsek - 3B imlecin ekrana yansıtması, doğal hissettiren bir şekilde elinizi izler.

    İstenen perspektifi tahmin etmek için aşağıdaki katsayıları kullanarak el iskeletini (derinlik kamerasının görünüm alanında verilmiştir) 3B imleçle ( Ana Kameranın görünüm alanında ifade etmek istiyoruz) eşleyeceğiz. Bu genel üyeleri Cursor.cs dosyasına ekleyin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

    Bu eşlemenin, aslında milimetreden santimetreye birim dönüştürme olan 10 kat ölçeği azaltma işlemi de gerçekleştirdiğini unutmayın. İmleç konumunun dinamik aralığının sahnemizdeki nesnelerin boyutuna uygun olmasını istediğimizden (1-10 Unity biriminin büyüklüğü sırasına göre) bunu yaparız.

    Bu hazırlıkla, avuç içi konumunun imleç konumuna gerçek dönüştürmesini hesaplamaya hazırız. Cursor betiğine GetPalmCameraPosition() yöntemini ekleyin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

    GetPalmCameraPosition() içinde SmoothDefaultSkeleton özelliğinin kullanıldığına dikkat edin. Bu özellik, şu anda derinlik kamerası tarafından görülen el iskeletinin düzgünleştirilmiş bir sürümünü sağlar. Düzeltme, son birkaç karede alınan iskeletlerin ortalaması ile elde edilir. Ortalama için kullanılan çerçeve sayısını denetleyebilirsiniz. Denetçi penceresinde GesturesManager'ı inceleyin ve Kesintisiz Hareketli Ortalama Pencere Boyutu alanını değiştirin.

    İskeletinPalmPosition özelliğinin, elin merkezinin konumuna karşılık geldiğini unutmayın:

    Palmiye konumu yer işareti

  4. GetCursorScreenPosition() öğesini aşağıdaki içeriklerle değiştirin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

  5. Hareketler Hizmeti'nin çalıştığından emin olun. Sahneyi oynatın ve derinlik kamerasının önüne iki elinizi de getirin. İmleci elinizi hareket ettirerek denetleyebiliyor olmanız gerekir.

3. Adım - Hareketleri Kullanarak Nesneyi Alma ve Taşıma

Şimdi bir hareket ekleyecek ve bu hareketi kullanarak imleci "tutma modu"na girmek ve bırakmak üzere tetikleyeceğiz. Yakalama modundayken, kapılmış nesne imleci (elinizi takip eder) izler ve yeni bir konuma taşımanızı sağlar.

  1. Proje penceresinde, MicrosoftGesturesToolkit\Prefabs altındaki GestureTrigger prefab öğesini bulun. Sahnenizde yeni bir GestureTrigger oyun nesnesi oluşturmak için hiyerarşi penceresine sürükleyip bırakın.

  2. Denetçi penceresinde GestureTrigger oyun nesnesini inceleyin, XAML Hareketi radyo düğmesini seçin, Hareket XAML bölümünü genişletin ve aşağıdaki hareket tanımını yapıştırın:

    <Gesture Name="GrabReleaseGesture"
             xmlns="http://schemas.microsoft.com/gestures/2015/xaml">
        <Gesture.Segments>
            <IdleGestureSegment Name="Idle" />
            <HandPose Name="InitSpreadPose">
                <PalmPose Context="{AnyHand}" Direction="Forward|Down" />
                <FingerPose Context="Index, Middle, Ring, Pinky" Flexion="Open" />
            </HandPose>
            <HandPose Name="GrabPose">
                <PalmPose Context="{AnyHand}" />
                <FingerPose Context="Index, Middle, Ring, Pinky" Flexion="Folded" />
            </HandPose>
            <HandPose Name="FinalSpreadPose">
                <PalmPose Context="{AnyHand}" />
                <FingerPose Context="Index, Middle, Ring, Pinky" Flexion="Open" />
            </HandPose>
        </Gesture.Segments>
        <Gesture.SegmentsConnections>
            <SegmentConnections From="Idle" To="Idle, InitSpreadPose" />
            <SegmentConnections From="InitSpreadPose" To="GrabPose" />
            <SegmentConnections From="GrabPose" To="FinalSpreadPose" />
            <SegmentConnections From="FinalSpreadPose" To="Idle" />
        </Gesture.SegmentsConnections>
    </Gesture>
    

    İşlem tamamlandığında GestureTriggerInspector görünümü şöyle görünmelidir:

    GrabReleaseGesture hareket tanımı

    İpucu

    Bir hareketin XAML gösterimini oluşturmak için bir C# hareketi nesnesi oluşturun ve ToXaml() yöntemini çağırın. C# dilinde hareket oluşturma hakkında bilgi edinmek için genel bakış sayfamızı ziyaret edin.

    GrabReleaseGesture, aşağıdaki durum makinesinde gösterildiği gibi 3 pozdan oluşur:

    GrabReleaseGesture

    Durum makinesi olarak hareket kavramı hakkında daha fazla bilgi edinmek için genel bakış sayfamızı ziyaret edin.

  3. GrabReleaseGesture'ı aşağıdaki şekilde kullanmak istiyoruz

    • GrabPose algılama, imlecin yakalama moduna girmesine neden olur; örneğin StartGrab() tetiklenmelidir.
    • Boşta algılama, imlecin yakalama modundan ayrılmasına neden olur; örneğin StopGrab() tetiklenmelidir.

    Not

    Boşta durumu her hareketteki ilk durumdur. Kullanıcı bir tamamlama hareketi gerçekleştirdikten veya yürütmesinin ortasında bir hareketi bırakırsa, durum makinesi boşta durumuna geri döner.

    Denetçi penceresinde GestureTrigger oyun nesnesini inceleyin ve Hareket Segmenti Olay Ekle Düğmesineiki kez basın. Bu, Segment #1 ve Segment #2 şeklinde iki yeni kullanıcı arabirimi (kullanıcı arabirimi) bölümü oluşturmalıdır.

     - In the **Segment #1** drop down list, select the **GrabPose** (1), then click the **+** sign in the **On Trigger ()** pane (2). Drag the **Cursor** object to the **None (Object)** box (3) and select the **Cursor → StartGrab()** method from the **No Function** drop-down list (4):
    
     ![GrabPose gesture trigger](Images/UnityGrabGestureTrigger.png)
    
     - In the **Segment #2** drop down list, select the **Idle** (1), then click the **+** sign in the **On Trigger ()** pane (2). Drag the **Cursor** object to the **None (Object)** box (3) and select the **Cursor → StopGrab()** method from the **No Function** drop-down list (4):
    
     ![Idle gesture trigger](Images/UnityIdleGestureTrigger.png)
    
  4. Sahneyi çalıştırın. Bu adımda eklediğimiz özelliği test edin:

    • İmleç içeren bir nesnenin üzerine gelin,
    • Elini yumrukla tutarak al.
    • Nesneyi yeni bir konuma taşıyın,
    • Parmaklarınızı birbirinden ayırarak nesneyi serbest bırakın.

4. Adım - Nesneyi Kameraya Veya Kameraya Taşıma

Bu adımda, kapılmış nesnenin radyal yönde hareket etmesini de etkinleştireceğiz.

  1. Aşağıdaki özel üyeyi Cursor.cs dosyasına ekleyin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

    Bir nesne her yakalanışında bu üyenin başlatılması gerekir. Bunu yapmak için StartGrab() yönteminin sonuna aşağıdaki satırı ekleyin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

  2. Cursor.cs dosyasındaki GetCursorDistanceCoefficient() yönteminin içeriğini aşağıdakilerle değiştirin:

    Uyarı

    Aradığınız örnek başka bir yere taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.

  3. Sahneyi çalıştırmayı deneyin. Bir nesne alın ve elinizi derinlik kamerasına doğru veya kameradan uzağa hareket ettirin. Sahnedeki nesne, sanal sahnede sırasıyla hareket eden elinizi izlemelidir.

    İpucu

    Elinizi derinlik kamerasına çok yakın tutmayın. Kamerada frustum şeklinde bir görüş alanı vardır. Elinizi yaklaştırdığınızda algılanabilir alan küçülerek sahnedeki nesneleri işlemek için daha az hareket aralığı sağlar.