holodepth

Three.js · Etkileşim · Güvenlik ve UX

Kısıtlar ve sınırlar: görünmez bariyerler neden şart?

Kontrol kısıtları, kullanıcının serbestliğini kırmak için değil; navigasyon hatalarını ve «boşlukta kaybolma» anlarını azaltmak için konulan emniyet kemeri gibidir. İyi kurgulanmış bir 3B deneyimde kamera, tasarımcının korumak istediği okuma çerçevesini bilinçli olarak terk etmez — bu sayfa bu çerçevenin üç eksenini ve bir üst seviye dinamik örneğini özetler.

Kısıtların işleme katmanındaki yeri için Kontrol mantığı · kısıtlar ve kararlılık bölümüne bakın; burada özellikle hangi tür sınırın hangi kontrolde nasıl göründüğü ve neden ürün algısını doğrudan etkilediği öne çıkar.

Bölümler: Constraints Lab, açısal sınırlar, zoom ve mesafe, konumsal alan, UX gerekçeleri, dinamik bariyerler.

Constraints Lab — katman katman hisset

Aşağıdaki tuval, Kontrol mantığı · Control Lab ile aynı fikri tekrar etmez: mevcut Orbit / Fly düşüncesini koruyup yalnızca kısıt katmanlarını (polar, mesafe bandı, AABB, ışın bariyeri) üst üste denersiniz. Fly’da tuvali tıklayınca imleç kilitlenir; Orbit’te sürükleyin, tekerlek yakınlaştırır.

Constraints Lab: önce adım adım (polar → mesafe → kutu → ışın), sonra Hepsi ile tüm katmanlar bir arada.

İsteğe bağlı yükleme. Üstteki adımlar aynı anda her şeyi açmaz — öğrenme katman katmandır. Orbit: sürükle + tekerlek. Fly (4. adım ve «Hepsi»): tıkla → kilit → WASD, E/Space, Q/Shift.

Açısal kısıtlar: polar ve azimuth

Dönüş kısıtları, kameranın kendi ekseni veya hedef etrafında ne kadar süzülebileceğini tanımlar. Polar (dikey) ve azimuth (yatay) kanalları ayrı düşünmek ayarları okunur kılar: biri «zeminin altına düşme» riskini, diğeri «arka cepheye kaçma» riskini yönetir. Bu ayrımı korumak önemlidir çünkü aynı hatayı iki kanal birden «toplam açı»yla kesmek, kullanıcıya hangi eksende takıldığını hissettirmez ve şikâyetleri yanlış ayara yönlendirir.

  • Polar açı: Tam tepe veya tam dip bakışları mimari ve ürün vitrinlerinde sık görülmez; zeminin altından bakmak ise clipping ve ters yüz (backface) hissini artırır. Pratikte alt sınır küçük pozitif bir radyanla (ör. yaklaşık 0,1 rad civarı — sahneye göre ince ayar) «zemine yapışma» boşluğu bırakılır; üst sınır ise gökyüzüne ya da boş arka plana kilitlemek için kullanılabilir. Sınırı seçerken yalnızca geometriye değil ışık yönüne de bakın: alçak güneş veya tek spotlu vitrinlerde «biraz daha yukarıdan» bakış anlatımı bozulabilir; bu durumda polar bandını daraltmak yerine ışığı veya hedefi yeniden konumlandırmak daha az sürtüşmeli bir çözüm olabilir.
  • Azimuth: Tek cepheyi anlatmak istediğinizde yatay dönüşü dar bir yelde tutmak, kullanıcıyı istemeden binanın arkasına veya hassas IP’nin yan yüzeylerine sürüklemeyi engeller. Bu, kısıtlama değil anlatım disiplini olarak da düşünülebilir. Dar azimuth bazen «duvara çarpıyorum» hissini doğurur; tam açı serbest bırakılıp varsayılan başlangıç açısı veya kısa bir «ön cepheye dön» düğmesi ile toparlama sunmak, ürün politikasına göre daha az cezalandırıcı olabilir — özellikle keşif bekleyen kitelerde.

Üretimde sık görülen tuzak: kullanıcı FPS mantığıyla dünya ekseninde dönerken orbit polarını düşünmek — iki dünya farklı referans çerçeveleri kullanır; bu yüzden hangi kontrol ailesinde olduğunuzu netleştirmek, limitlerin «mantıklı» görünmesinin ön koşuludur (Orbit · Fly · FPS · karar). Three.js OrbitControls tarafında polar/azimuth sınırları doğrudan parametrelerle gelir — API tablosu ve jest akışı için OrbitControls · üç sütun ve özellikle Rotate alt başlığına bakın; bu sayfada odak, parametre isimlerinden çok sınır seçiminin tasarım diline etkisidir.

