Hareket Bulanıklığı için Nesne Alanına Işın Dönüşümü


12

Işın izleyicim çok çeşitli nesneleri destekler. Onları kesişmek için ışınları nesne boşluğuna dönüştürme standart tekniğini kullanıyorum. Hareket bulanıklığı ekleyene kadar bu harika çalışıyor.

Hareket bulanıklığını bir yerine bir dönüşüm dizisi (tartışmayı basitleştirmek için tam olarak iki diyelim) olarak modelliyorum. Benim yaklaşımım ışığın her iki anahtar karede ters dönüşümünü almak ve pozisyonları / yönleri lerp.

Bu çeviriler için işe yarıyor gibi görünüyor, ama rotasyonlar için çöküyor. Örneğin, 30 ve 90 derece rotasyona uğrayan iki üçgen:

rotation1
(4 örnek, MN rekonstrüksiyonu, kırmızı örnekler iki ana karenin yanından geldi)

Köşelerde, kesilen örneklerin iki köşe arasında düz bir çizgi üzerinde durmasını beklerdim. Bunun yerine, dışarı doğru şişerler. Bu yanlış. Daha ilginç dönüşümlere sahip daha ilginç sahnelerde, çeşitli hata modlarına neden olur. Örneğin, 45 rotasyondan geçen bir pervane:

dönme 2
(100 örnek, normaller görselleştirildi)

Bazı problemler BVH kırılmasından kaynaklanır (nesnelerin ekstrüzyonunun anahtar karelerde yattığını varsayar), ancak kaba bir kuvvet oluşturma bile yanlıştır.

Tüm bunları sadece ileri dönüşümler yaparak (ışını değil, nesneyi dönüştürerek) düzeltebilirim, ancak bu sadece mümkün olan nesneler için çalışır (sadece üçgenler, gerçekten).


Işın izleyicimin nesneleri değil, ışınları dönüştürerek dönüşüme (özellikle dönmeye) doğrusal yaklaşımlar üretmesini nasıl sağlayabilirim?

Yanıtlar:


7

Ana kareler arasındaki ışın konumlarının / yönlerinin belirtilmesi, ana kareler arasındaki ters matrislerin döndürülmesine ve lerped matris tarafından dönüştürülmesine eşdeğer olmalıdır. Sorun, anahtar karelerin farklı dönüşleri varsa, bu matris genel olarak kesme, düzgün olmayan ölçek vb.İle "garip" bir şey olacaktır.

Kesişme ve gölgeleme rutinlerinizin bazıları, bu tür çarpık bir koordinat sisteminde düzgün çalışmazsa, onları bu tür durumlara karşı özel olarak test etmeden ve sertleştirmediyseniz şaşırmam. (Örneğin, iki birim vektörün nokta ürününü almak, kesilmiş koordinat sisteminde ortonormal olanla aynı yanıtı vermez.)

Bu sadece bir tahmindir, ancak çeviri, döndürme ve ölçeğin (varsa) ayrı ayrı döndürüldüğü (döndürme kısmı için kuaterniyonlar kullanarak) ve yeniden birleştirilen bir enterpolasyon yöntemi seçerseniz daha iyi sonuç verebilir.


İleri dönüştürülmüş nesneyi döndürmenin, geri dönüştürülmüş ışını döndürmeyle aynı olduğundan emin misiniz? Örneğin, lerp'den sonra ışını yeniden düzenleyebilirim (ve vuruş mesafesini buna göre ölçeklendirebilirim). Bu sonucu değiştirmez.
imallett

@imallett Işınların tersine çevrilmesi, ters matrislerin döndürülmesine eşdeğer olmalı, ancak ileri matrislerin döndürülmesine veya nesnenin döndürülmesine mutlaka eşit olmamalıdır (tersine çevirme doğrusal bir işlem değildir). Ve lerp şeyleri tamamen düzelttikten sonra ışını yeniden normalleştirmeyi düşünmüyorum - yine de kavşak rutinlerinizdeki matematiği vidalayabilen makaslanmış, tekdüze ölçekli bir koordinat sisteminde olabilirsiniz.
Nathan Reed

[Bkz. Düzenleme; En azından, renormalizasyonun kavşaktaki problemleri dışlaması gerektiğini düşünüyorum - ama ben de öyle düşünmüştüm; ışını döndürmek nesneyi döndürmemektedir. Cevabınızda TRS lerping [ters?] Ve sonra yeniden birleşmeyi önermiştiniz. Üretim renderers böyle mi yapıyor?
imallett

3

AFAICS, oldukça doğrusal olmayacağını düşünmüyorum, oldukça doğrusal olmayan bir enterpolasyona tek bir doğrusal yaklaşım, ama belki de Gribel ve arkadaşlarının rasterleştirmede hareket bulanıklığıyla ilgili bu makale / sunum yardımcı olabilir.


Bunu oldukça tipik olan doğrusal bir yaklaşıma ayırıyorum. Bu tür birden çok adımla daha karmaşık dönüşümler yapılabilir.¶ Sorunum, dönüşümü doğrusal olmayan hale getirmek değil, doğrusal yaklaşımı doğru yapmaktır.
imallett
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.