Unity3D'de bir portalda seyahat ederken iki kamera nasıl karıştırılır


18

Soruma gelmeden önce, en belirgin çözümün normalleştirilmiş görünüm bağlantı noktası rectini kullanmak olacağını biliyorum, ancak bir dikdörtgenden daha karmaşık şekillere ihtiyacım var ve görünüm bağlantı noktası rectini kullanmaya baktım ve öyle görünmüyor benim çözümüm ol.

EDIT: Bazı insanlar benim sorum karıştı, biraz daha ayrıntıya girmeme izin verin. resim açıklamasını buraya girin Oyuncu bir portala girdiğinde, bir klon FPS denetleyicisi oluşturuyorum ve diğerinden çıkarıyorum. Bu bana iki kamera ve yukarıdaki sağda gördüğünüz görünümü veriyor. Sadece bir kamera gösteriyor ve portaldan geçiyor. İstediğim benzer bir şeydir bukameraların düzgün bir geçiş yanılsaması yaratmak için karıştığı yer. Yapmak istediğim, aşağıdaki resimde yeşil denetleyici görüntüsünün solundaki her şeyi silmek ve bunu diğer kamera ile değiştirmek. Bu şekilde, kamera A'nın portaldan zirveye ulaşan görüşünün bir bölümünü elde edersiniz, kamera B'nin görüşünün diğer portaldan zirveye çıkan kısmı ile karıştırılır ve tam bir görüntü elde edilir. Ve portalda ilerledikçe kesim uygun şekilde değişir.

Bir portal sistemi tasarlıyorum, oyuncunun portalda sorunsuz bir şekilde hareket etmesini sağlamak da dahil olmak üzere her şeyim var. Benim asıl sorun şimdi Camera'nın fotoğraf makinesi efektini elde etmek. Kafanızı portalın içinden geçiriyormuşsunuz gibi sorunsuz bir şekilde bir araya gelmek için iki kameraya ihtiyacım var. Ve bu sadece bir dikdörtgen olamaz, aynı zamanda oyuncunun portaldan bakması gerekir.

Şu andaki en iyi ipucum, muhtemelen her portalın arkasına bir derinlik maskesi gölgelendiricisi yansıtmak, sonra seyahat ettiğiniz portaldan kamerayı sadece derinlik yapmaktır. Sonra bir şekilde iki kamerayı karıştırın. Benim asıl sorun tam olarak bunu nasıl yapacağımı bulmak, ikinci kamera sadece portal dışında neler render yapmak ve geri kalanı bir tam ekran projeksiyon almak için varsayılan 1 kamera yapmak.

Bana fikir verebilir veya muazzam bir yardım olacak derinlik maskesi gölgeleyici ile bunu nasıl yapabileceğimi açıklayabilirseniz. Ben bu konuda çalışmaya devam edeceğim ve mola verirken güncelleme.


5
"Kamera harmanlama efekti Valve'in ne yaptığını" açıklayabilir misiniz? Portalda tek bir kamera oluşturmanın yeterli olduğunu anladım. Birinci şahıs oyunlarında oynatıcıya bağlıdır ve oyuncu ile birlikte portaldan geçerken otomatik olarak yeni konuma dönüştürülür. Portal efektini oluşturmak için sahnenin dönüştürülmüş bir kopyası oluşturulur. Bu, ikinci bir kamera ile de yapılabilir, ancak bu kameralar arasında karıştırmaya gerek olmamalıdır.
msell

1
Görsel efektlerim zaten mükemmel. Yapmaya çalıştığım şey, portalda yürümenin etkisini nasıl elde edeceğinizi bulmak. Zaten tüm karakter grafiklerine sahibim ve böyle düzgün hareket ediyorum, sadece birinci şahıs perspektifinden pürüzsüz görünmesi gerekiyor.
Timothy Williams

1
Eminim birçok kişi sorunun ne olduğunu anladığında size yardımcı olmak ister. Sorunu daha iyi açıklamanız, belki de resim veya hatta neyin yanlış olduğunu görselleştiren bir video eklemeniz gerekir.
msell

2
Efektin örnek videosuna bir bağlantı ekleyebilir misiniz?
Mike Baxter