Zoom ve mesafe: yakın ve uzak «duvar»

Mesafe limitleri, kullanıcının nesneye ne kadar yaklaşıp ne kadar uzaklaşabileceğini belirler. Alt ve üst uçlar birlikte düşünüldüğünde sahne ölçeğine göre okunabilir bir derinlik bandı oluştururlar. Bu bandı seçerken göz önünde bulundurun: yakın uç yalın geometriyi korumazsa yakın düzlem (near plane) ile birlikte iç yüzeyler yine kesilebilir — min mesafe ile near plane’i aynı tasarım kararı olarak ele almak sık atlanan bir eşleştirmedir.

  • Minimum mesafe (minDistance): Kameranın mesh içine «batmasını», kesit düzlemlerinin ani sıçramasını ve ince geometriler arasında sıkışmayı azaltır — özellikle yüksek poligon yoğunluğunda profesyonellik algısını korur. İnce detaylı ürünlerde (saat camı, mücevher taşı) kullanıcı yakınlaşmak ister; tamamen kilitlemek yerine son santimetrelik mesafeyi güvenli bir «durak» olarak bırakmak hem tatmin hem görüntü bozulmasını dengeler.
  • Maksimum mesafe (maxDistance): Nesnenin ekranda tek bir nokta gibi küçülüp bağlamını kaybetmesini önler; aynı zamanda çok geniş panoramalarda kullanıcıyı «sonsuz boşlukta» bırakma riskini düşürür. Uzak uç seçilirken arka plan da hesaba katılmalıdır: HDRI veya dev bir zemin düzlemi varsa kullanıcı uzaklaştıkça boşluk hissi azalır; sınırsız uzaklıkta ise ana nesne kaybolup sahne «harita gibi» okunur.

Yörünge kontrollerinde bu çift genelde doğrudan özellik olarak sunulur — ayrıntı için OrbitControls · Zoom. Projeksiyon türü değiştiyse (örneğin ortografik yakınlaştırma) mesafe yerine zoom katsayısı üzerinden benzer bir band tanımlamanız gerekebilir; mantık yine aynıdır: kullanıcıya anlamlı bir görüş çeperi vermek. Hedef (target) kaydıran bir pan davranışınız varsa mesafe limitleri ile hedefin sahne içinde kalması birlikte çözülmeli; aksi halde kamera yasal mesafede kalsa bile nesne çerçevenin kenarına sıkışabilir.

Konumsal sınırlar: kutu ve Y kilidi

Bazı deneyimlerde yalnızca açı yetmez; kameranın dünya uzayında hangi hacimde gezinebileceği de sabitlenir. Bu, özellikle serbest uçuş ve birinci şahıs gezintilerde taslak bir fizik alanı oluşturur. Kutuyu dünya ekseninde mi yoksa odanın yerel ekseninde mi tanımladığınız, özellikle dönmüş bir maket veya eğik zeminde fark edilir; yanlış çerçevede kutu «duvara paralel» durmayıp kullanıcıyı köşede sıkıştırır.

  • Kutu kısıtları (AABB benzeri): Pozisyonun her ekseni için minimum ve maksimum seçilir; güncellemeden sonra Math.min / Math.max ile veya vektör bileşen bazında kırpma (clamp) uygulanır. Böylece sahne sınırlarının dışına «kaçan» kamera tek karede geri çekilir. Ani kesme yerine çok hafif bir sönüm ile sınıra yaklaşırken hızı düşürmek, «manyetik duvar» hissini azaltır (tam matematik Damping sayfasında). Kutunun köşelerinde takılma yaşanırsa çözüm genelde kutuyu büyütmek değil, çarpışma veya süpürme ile bir sonraki bölümdeki dinamik bariyerlere geçmektir.
  • Y ekseni kilidi: Mimari turda göz hizasını sabitlemek, kullanıcının kontrol hatasıyla gökyüzüne fırlamasını veya zeminin altına süzülmesini engeller. Merdiven ve rampa senaryolarında tam kilidi gevşetmek veya küçük bir geçiş bandı tanımak sık pratik çözümdür. İleri düzeyde Y’yi zeminden örnekleme (raycast ile ayak yüksekliği) ile sürmek, kilidi korurken katlar arası geçişe izin verir — bunun maliyeti ve ayar yükü sabit Y’den yüksektir.

