Aracılığıyla paylaş


Çözücüler — MRTK3

Çözücü Ana

Çözücüler, önceden tanımlanmış bir algoritmaya göre nesnenin konumunu ve yönlendirmesini hesaplamayı kolaylaştıran bileşenlerdir. Örnek: Kullanıcının bakış raycast'in kesiştiği yüzeye bir nesne yerleştirme.

Çö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 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, kameraya göre kullanıcının önüne gelen etiket boyunca bir nesne olabilir. Bir çözücü, denetleyici boyunca nesne etiketini 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ış artı yüzey manyetizması ve ivme.

Nasıl kullanılır?

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

  • Solver: Tüm çözücülerin türetilen soyut temel 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: Başvuru nesnesi izlemeyi (örneğin: ana kamera dönüşümü, el ışınları vb.) ayarlar, çö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: Kısıtlamalar, GameObject'i ellerle kesişmeyen bir bölgede ellerin takip edilmesine neden olabilir. Menüler gibi el ile kısıtlanmış etkileşimli içerik için kullanışlıdır. Bu çözücü ile XRNodeçalışmak üzere tasarlanmıştı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 denetleyicilerle XRNode çalışır ve diğer denetleyici türleriyle aynı temel sınıfı gibi davranır.
  • Overlap: İzlenen nesneyle çakışıyor.

Çözücü sistemini kullanmak için yukarıda listelenen bileşenlerden birini GameObject'e ekleyin. 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 ışın döküme neden olur. Özelliğin TrackedTargetType olası değerleri şunlardır:

  • *Baş: Referans noktası ana kameranın dönüşümüdür
  • ControllerRay: Referans noktası, bir denetleyicide (yani, bir hareket denetleyicisinde veya el kumandasında işaretçi çıkış noktası) çizgi ışınının yönünü gösteren dönüşümdür LinePointer
    • 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 önce sol denetleyici/el dönüşümünü sağlamaya çalışır, sonra da eskisi kullanılamıyorsa veya özellik aksini belirtmediği sürece sağa doğru dönüştürmeyi TrackedHandedness dener.

Ö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ş benzetimi ve Windows Karma Gerçeklik için yukarı vektör avuç içinde yukarı doğru ilerler (başka bir deyişle yeşil vektör yukarı, mavi vektör ileri).

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

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üleri güncelleştirmeyi 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. Diğer Çözücüler, dönüştürme özelliklerini ara bir konuma kaydederek, 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 GoalPosition, GoalRotationve GoalScale özelliklerini istenen değerlere güncelleştirmelidir. Ayrıca, tüketici tarafından istenen başvuru çerçevesi olarak kullanmak SolverHandler.TransformTarget da değerlidir.

Aşağıda sağlanan kod, eklenen nesneyi önüne SolverHandler.TransformTarget2 m yerleştiren adlı InFront yeni bir Çözücü bileşeni örneği verir. Tüketici olarak ayarlar SolverHandler.TrackedTargetType Head, o zaman SolverHandler.TransformTarget kamera dönüşümü olacak ve böylece bu Çözücü ekli GameObject'i kullanıcıların her karesine bakışlarının önüne 2 m yerleştirecektir.

/// <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. Her dönüştürme bileşeninin LerpTime özelliği bu değişikliğin hızını belirler. Ö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.

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üşümün kameraya ya da yüze her zaman yüzleşmesi gerekiyorsa nesneye uygulanan döndürmeyi belirler.

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 Derecesi özellikleri, GameObject'in bir bölümünün ne kadarının her zaman görünümde olması gerektiğini belirler.

En Düşük ve En Fazla Uzaklık özellikleri, GameObject'in kullanıcıdan ne kadar uzak tutulması gerektiğini belirler. Örneğin, 1 m Min Mesafe ile GameObject'e doğru yürümek, kullanıcıya asla 1 m'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ü olarak ayarlanmış olarak kullanılır. Ancak, bu bileşen herhangi bir İzlenen Hedef Türünün "görünümünde" tutulabilir.

İ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 taşınana kadar izlememesi için gevşek bir şekilde kısıtlanabilir ("etiketle birlikte" olarak da bilinir).

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

InBetween

sınıfı, InBetween bağlı GameObject'i iki dönüşüm arasında tutar. GameObject'in kendi SolverHandler İzlenen Hedef Türü ve bileşenin InBetween İkinci İzlenen Hedef Türü özelliği bu iki dönüşüm uç noktasını tanımlar. Genel olarak, 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.

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

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

SurfaceMagnetism

Bu SurfaceMagnetism , belirli bir surface LayerMask üzerinde 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.

Örtüş

Overlap, nesnenin dönüşümünü dönüştürme hedefiyle aynı konumda ve döndürmede SolverHandler's tutacak basit bir çözücüdür.

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, kendisini "mıknatısla" hangi yüzeye karşı "mıknatısla" belirleyecek çeşitli ışın yayınları gerçekleştirerek çalışır. Çözücü GameObject'in özelliğinde listelenen katmanlardan birinde bir harmanlayıcı olduğunu MagneticSurfaces SurfaceMagnetismvarsayalım. Bu durumda, raycast büyük olasılıkla kendisine isabet eder ve GameObject'in kendi harmanlama noktasına bağlanmasına neden olur. Bu garip davranış, ana GameObject ve tüm alt öğeleri Ray'i Yoksay yayın 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. İstenen tüm yüzeyleri ayrılmış bir katmana (yani Surfaces) yerleştirmenizi ve özelliği yalnızca bu katmana ayarlamanızı MagneticSurfaces öneririz. 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 bir etiket boyunca bileşenidir. 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. Bu nokta Yön Hedefi özelliği tarafından belirlenir.

Yön hedefi kullanıcı tarafından görüntülenebilirse veya içinde SolverHandlerhangi başvuru çerçevesi ayarlanırsa, 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) ve gösterge yönünde, bu özellik nesnenin görünüm penceresinin merkezinden ne kadar uzakta olduğunu tanımlar.

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

HandConstraint ve HandConstraintPalmUp içeren el menüsü

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. Ayrıca, avuç içi kullanıcıya dönük olduğunda çözücü tarafından izlenen nesneyi etkinleştirmeye yönelik ortak bir davranışı göstermek için türetilmiş HandConstraint bir sınıfı HandConstraintPalmUp da eklenir.

El menüleri oluşturmak için El Kısıtlaması çözücüyü kullanma örnekleri için El Menüsü belgelerine bakın.