2
Yalnızca bir kamera / FPS denetleyicisi kullandıysanız ne olur? Kamera portalda hareket ettiğinde, yeni konuma ve yöne dönüştürebilirsiniz. Portal oluşturma işlemi doğruysa, geçiş sorunsuz olmalı ve karıştırma gerektirmemelidir.
msell

Yanıtlar:


6

Sorunu Anlamak

Açıkladığınız sorunu görebildiğim kadarıyla, kameranın yakın düzlemin portal tarafından tanımlanan düzlemle kesişmesinin sonucu. Bu kavşak meydana gelirken, duvarın arkasında portalın açık olduğunu görebilirsiniz.

Bu, oyuncu sadece sudan su altına geçiş yaparken diğer oyunlarda yaşanan bir soruna benzer . Kamera suyun hemen üzerindeyse, oyuncular görünümünü gizlemek için hiçbir işlem sonrası efekt uygulanmaz (karanlık ve bulanık ve mavi yapın). Dolayısıyla, yakın uçağın tabanı suyun hemen altındaysa oyuncu su altında açıkça görebilir.

Doğruysam, projeksiyon matrisini tanımlarken bu düzlemin konumunu değiştirerek doğrulayabilirsiniz. Kamera başlangıç ​​noktasından yakın düzleme olan mesafe arttıkça, sorun da artmalıdır.

Kolay Çözüm

Yakın düzlemi kameraya çok yakın hale getirmek bu sorunu neredeyse ortadan kaldırmalıdır. Bu çözüm tam bir çözüm değildir, ancak vakaların büyük çoğunluğunda yeterince iyi bir sonuç verir ve etkilidir.

Tam Çözüm

Sadece yakın düzlemi kameraya yaklaştırmak tatmin edici değilse, sahneyi oynatıcı ve portal perspektifinden oluşturarak oluşturulan görüntüleri karıştırmak için bir "maske" oluşturabilirsiniz.

Portalların yalnızca düz yüzeylere uygulanmasına izin verdiğinizi varsayarsak, kameranın yakın düzlemi ile portal (veya üzerinde bulunduğu duvar) tarafından tanımlanan düzlem arasındaki kesişme çizgisini hesaplayabilirsiniz. Bu çizgi ekranı iki parçaya böler. Ekran pikselinin çizginin hangi tarafında olduğunu belirlemek, hangi render görüntüsünün kullanılacağını, portal görüntüsünü veya oynatıcı kamera görüntüsünü size bildirir.

Bu sorun ortaya çıkarsa, kamera görünümü frustumunun tamamen portal içinde olması gerektiğini, böylece kavşak çizgisinin her zaman bir ekran kenarından diğerine tamamen kesileceğini unutmayın.

Bu bağlantı hattı bulmak için matematik ile yardımcı olacaktır. Aşağıdaki kod kabaca doğru olmalıdır.

Kavşak çizgisi, çizgi üzerindeki bir nokta ve çizgi yönü kullanılarak tanımlanır. Kavşak yönünün altında, portalın normal çarpımı ve kamera görüş yönü (normal düzlemin yakınında) kullanılarak hesaplanır. Çizgi üzerindeki bir nokta, yakın düzlemdeki bir noktadan doğrudan portal düzlemine doğru (normal portal boyunca) bir ışın verilerek ve kesişim noktasını bularak verilir.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

ViewDir öğesinin bir birim vektör olduğundan emin olun. portalVert1, 2 ve 3, portal etiketi veya üzerinde bulunduğu yüzey için kullanılan 4 köşeden yalnızca 3'üdür. Portalın bulunduğu düzlemi tanımlamanın başka yolları da vardır, ancak bunun en kolay ulaşılabilir bilgi olduğunu varsayıyorum.

Kavşak çizgisini tanımlamak için bu iki vektöre sahip olduğunuzda, her biri görünümle çarpılır ve ardından projeksiyon matrisleri ekran alanına alınır.

Daha sonra bu görüntüleri karıştırmak için bir işlem sonrası gölgelendiricisi kullanabilirsiniz. Geçerli pikselin bölme çizgisinin hangi tarafında bulunduğunu belirleyerek her pikselde hangi görüntünün kullanılacağını seçersiniz. Bu, piksel konumu (aynı zamanda oluşturma hedefi teknesini aramak için kullandığınız konumdur) ve yaparak yapılır;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

