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

Çözücü Ana

Çözücüler, önceden tanımlanmış bir algoritmaya göre nesnenin konumunu & yönlendirmesini hesaplama araçlarını kolaylaştıran bileşenlerdir. Örneğin, 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, unity'ye bileşenler için güncelleştirme sırasını belirtmenin güvenilir bir yolu olmadığından, bu dönüştürme hesaplamaları için bir işlem sırasını belirlenimci olarak tanımlar.

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

Çö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: İzlenecek başvuru nesnesini ayarlar (ör. ana kamera dönüşümü, el ışını, vb.), çözücü bileşenlerinin toplanmasını işler ve güncelleştirmeyi uygun sırada yürütür.

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

  • Orbital: Belirtilen konuma ve başvuruda bulunan nesneden uzaklığı kilitler.
  • 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 nesneye göre bir görünüm konisi içinde yayınlar.
  • 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ı yayınlar ve nesneyi bu yüzeye hizalar.
  • DirectionalIndicator: Bir nesnenin konumunu ve yönünü yön göstergesi olarak belirler. SolverHandler İzlenen Hedefinin referans 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: GameObject'i ellerle kesişmeyen bir bölgede nesneleri 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ının karşı karşıya olup olmadığını test etmek için mantık içerir. Bu çözücü yalnızca IMixedRealityHand denetleyicileriyle çalışır ve 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 bir tane 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, başından 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ı, bir denetleyicideki (hareket denetleyicisi veya el kumandası üzerindeki işaretçi kaynağı) hat rayının yönünü gösteren dönüşümdür LinePointer
    • İletim TrackedHandedness tercihini seçmek için özelliğini kullanın (ör. Sol, Sağ, Her İkisi)
  • HandJoint: Başvuru noktası, belirli bir el ekleminin dönüşümüdür
    • İletim TrackedHandedness tercihini seçmek için özelliğini kullanın (ör. 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 önce sol denetleyiciyi/el dönüşümünü sağlamayı dener, sonra da önceki kullanılabilir değilse veya özelliği aksini belirtmediği sürece TrackedHandedness sağa.

Her TrackedTargetType ile ilişkili çeşitli özelliklerin Çözücü İzlenenNesne Örneği

Önemli

Çözücülerin çoğu tarafından sağlanan izlenen dönüştürme 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 eklem verilerini sağlayan platforma bağlıdır. Giriş simülasyonu ve Windows Mixed Reality için, avuç içine işaret eden yukarı vektördür (yeşil vektör yukarı, mavi vektör ileri).

Yukarı İletme vektör

Bunun üstesinden gelmek için 90, 0,> 0 üzerindeki<SolverHandlerEk Döndürme özelliğini güncelleştirin. Bu, çözücülere sağlanan ileri vektörlerin avuç içinden ve yandan dışa 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

Bu nedenle algoritmalarını zincirleyerek aynı GameObject'e birden çok Solver bileşen eklemek mümkündür. Bileşenler, SolverHandler aynı GameObject üzerindeki tüm çözücülerin güncelleştirilmesini işler. Varsayılan olarak Başlangıç ekranındaki 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ğlantılı Dönüşüm özelliğini true olarak ayarlamak, hesaplanan konumunu, yönlendirmesini & ölçeğini tüm Çözücüler tarafından erişilebilen bir ara değişkene (örneğinGoalPosition) 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 aynı çerçeve içinde yığmak için gameObject.transform güncelleştirmelerine 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ştiriciler devralınan GoalPositionve GoalRotationGoalScale özelliklerini istenen değerlere güncelleştirmelidir. 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ışı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ında daha yavaş hareket artışlarına neden olur.

MaintainScale etkinse, Çö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 dolanır.

Geliştiriciler bu sabit uzaklığı değiştirerek menüleri veya diğer sahne bileşenlerini göz düzeyinde veya bel düzeyinde vb. bir kullanıcı etrafında tutabilir. Bu, Yerel Uzaklık ve Dünya Uzaklığı özellikleri değiştirilerek gerçekleştirilir. Yönlendirme Türü özelliği, nesneye uygulanan döndürmeyi, orijinal döndürmesini sürdürmesi veya her zaman konumuna yön vermekte olan bir dönüşümle veya kamerayla yüzleşmesi gerekiyorsa belirler.

Orbital Örneği
Orbital örnek

RadialView

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

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

Minimum & Maksimum Uzaklık özellikleri, GameObject'in kullanıcıdan ne kadar uzak tutulması gerektiğini belirler. Örneğin, 1m Min Uzaklığı 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ı izlemesi 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 bir öğeyi izlenen hedefin önüne yerel ileri eksenine göre konumlandırıyor. Öğe, izlenen hedef kullanıcı tanımlı sınırların ötesine geçinceye kadar takip edilmeyecek şekilde gevşek bir şekilde kısıtlanabilir (etiketle birlikte).

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

Özellikleri izleme
Özellikleri izleme

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

Inbetween

sınıfı, InBetween ekli GameObject'i iki dönüşüm arasında tutar. Bu iki dönüştürme 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 ve InBetween.SecondTransformOverride değerler 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 İki 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'i üzerinde bir raycast gerçekleştirerek ve GameObject'i bu temas noktasına yerleştirerek çalışır.

Surface Normal Ofset, GameObject'i yüzeydeki isabet noktasındaki normal yönde, yüzeyden metre uzakta bir mesafeye yerleştirir.

Buna karşılık, Surface Ray Ofset , GameObject'i yüzeyden metre uzakta ancak gerçekleştirilen ışın yayınının ters yönünde belirli bir mesafeye yerleştirir. 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.

  • Hiçbiri - 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 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 ModuBlended 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önlendirilmiş 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'in ve alt öğelerinin katmanını göz önünde bulundurmak önemlidir. Bileşen, kendini "mıknatısla" karşı hangi yüzeye karşı belirlemek için çeşitli türlerde ışın yayınları gerçekleştirerek çalışır. Çözücü GameObject'in özelliğinde MagneticSurfacesSurfaceMagnetismlistelenen katmanlardan birinde bir çarpıştırıcı varsa, raycast büyük olasılıkla kendi kendine isabet eder ve bu da GameObject'in kendi harmanlama noktasına bağlanmasına neden olur. Bu garip davranış, ana GameObject ve tüm alt öğeleri Raycast katmanını yoksay olarak 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. İstenen tüm yüzeylerin ayrılmış bir katmana yerleştirilmesi ( surfaces) ve özelliğin MagneticSurfaces yalnızca bu katmana ayarlanması genellikle önerilir. Varsayılan veya her şeyin kullanılması, kullanıcı arabirimi bileşenlerinin veya imleçlerin çözücüye katkıda bulunmalarına neden olabilir.

Son olarak, özellik ayarından daha MaxRaycastDistance uzaktaki yüzeyler raycast'lar tarafından SurfaceMagnetism yoksayılır.

DirectionalIndicator

DirectionalIndicator sınıfı, kendisini uzayda istenen bir 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ı istenen boşluk noktasına bakmaya yönlendirir.

Boşlukta istenen nokta 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'sinde 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 minimum ö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 ortasından 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

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ştirmenin yaygın bir davranışını 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.