Birinci şahıs ve fly akışlarında bu konuların bağlamı için Fly / FPS · birinci şahıs sayfasına köprü kurabilirsiniz; kontrol ailesi seçimi ise Orbit · Fly · FPS özetinde tartışılır. Transform ile nesne taşıyan düzenlerde kutu kısıtları kameraya değil seçili objeye uygulanır — ikisini karıştırmamak editorial netlik sağlar (TransformControls girişine bakın).

Neden kısıtları ürün dilinde savunmalıyız?

Kısıtlar teknik bir «kolaylık» değil; kullanıcıyı bilinçli bir görüş rejiminde tutma kararıdır. Üç sık görülen motivasyon:

  • Clipping ve ters yüz: Modele fazla yaklaşıldığında kesit düzlemi ani sıçrar; bazı malzemelerde ters yüzler veya artefaktlar görünür — deneyim «demo» hissinden çıkar. Burada kısıtlama tek başına yetmezse malzeme tarafında çift taraflı gösterim veya ek iç geometri kararı gerekebilir; kısıt ise kullanıcıyı bu uç durumlara sık sık düşürmeyi engeller.
  • Oryantasyon kaybı: Sahnenin görsel çeperi dışına çıkan kullanıcı nerede olduğunu toparlamakta zorlanır; en kötü senaryoda sayfayı yenilemek tek çıkar yol gibi görünür. Kısıtlar bu kaçışları azaltır. Tasarım ekleri olarak mini harita, «eve dön» jesti veya kısa bir intro ile başlangıç çerçevesini hatırlatmak, limitleri gevşetmiş olsanız bile toparlanmayı hızlandırır — tuzak analizi için Orbit · Fly · FPS · tuzaklar sayfasına bakın.
  • Performans ile ilişki: Kamerayı makul bir hacimde tutmak, bazı projelerde etkin görüş hacmini tahmin etmeyi kolaylaştırır ve içerik ekibinin LOD / yükleme planını netleştirir — fakat motor düzeyinde otomatik kümelemenin tek başına garanti edildiğini varsaymayın; optimizasyon genelde ayrı bir katmandır. Kısıtlar burada «otomatik culling düğmesi» değil, tasarım ve içerik planını birbirine kilitleyen sözleşme gibidir.

Girdi tarafında çelişen komutları çözümlemek için Input mapping; yumuşak ama sınırsız hareket yerine kontrollü süzülme için Damping ile birlikte düşünmek işe yarar — ikisi kısıtların «sert duvar» hissini dengeleyebilir. Erişilebilirlik notu: ani duruşlar vestibüler hassasiyeti artırabilir; sınırda keskin sekme yerine kısa easing, aynı güvenlik bandını daha az agresif sunar — detay yine damping ve easing tarafında işlenir, burada yalnızca ürün kararı olarak hatırlatılır.

Dinamik bariyerler: ışın ve küre metaforları

Sabit kutunun ötesinde, kamera hareketinden önce sahneyi örnekleyen bir katman ekleyebilirsiniz — bu, duvarları soyut bir kutuda değil, kabaca «katı yüzey» gibi ele alır. Hangi katmanların (layers) ışına dahil edileceğini ve hangi mesh’lerin «duvar» sayılacağını netleştirmek; zemini duvara, UI düzlemini fiziksel çarpaşa karıştırmamak üretimde sık yapılan düzeltmedir.

  • İşın bariyeri (raycast): İstenen yer değiştirme yönünde kısa bir ışın atılır; çarpışma varsa hareket o mesafede kesilir veya kaydırılır. Tek eksenli kesmede köşelerde «tık» hissi oluşabilir; yüzey normallerine göre kaydırmalı düzeltme (slide) eklemek ilk iyileştirmedir. Üç.js tarafında temel kavramlar için Işın temeli · Raycaster sayfasına bakın.
  • Küre çarpışanı (sphere collider): Kamerayı içinde hayali bir küre taşıdığınızı düşünün; yüzeylere yaklaşınca küçük bir itme veya kaydırmalı düzeltme uygulanır — özellikle dar koridorlarda sabit kutu yerine daha doğal bir kayma verir. İnsan gövdesini kabaca temsil etmek için küre yerine kapsül (capsule) seçmek merdiven başlarında daha az sıkışma sağlar; maliyet ve kod karmaşıklığı artar.