Babylon.js · XR
Controller input: dünya uzayında imleç artık fare değil
WebXR oturumu açıldığında girdi, çoğu zaman her el için bir giriş kaynağı ( input source) olarak gelir: takip edilen tutamak duruşu, düğme durumları ve çoğu cihazda bir gamepad düzeni. Bu sayfa «hangi düğme hangi fonksiyon» listesi değil; olayların semantiği, poz uzayı ile masaüstü varsayımlarından nasıl ayrıldığı ve Babylon sahnesinde nasıl düşünüleceği üzerinedir.
Holodepth Three.js tarafında benzer ihtiyaç çoğu zaman denetleyici yardımcıları veya özel raycaster ile anlatılır; burada motorun XR girdi soyutlaması ile uyumlu okuma önerilir — matematik ( pose, ışın) ortaktır, masaüstü pointer olayları doğrudan taşınmaz.
Özet: dört sapma riski
| Risk | Kaynak | Belirti |
|---|---|---|
| Sol/sağ varsayımı | Sol elin her zaman ilk dizinde olduğu varsayımı. | Etkileşim yan elle tetiklenir. |
| Fare hayaleti | click beklenen kod. | XR'de hiçbir şey seçilmiyor. |
| Ölçek | Birim karışıklığı. | Işın çok kısa veya metre ötesinde. |
| Tetik çözünürlüğü | Dijital düşünme. | Yumuşak sıkış eksik veya titreme. |
Giriş kaynağı ve el yüzü
WebXR tarafında her fiziksel kontrolcü, tarayıcının verdiği bir giriş kaynağı kaydıyla eşlenir; bu kaydın hangi ele ait olduğu ayrı bir meta alan olarak gelir ( handedness: sol, sağ veya henüz bilinmiyor). Buradaki tuzak, masaüstünde alışıldığı gibi «ilk eleman sol, ikincisi sağ» diye diziye güvenmektir: tek kontrolcü takılıyken sıra değişebilir, bazı oturumlarda yalnızca bir kaynak listelenir, üreticiye göre varsayılan el farklı olabilir. Bu yüzden mantığınızı kaynak kimliği veya el etiketi üzerinden kurun; dizin yalnızca listeyi dolaşmak için kullanılsın, anlam taşımasın.
Duruş ve hedef ışın
El yüzünü doğru eşledikten sonra asıl uzaysal soru şudur: kontrolcü bu karede nerede ve nereye bakıyor? Bu bilgi her karede güncellenen bir duruş ( pose) ile gelir; ondan türettiğiniz yarı doğruya hedef ışın ( aim ray) dersiniz. Işını sahneye taşırken hep aynı referansa bağlayın: tipik olarak kontrolcünün yerel uzayından dünya uzayına geçişte kullandığınız dönüşümle çarpılır; üst üste binen veya güncellenmeyen bir üst düğüm ( frame karışıklığı) seçiminizi sürekli kaydırır. Fizik veya isim eşleştirmeli sahne ışınları ( Raycast) için kullandığınız başlangıç noktası ve yön vektörü ile XR hedef ışınını mümkün olduğunca aynı yardımcıdan üretin; böylece girdi kaynağı XR olsa da masaüstü olsa da «hangi yüzeyle kesişti» sorusu tek matematikte kalır.
Başlangıç noktası
Üreticiler ışının çıkış noktasını aynı geometride vermez: birinde ışın neredeyse tutamacın ucundan çıkar, birinde bilek veya gövde ofsetiyle kayar. Uzunluk ve başlangıç ofsetini sahne ölçeğinize göre ayarlayıp birkaç cihazda denemeniz, seçim halkasının stabil görünmesi için genelde gereklidir; bu ayar bölüm 1’deki el kimliğinden bağımsız, saf geometri meselesidir.
Select, squeeze ve semantik olaylar
Uzaysal duruştan sonra kullanıcı niyetini taşıyan katman olaylardır. WebXR, mümkün olduğunca donanım düğmesi yerine anlamlı oturum olayları sunar; en tanıdık çift, seç ( select) ile sıkıştır ( squeeze)dır. Aynı fiziksel tetik bir cihazda düğme 0 iken başkasında farklı bir indekste olabilir; semantik ise «kullanıcı onayladı» veya «kullanıcı tutamacı sıktı» gibi sabit kalır. Uygulama mantığınızı mümkün olduğunca bu olaylara bağlamak, yeni kontrolcü profillerinde kırılmayı azaltır; ham düğme okumayı yalnızca gerçekten özel eşleme gerektiğinde kullanın.
- Select: genelde «onayla», «tıkla», «işaretle» eylemi; menüde öğe seçmek veya uzaktan bir hedefe odaklanmak için uygundur.
- Squeeze: tutamacı kavrama; nesneyi tutmak, sürüklemek veya üst gövdeye bağlı ikincil bir işaretçi açmak gibi süreli etkileşimlerde sık seçilir.
- Analog / sürekli eksenler: tetik veya başparmak sürüklemesi gibi 0–1 aralığında akan değerler; sıyırma, hız veya ince ayar için kullanılır. Burada küçük gürültü bile hissedilir; bölüm 4’teki dead zone düşüncesini bu eksenlere özellikle uygulayın.
Gamepad ve ölü bölge
XR olaylarından ayrı olarak, aynı donanım çoğu zaman klasik Gamepad API’siyle de okunabilir. Bu yol, WebXR oturumu kapalıyken veya özel bir eşleme yaparken işe yarar; fakat eksen sırası, düğme sayısı ve hassasiyet profil ve sürücüye göre değişir. Analog çubuk merkezde tam sıfırda durmaz, tetikler mikro titreşimle 0.02 gibi değerler üretebilir; bu yüzden yürüme veya dönüş gibi sürekli hareketi tek eksenden üretiyorsanız, okumadan önce küçük bir ölü bölge ( dead zone) uygulamak pratikte zorunluluktur. Bölüm 3’teki semantik olaylar donanım soyutlamasıdır; buradaki mesele ise aynı donanımın «ham sayı» yolunda gürültüyü bastırmaktır.
Masaüstü ile XR kod yolu ayrımı
Aynı sahneyi hem fare ve klavyeyle hem de başlık içinde göstermek, tek dev kod yolunda birleştirmeye meyillidir; bu da odak, imleç kilidi ve GUI önceliği gibi masaüstü kurallarının XR akışına sızmasına yol açar. Masaüstünde Control system benzeri bir öncelik sırası anlamlıyken, XR’de asıl girdi genelde denetleyici ışınları ve kafa duruşudur. Ortak işi — örneğin «vurulan nesne kim», «menü açık mı» — ince yardımcılarda toplayıp, girdi üretimini moda göre (masaüstü işaretçisi mi, XR kaynağı mı) ayırın. XR dalına girmeden önce WebXR setup ile oturumun gerçekten etkin olduğunu doğrulamak, fare kodunun yanlışlıkla boş duruşlarla çalışmasını engeller; bu bölüm uzaysal ışın matematiğini (bölüm 2) tekrar etmez, yalnızca mimari ayrımı vurgular.
Three.js ile üst üste okuma
Çakışmayı önleyen çerçeve
Three.js tabanlı örneklerde denetleyici modeli, yardımcı ışın ve düğme tepkileri çoğu zaman elle birleştirilir; Babylon.js ekosisteminde aynı ihtiyaçlar çoğu kez yerleşik WebXR yardımcıları ve sahne düğümleriyle karşılanır. Başka bir kütüphaneden geçerken kopyalamanız gereken şey tek bir satır kod değil, ışın üretimi + anlamlı olay dinleme + duruşu her kare güncelleme üçlüsünün sözleşmesidir. Sahne grafiğinde kontrolcü görselinin, ışının ve seçim mantığının hangi düğümün «gerçek» veri kaynağı olduğunu baştan seçin; aksi halde hem Babylon hem Three kalıplarını üst üste bindirip çift güncelleme veya çift ışın üretimiyle kendinizi çakıştırırsınız. Önceki bölümler bu üçlünün parçalarını ayrı ayrı anlatır; buradaki uyarı, taşıma sırasında sınırları netleştirmektir.
Sıradaki: sahne ile etkileşim
Girdi semantiği netleştikten sonra çift görüntü ve kare bütçesi tavanı için Performance constraints sayfasına geçebilirsiniz. Önceki adım: Raycast & collision.