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 hakkında bilgiler verilecektir. El hareketleri tarafından denetlenen bir 3B imleç oluşturacağız. Bu imleci sahnedeki nesneleri seçmek ve bunları 3B alanda taşımak için kullanacağız.

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

Nihai Sonucu İndirme

Bu öğreticide elde edilen unity projesinin son hali GitHub'daki açık kaynak örnekleri depomuzda bulunabilir. 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 oynat düğmesine (veya Ctrl+P) basın.

Önkoşullar

Bu öğreticide C# programlama dili hakkında temel bilgi sahibi olduğunuz ve Unity ortamıyla ilgili bazı deneyimler edindiğiniz 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, bunları "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 bunun yerine 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 Düzenleme - 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:

    Yönergeleri alma ve taşıma

    3. adımda, eli kullanarak bir nesneyi sürüklemeyi (yukarıdaki şekilde 2 numara), 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 ön adlarını sahneye ekleyin (MicrosoftGesturesToolkit\Prefabs'tan). Bu önkoşulları Hareket Hizmeti ile iletişim kurmak için 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. Hareketler Hizmeti bir el iskeletini hesaplar ve bunu tüm abone olan istemcilere kare kare 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 İmleç 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 Servisi'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 solak 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ı, elinizi doğal hissettiren bir şekilde takip eder.

    İ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 faktörüne göre ölçek azaltma işlemi de gerçekleştirdiğini unutmayın. Bunu yaparız çünkü imleç konumunun dinamik aralığının sahnemizdeki nesnelerin boyutuna (1-10 Unity biriminin büyüklüğü sırasına göre) uygun olmasını istiyoruz.

    Bu hazırlıkla, avuç içi konumunun imleç konumuna gerçek dönüştürmesini hesaplamaya hazırız. GetPalmCameraPosition() yöntemini İmleç betiğine 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 denetleyebilmelisiniz.

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

Şimdi bir hareket tanıtacak ve bunu kullanarak imleci "yakalama moduna" girmek ve bırakmak üzere tetikleyeceğiz. Yakalama modundayken, kapılan nesne imleci izler (elinizi takip eder) ve yeni bir konuma taşımanıza olanak sağlar.

  1. Proje penceresinde, MicrosoftGesturesToolkit\Prefabs altındaki GestureTrigger prefab'ını 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# hareket 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 lütfen genel bakış sayfamızı ziyaret edin.

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

    • GrabPose algılaması 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 harekette ilk durumdur. Kullanıcı bir tamamlama hareketi gerçekleştirse 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. Bu adımda eklediğimiz özelliği test edin:

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

4. Adım - Nesneyi Kameraya Doğru Veya Uzağa 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.