Aracılığıyla paylaş


Çözücüye genel bakış — MRTK2

Çözücü Ana

Çözücüler, önceden tanımlanmış bir algoritmaya göre nesnenin konumunu ve yönlendirmesini hesaplama araçlarını kolaylaştıran bileşenlerdir. Bir örnek, kullanıcının bakış ışın yayınını şu anda isabet eden bir nesneyi yüzeye yerleştirmek olabilir.

Ayrıca Çözücü sistemi, bileşenler için güncelleştirme sırasını Unity'ye belirtmenin güvenilir bir yolu olmadığından, bu dönüşüm hesaplamaları için bir işlem sırasını belirleyici bir şekilde tanımlar.

Çözücüler, nesneleri diğer nesnelere veya sistemlere eklemek için çeşitli davranışlar sunar. Diğer bir örnek, kullanıcının önüne (kameraya göre) gelen bir etiket boyunca nesne olabilir. Çözücü, denetleyici boyunca nesne etiketi oluşturmak için bir denetleyiciye ve nesneye de eklenebilir. Tüm çözücüler güvenli bir şekilde yığılabilir, örneğin etiketle birlikte davranış + yüzey manyetizma + ivme.

Çözücü kullanma

Çözücü sistemi üç betik kategorisinden oluşur:

  • Solver: Tüm çözücülerin türetilen temel soyut sınıfı. Durum izleme, düzeltme parametreleri ve uygulaması, otomatik çözücü sistem tümleştirmesi ve güncelleştirme sırası sağlar.
  • SolverHandler: İzlenmesi gereken başvuru nesnesini ayarlar (ör. ana kamera dönüşümü, el ışınları, vb.), çözücü bileşenlerinin toplanmasını işler ve güncelleştirme işlemini uygun sırada yürütür.

Üçüncü kategori çözücüdür. Aşağıdaki çözücüler temel davranış için yapı taşları sağlar:

  • Orbital: Belirtilen konuma kilitler ve başvuruda bulunan nesneden uzaklık.
  • ConstantViewSize: Başvuruda bulunan nesnenin görünümüne göre sabit bir boyut korumak için ölçeklendirilir.
  • RadialView: Nesneyi başvuruda bulunan nesne tarafından oluşturulan bir görünüm konisi içinde tutar.
  • Follow: Nesneyi, başvuruda bulunan nesnenin kullanıcı tanımlı sınırları kümesi içinde tutar.
  • InBetween: bir nesneyi izlenen iki nesne arasında tutar.
  • SurfaceMagnetism: dünyadaki yüzeylere ışınları atar ve nesneyi bu yüzeye hizalar.
  • DirectionalIndicator: Bir nesnenin konumunu ve yönünü yön göstergesi olarak belirler. SolverHandler İzlenen Hedefinin başvuru noktasından, bu gösterge sağlanan DirectionalTarget'e doğru yönlendirilir.
  • Momentum: Diğer çözücüler/bileşenler tarafından taşınan bir nesne için momentum ve springiness simülasyonu yapmak için hızlandırma/hız/sürtünme uygular.
  • HandConstraint: Nesneyi, GameObject ile eller arasında kesişmeyen bir bölgede ellerin takip etmelerini kısıtlar. Menüler gibi el ile kısıtlanmış etkileşimli içerik için kullanışlıdır. Bu çözücü, IMixedRealityHand ile çalışmak üzere tasarlanmıştır, ancak IMixedRealityController ile de çalışır.
  • HandConstraintPalmUp: HandConstraint'ten türetilir, ancak etkinleştirmeden önce avuç içi kullanıcıya dönük olup olmadığını test etmek için mantık içerir. Bu çözücü yalnızca IMixedRealityHand denetleyicileriyle çalışır, diğer denetleyici türleriyle birlikte bu çözücü aynı temel sınıfı gibi davranır.

Çözücü sistemini kullanmak için, yukarıda listelenen bileşenlerden birini bir GameObject'e eklemeniz yeterlidir. Tüm Çözücüler bir SolverHandlergerektirdiğinden Unity tarafından otomatik olarak oluşturulur.

Not

Çözücüler sisteminin nasıl kullanılacağına ilişkin örnekler SolverExamples.scene dosyasında bulunabilir.

