Çözücüye genel bakış — MRTK2
Çö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 SolverHandler
gerektirdiğ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)
- Teslim tercihini
- 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
- Teslim tercihini
- 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.
Her 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ü SolverHandler
kullanı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).
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.
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 GoalPosition
ve 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.TransformTarget
yerleştiren adlı InFront
yeni bir Çözücü bileşeni örneği verir. SolverHandler.TrackedTargetType
tüketici tarafından olarak Head
SolverHandler.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.
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 Head
GameObject, 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
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
İ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
Ö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.
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.
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
SurfaceMagnetism
listelenen 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 Head
kullanı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 SolverHandler
hangi 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 Ö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. 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.