Taraf, d'nin 0'dan daha fazla veya daha az olup olmadığıyla verilir. Tam olarak 0 ise, o zaman hatta olursunuz.

Matematik üzerine referans için yukarıya bakınız bu .

Bu yöntem, portal perspektifinden oluşturulmadan önce kullanılmak üzere bir derinlik maskesi / şablon tamponu oluştururken de kullanılabilir. Tam ekran dörtlü oluşturabilir ve çizgiyi dilimlemek için kullanabilirsiniz.


Yakın klip düzlemi iyi bir fikirdi, ama tam olarak aradığım şey değildi. Bu ikinci bölüm ilginç bir yaklaşım. Şu anda, mevcut portal düzleminin arkasındaki her şeyde bir derinlik maskesi gölgelendiricisi kullanıyorum, ardından mevcut kameranın net bayraklarını yalnızca derinliğe ayarlıyorum. Böylece, çıkış kamerasının portaldan zirveye çıkan herhangi bir kısmı ekranda çizilir ve giren kamera derinlik maskesini çeker, böylece her kameranın zirveye çıkan kısımlarını karıştırarak bir görüntü oluşturur ilgili portal. Tek sorun bazı küçük kırpma sorunları alıyorum ve gibi
Timothy Williams

oyuncu dolaşırken hafif bir pislik. Ortaya koyduğunuz bu fikir oldukça umut verici. Temel olarak yapmam gereken şey, ekran boyunca çizgiyi, kameranın düzlemi ve portal düzleminin kesiştiği yerde hesaplamak, yön bana çizginin hangi yöne gittiğini verir ve nokta çizginin çeşitli noktalarıdır. Daha sonra bir gölgelendiricide / komut dosyasında bir pikselin bölme çizgisinin hangi tarafına yerleştirileceğini nasıl belirleyebilirim?
Timothy Williams

Bazı temel kodları vermek için cevabı biraz güncelledim. Sorunu onaylamak için kırpma düzlemi mesafesinin yakınındaki görünümü değiştirmeyi denediğinizden emin olun. Bunu mümkün olduğunca küçük yapmak da yeterli olabilir. Unutmayın, çalışmasını sağlayın, doğru çalışmasını sağlayın, ardından hızlı çalışmasını sağlayın.
OriginalDaemon


Yakın kırpma düzlemi mesafesini değiştirmeyi test ettim, sorunu biraz daha iyi hale getirdi, ancak Mell'in yayınladığı gibi, sorunların giderilmesi sırasında sorunu çözmediğini belirtti. Yine de kavşak çizgisinin işe yarayabileceğini hissediyorum, bu yüzden deneyeceğim. Mell'in yayınladığı makaleye biraz daha bakacağım. Sonunda derinlik maskesinin daha hızlı mı yoksa bu kavşak çizgisinin mi daha hızlı olduğuna inecek
Timothy Williams

3

Önerilen cevaplar çok iyiydi, ama sonunda derinlik maskesi kullanarak farklı bir teknik kullanıyordum.

Ne yapmak almak olduğunu BU senaryo ve shader, kendi sahnesinde oluşturucuyla her nesne üzerinde senaryoyu koymak ve 3020 render kuyruğunu ayarlayın (daha sonra kolay bu hale getirmek için bir komut dosyası göndeririz).

Ardından, bir kutu uçak oluşturursunuz (hepsi içe dönük, resimde size en yakın kutunun yanını göremezsiniz, ancak kutunun içindeyken, portallarınızın İKİ arkasında) böyle: resim açıklamasını buraya girin Ve onları kendi özel bir katmanına yerleştirdim (benim için "DepthMask" ı seçtim), sonra üzerlerinde gölgelendirici olan bir malzeme eklersiniz. resim açıklamasını buraya girin

Daha sonra ana kamerayı alıp özel katmanınızın işaret maskesinden (DepthMask katmanının işaretini kaldırdım) işaretini kaldırırsınız ve derinliğini 0 olarak ayarlarsınız. resim açıklamasını buraya girin

Ardından kamerayı ışınlarken ve klonlarken, diğer kameranın açık bayraklarını "Yalnızca Derinlik" olarak ayarlayın ve derinliği 1 olarak ayarlayın. resim açıklamasını buraya girin

Ardından, iki kamera görünümü arasında kesintisiz bir ekran elde edersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.