İzleme başvurularını değiştirme

Bileşenin SolverHandler İzlenen Hedef Türü özelliği, tüm çözücülerin algoritmalarını hesaplamak için kullanacağı başvuru noktasını tanımlar. Örneğin, basit SurfaceMagnetism bir bileşene sahip bir değer türüHead, kafadan ve kullanıcının hangi yüzeye isabet edileni çözmek için bakış yönünde bir raycast ile sonuçlanır. Özelliğin TrackedTargetType olası değerleri şunlardır:

  • Baş : Referans noktası ana kameranın dönüşümüdür
  • ControllerRay: Referans noktası, çizgi ışınının LinePointer yönüne işaret eden bir denetleyicideki dönüşümdür (yani hareket denetleyicisinde veya el kumandasında işaretçi başlangıcı)
    • Teslim tercihini TrackedHandedness seçmek için özelliğini kullanın (yani Sol, Sağ, Her İkisi)
  • HandJoint: Başvuru noktası, belirli bir el ekleminin dönüşümüdür
    • Teslim tercihini TrackedHandedness seçmek için özelliğini kullanın (yani Sol, Sağ, Her İkisi)
    • TrackedHandJoint Kullanılacak ortak dönüşümü belirlemek için özelliğini kullanın
  • CustomOverride: Atanandan başvuru noktası TransformOverride

Not

Hem ControllerRay hem de HandJoint türleri için çözücü işleyicisi, ilk önce sol denetleyici/el dönüşümünü sağlamaya çalışır ve önceki kullanılabilir değilse veya özellik aksini belirtmediği sürece TrackedHandedness sağa doğru geçiş yapmaya çalışır.

Çözücü İzlenen NesnesiHer TrackedTargetType ile ilişkili çeşitli özellikler örneği

Önemli

Çözücülerin çoğu tarafından sağlanan izlenen dönüşüm hedefinin ileri vektörünü SolverHandlerkullanır. El Eklemi izlenen hedef türü kullanılırken, avuç ekleminin ileri vektörleri avuç içinden değil, parmaklardan işaret edebilir. Bu, el birleştirme verilerini sağlayan platforma bağlıdır. Giriş simülasyonu ve Windows Karma Gerçeklik için, avuç içine işaret eden yukarı vektördür (yani yeşil vektör yukarı, mavi vektör ileri).

Yukarı İlet vektör

Bunun üstesinden gelmek için 90, 0,> 0 üzerindeki SolverHandler <Ek Döndürme özelliğini güncelleştirin. Bu, çözücülere sağlanan ileri vektörlerin avuç içinde ve elinin dışına doğru işaret etmesini sağlar.

Ek Döndürme

Alternatif olarak, ellerle işaret etmede benzer davranışlar elde etmek için Denetleyici Ray izlenen hedef türünü kullanın.

Çözücüleri zincirleme

Aynı GameObject'e birden çok Solver bileşen eklemek ve böylece algoritmalarını zincirleme mümkündür. Bileşenler, SolverHandler aynı GameObject üzerindeki tüm çözücülerin güncelleştirilmesini işler. Varsayılan olarak Başlat'taki SolverHandler çağrılar GetComponents<Solver>() Çözücüleri denetçide göründükleri sırayla döndürür.

Ayrıca, Güncelleştirilmiş Bağlı Dönüşüm özelliğini true olarak ayarlamak, hesaplanan konumunu, yönlendirmesini ve ölçeğini tüm Çözücüler tarafından erişilebilen bir aracı değişkene (yani GoalPosition) kaydetmeyi bildirirSolver. False olduğunda, Solver GameObject'in dönüşümünü doğrudan güncelleştirir. Dönüştürme özelliklerini bir ara konuma kaydeden diğer Çözücüler, ara değişkenden başlayarak hesaplamalarını gerçekleştirebilir. Bunun nedeni Unity'nin gameObject.transform güncelleştirmelerinin aynı çerçeve içinde yığın haline getirmesine izin vermemesidir.

Not

Geliştiriciler, özelliği doğrudan ayarlayarak SolverHandler.Solvers Çözücülerin yürütme sırasını değiştirebilir.

