Çözücüye genel bakış — MRTK2
Çö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 SolverHandler
gerektirdiğ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)
- İletim
- 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
- İletim
- 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ü İzlenen Örneği
Önemli
Çözücülerin çoğu tarafından sağlanan izlenen dönüştürme 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 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).
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çinden ve yandan dışa 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
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 GoalPosition
ve GoalRotation
GoalScale
ö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.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ışı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.
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 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 ö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
İ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
Ö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.
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.
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 MagneticSurfaces
SurfaceMagnetism
listelenen 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 Head
kullanı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 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'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 Örnek Sahnesi (Assets/MRTK/Examples/Demos/Çözücüler/Sahneler/DirectionalIndicatorSolverExample.unity)
HandConstraint ve HandConstraintPalmUp içeren el menüsü
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.