Yeni bir çözücü oluşturma

Tüm çözücüler soyut temel sınıfından devralmalıdır. Solver Çözücü uzantısının birincil gereksinimleri yöntemi geçersiz kılmayı SolverUpdate içerir. Bu yöntemde, geliştiricilerin devralınan GoalPositionve GoalRotation GoalScale özelliklerini istenen değerlere güncelleştirmeleri gerekir. Ayrıca, tüketici tarafından istenen başvuru çerçevesi olarak kullanmak SolverHandler.TransformTarget genellikle değerlidir.

Aşağıda sağlanan kod, ekli nesneyi önüne 2m SolverHandler.TransformTargetyerleştiren adlı InFront yeni bir Çözücü bileşeni örneği verir. SolverHandler.TrackedTargetType tüketici tarafından olarak HeadSolverHandler.TransformTarget ayarlanırsa, kamera dönüşümü olur ve bu nedenle bu Çözücü ekli GameObject 2m'yi kullanıcıların her kareye bakışlarının önüne yerleştirir.

/// <summary>
/// InFront solver positions an object 2m in front of the tracked transform target
/// </summary>
public class InFront : Solver
{
    ...

    public override void SolverUpdate()
    {
        if (SolverHandler != null && SolverHandler.TransformTarget != null)
        {
            var target = SolverHandler.TransformTarget;
            GoalPosition = target.position + target.forward * 2.0f;
        }
    }
}

Çözücü uygulama kılavuzları

Ortak çözücü özellikleri

Her Çözücü bileşeni, çekirdek Çözücü davranışını denetleen özdeş özelliklerden oluşan bir çekirdek kümesine sahiptir.

Düzeltme etkinleştirilirse, Çözücü zaman içinde GameObject'in dönüşümünü hesaplanan değerlere aşamalı olarak güncelleştirir. Bu değişikliğin hızı, her dönüştürme bileşeninin LerpTime özelliği tarafından belirlenir. Örneğin, daha yüksek bir MoveLerpTime değeri kareler arasındaki harekette daha yavaş artışlara neden olur.

MaintainScale etkinleştirilirse, Çözücü GameObject'in varsayılan yerel ölçeğini kullanır.

Çekirdek Çözücü Özellikleri
Tüm Çözücü bileşenleri tarafından devralınan ortak özellikler

Orbital

Orbital sınıfı, bir güneş sistemindeki gezegenler gibi davranan bir etiket boyunca bileşendir. Bu Çözücü, ekli GameObject'in izlenen dönüşüm etrafında yörüngede olmasını sağlayacaktır. Bu nedenle, öğesinin SolverHandler İzlenen Hedef Türü olarak ayarlanırsa HeadGameObject, sabit bir uzaklık uygulanmış olarak kullanıcının kafasının etrafında döner.

Geliştiriciler, menüleri veya diğer sahne bileşenlerini göz düzeyinde veya bel düzeyinde vb. tutmak için bu sabit uzaklığı değiştirebilir. Bu, Yerel Uzaklık ve Dünya Uzaklığı özellikleri değiştirilerek yapılır. Yönlendirme Türü özelliği, nesnenin özgün döndürmesini sürdürmesi veya konumunu yönlendiren dönüştürme vb. her zaman kamera ya da yüzle yüzleşmesi gerekiyorsa nesneye uygulanan döndürmeyi belirler.

Yörünge Örneği
Yörünge örneği

RadialView

RadialView, GameObject'in belirli bir bölümünü kullanıcının görünümünün frustum içinde tutan başka bir etiket boyunca bileşenidir.

En Düşük ve En Yüksek Görünüm Dereceleri özellikleri, GameObject'in bir bölümünün her zaman görünümde ne kadar büyük olması gerektiğini belirler.

Min ve Max Distance özellikleri, GameObject'in kullanıcıdan ne kadar uzak tutulması gerektiğini belirler. Örneğin, 1m Min Mesafe ile GameObject'e doğru yürümek, kullanıcıya asla 1m'den daha yakın olmaması için GameObject'i uzaklaştırır.

Genellikle, RadialView bileşenin kullanıcının bakışını takip edebilmesi için Head İzlenen Hedef Türü ile birlikte kullanılır. Ancak, bu bileşen herhangi bir İzlenen Hedef Türünün "görünümünde" tutulabilir.

RadialView Örneği
RadialView örneği

İzleme

sınıfı, Follow izlenen hedefin önüne yerel ileri eksenine göre bir öğeyi konumlandırıyor. öğe, izlenen hedef kullanıcı tanımlı sınırların ötesine taşınana kadar takip edilmeyecek şekilde gevşek bir şekilde kısıtlanabilir (etiketle birlikte).

RadialView çözücüye benzer şekilde çalışır ve En Fazla Yatay ve Dikey Görünüm Derecesini yönetmeye yönelik ek denetimler ve nesnenin Yönlendirmesini değiştirmeye yönelik mekanizmalar içerir.

Özellikleri izleme
Özellikleri izleme

Örnek sahneyi izleyin
Örnek Sahneyi Takip Edin (Assets/MRTK/Examples/Demos/Çözücüler/Sahneler/FollowSolverExample.unity)

InBetween

sınıfı, InBetween bağlı GameObject'i iki dönüşüm arasında tutar. Bu iki dönüşüm uç noktası, GameObject'in kendi SolverHandler İzlenen Hedef Türü ve bileşenin InBetween İkinci İzlenen Hedef Türü özelliği tarafından tanımlanır. Genellikle, her iki tür de CustomOverride olarak ayarlanır ve sonuçta elde SolverHandler.TransformOverride edilen değerler ve InBetween.SecondTransformOverride izlenen iki uç noktaya ayarlanır.

Çalışma zamanında bileşen, InBetween İkinci İzlenen Hedef Türü ve İkinci Dönüşüm Geçersiz Kılma özelliklerini temel alan başka bir SolverHandler bileşen oluşturur.

, PartwayOffset iki dönüşüm arasındaki çizgi boyunca nesnenin orta olarak 0,5, ilk dönüşümde 1,0 ve ikinci dönüşümde 0,0 olarak yerleştirileceği yeri tanımlar.

InBetween Örneği
Nesneyi iki dönüşüm arasında tutmak için InBetween çözücü kullanma örneği

SurfaceMagnetism

Yüzeylerin SurfaceMagnetism belirli bir LayerMask'ine karşı bir raycast gerçekleştirerek ve GameObject'i bu temas noktasına yerleştirerek çalışır.

Surface Normal Ofset, GameObject'i yüzey üzerindeki isabet noktasında normal yönde yüzeyden metrelerce uzağa yerleştirecektir.

Buna karşılık, Surface Işın Uzaklığı GameObject'i yüzeyden metrelerce uzağa ancak gerçekleştirilen ışın yayınının ters yönüne yerleştirecektir. Bu nedenle, ışın yayını kullanıcının bakışıysa, GameObject yüzeydeki isabet noktasından kameraya doğru daha yakın hareket eder.

Yönlendirme Modu, yüzeydeki normale göre uygulanacak döndürme türünü belirler.

  • Yok - Döndürme uygulanmadı
  • TrackedTarget - Nesne, raycast'i yönlendiren izlenen dönüşümle karşılaşacak
  • SurfaceNormal - Nesne, yüzeydeki isabet noktasında normale göre hizalanır
  • Karıştırılmış - Nesne, yüzeydeki isabet noktasındaki normale göre hizalanır VE izlenen dönüşüme göre hizalanır.

İlişkili GameObject'i Yok dışında herhangi bir modda dikey kalmaya zorlamak için Yönlendirmeyi Dikey Tut'a tıklayın.

Not

Yönlendirme Modu Blended olarak ayarlandığında döndürme faktörleri arasındaki dengeyi denetlemek için Orientation Blend özelliğini kullanın. 0,0 değeri tamamen TrackedTarget modu tarafından yönlendirilecek ve 1,0 değeri tamamen SurfaceNormal tarafından yönlendirilen yönlendirmeye sahip olacaktır.

SurfaceMagnetism Örneği

Hangi yüzeylerin isabet edilebileceğini belirleme

Bir GameObject'e bileşen eklerken, herhangi bir SurfaceMagnetism harmanlama varsa GameObject katmanını ve alt öğelerini dikkate almak önemlidir. Bileşen, "mıknatısın" hangi yüzeye karşı olduğunu belirlemek için çeşitli türlerde ışın yayınları gerçekleştirerek çalışır. Çözücü GameObject'in özelliğinde MagneticSurfaces SurfaceMagnetismlistelenen katmanlardan birinde bir collider varsa, raycast büyük olasılıkla gameObject'in kendi harmanlama noktasına bağlanmasına neden olur. Bu garip davranış, ana GameObject ve tüm alt öğeleri Raycast'i Yoksay katmanına ayarlayarak veya LayerMask dizisini MagneticSurfaces uygun şekilde değiştirerek önlenebilir.

Buna karşılık, GameObject SurfaceMagnetism özelliğinde MagneticSurfaces listelenmeyen bir katmandaki yüzeylerle çarpışmaz. Genel olarak istenen tüm yüzeylerin ayrılmış bir katmana (yani Surface'lar) yerleştirilip özelliğin MagneticSurfaces yalnızca bu katmana ayarlanması önerilir. Varsayılanı veya her şeyi kullanmak kullanıcı arabirimi bileşenlerinin veya imleçlerin çözücüye katkıda bulunmalarına neden olabilir.

Son olarak, özellik ayarından MaxRaycastDistance daha uzak olan yüzeyler ışın yayınları tarafından SurfaceMagnetism yoksayılır.

DirectionalIndicator

DirectionalIndicator sınıfı, kendisini uzayda istenen noktanın yönüne yönlendiren etiket boyunca bir bileşendir.

En yaygın olarak, öğesinin İzlenen Hedef Türü SolverHandler olarak ayarlandığında Headkullanılır. Bu şekilde, çözücüye DirectionalIndicator sahip bir UX bileşeni kullanıcıyı uzayda istenen noktaya bakmaya yönlendirir.

İstenen boşluk noktası, Yön Hedefi özelliği aracılığıyla belirlenir.

Yön hedefi kullanıcı tarafından görüntülenebilirse veya içinde SolverHandlerhangi başvuru çerçevesi ayarlandıysa, bu çözücü altındaki tüm Renderer bileşenleri devre dışı bırakır. Görüntülenmiyorsa, göstergede her şey etkinleştirilir.

Göstergenin boyutu, kullanıcının FOV'sindeki Yön Hedefi'ni yakalamaya yaklaştıkça küçülür.

  • En Düşük Gösterge Ölçeği - Gösterge nesnesi için en düşük ölçek

  • En Yüksek Gösterge Ölçeği - Gösterge nesnesi için maksimum ölçek

  • Görünürlük Ölçek Faktörü - Yön Hedefi noktasının görüntülenebilir olup olmadığını belirleyen FOV'yi artırmak veya azaltmak için çarpan

  • Görünüm Uzaklığı - Başvuru çerçevesinin bakış açısından (kamera olabilir) bu özellik, nesnenin görünüm penceresinin merkezinden ne kadar uzak olması gerektiğini gösterge yönünde tanımlar.

Yön Göstergesi özellikleri
Yön Göstergesi özellikleri

Yön Göstergesi örnek sahnesi
Yön Göstergesi Örnek Sahnesi (Assets/MRTK/Examples/Demos/Çözücüler/Sahneler/DirectionalIndicatorSolverExample.unity)

HandConstraint ve HandConstraintPalmUp içeren el menüsü

El Menüsü UX Örneği

Bu davranış, HandConstraint izlenen nesneyi el ile kısıtlanmış içerik (el kullanıcı arabirimi, menüler vb.) için güvenli bir bölgeyle kısıtlayan bir çözücü sağlar. Güvenli bölgeler el ile kesişmeyecek alanlar olarak kabul edilir. Avucu kullanıcıya dönük olduğunda çözücü izlenen nesnesini etkinleştirmeye yönelik yaygın bir davranışı göstermek için türetilmiş bir adlı HandConstraintPalmUp sınıfı HandConstraint da eklenir.

El menüleri oluşturmak için El Kısıtlaması çözücü kullanma örnekleri için lütfen El Menüsü sayfasına bakın.

Ayrıca bkz.