3D nesnenin dönüşümlerini değiştirmek için çeviri, ölçek, döndürme gizmosları nasıl uygulanır?


11

Temel bir 3D editör geliştirme sürecindeyim. 3D dünyası oluşturmak için OpenGL kullanır. Şu anda sahnem farklı boyutlarda birkaç kutu ve her bir kutuyu seçebileceğim ve daha sonra istediğim herhangi bir dönüşümü elde etmek için taşıyabiliyorum / ölçekleyebileceğim / döndürdüğüm sahnede.

Hem bu aracın gizmoslarının oluşturulmasını (veya tutamaçlarını veya insanların genellikle nasıl çağırdığını) hem de faremle dönüşümdeki değişikliği gerçekleştirmek için her eksenden seçerek sorunu nasıl çözebilirim? Açıklık için: resim açıklamasını buraya girin

Şimdiye kadar yaptığım araştırma, en temiz yaklaşımın gizmo'da ok başına bir eksen hizalı sınırlayıcı kutuya ve kare başına başka bir kareye (nesneyi tek bir eksen yerine bir düzlemde hareket ettirenlere) sahip olmak ve daha sonra fareden bir ışın yayınlamak olduğunu öne sürdü. konumlandırın ve neyle çarpıştığını görün. Ama bu hala benim için biraz fazla soyut, bu algoritmanın nasıl gideceğine dair daha fazla rehberliği takdir ediyorum (sözde kod fazlasıyla yeterli)


1
Genellikle fare konumu ile dünyaya doğru gidersiniz ve bir gizmoya çarpıp çarpmadığınızı görürsünüz. Ayrıca orada gizli algılama yapmak gizmo ekran alanına dönüştürebilirsiniz. Genellikle sadece ışın ile çizgi segmenti tür mesafe yapmak. Döndürme genellikle sanal bir parça topu olarak yapılır. Bkz. Oyun Programlama Taşları Melax 1. Çeviri hemen hemen bir nokta ürün ve ölçek de öyle.
RandyGaul

Yanıtlar:


9

E-on zamanımın bir döneminde Vue ürün serisinin gizemlerini korudum .
Sana söyleyebilirim, seni birkaç gün sürecek, tam zamanlı.
Bazı kütüphane veya süper akıllı bir yol bulamazsanız, klasik yol, tıklattığınızda farenin koordinatını pencerede elde etmektir, bu görünüm penceresine göreceli bir koordinatsa, x ve y'yi genişlik ve yüksekliğe bölebilirsiniz, [0,1] aralığında bir vektör (float 2d) elde eder. x ve y için [-0.5, 0.5] aralığına girmek için (0.5,0.5) çıkarın.
Ardından, x ve y'yi x ve y ışını gibi kullanarak bu koordinattan bir ışın yaparsınız ve z'yi odak mesafesine ayarlarsınız. bazen en boy oranı bu operasyonda eşek bir ağrıdır. Biraz uğraşma ve deneme hatası sizi düzeltir.
Daha sonra, oluşturduğunuz veya blender veya diğer DCC'de modellenmiş bir ağınız varsa veya birbirinizle eklemlenebilecek kafes parçaları olan gizmos elemanlarınızla kesişimini kontrol etmeniz gerekir ... Bu kafes parçasını bir ışın / üçgen kesişme sorgusu.
Ya da varsa, ışın / silindir, ışın / küre gizmo görünümünüze ve parçalarınıza göre.
Çarpıştıkları ilkeye dönüşüm matrisi uygulayabilen kavşak rutinlerine sahip olmalısınız . Gizmo'nuz hareket ettiği hizmet nesnesiyle çeviri yapacak, dönecek ve kameraya olan mesafenin tersi ile ölçeklenecek, böylece ekranda sabit bir projeksiyon boyutu kalacak şekilde son derece önemlidir.
Sonra etkileşim kısmı var, en kolay fare ilk "fare aşağı" olay ve mevcut "Fare hareket" konumu, saf 2D olarak nokta delta almak ve bu delta mevcut eksen hareketi olarak kullanmaktır kampirik olarak karar verdiğiniz bazılarıyla çarpılır . Dahili birimlerinize göre piksel veya mevcut yakınlaştırma ölçeği vs.
Son adım, gizmo'nun matrisini manipüle edilen nesneye uygulamaktır, böylece onu takip eder.

Size söylüyorum, bu cehennemde bir yolculuktur ve boş zamanlarınızda bir haftadan fazla beklerseniz. Alanı tamamen keşfediyorsanız birkaç hafta. Hafta sonlarınız başka etkinliklerle meşgulse bir aydan fazla :)

Sizin için ışın / üçgen kavşak sorgusu yapmak için intel'den Embree 2.0'ı indirmenizi öneririm, bu yüzden kodlama konusunda endişelenmenize gerek yok. Ya da blender'dan kodu acımasızca kopyalayabilir / yapıştırabilir ve uyarlayabilirsiniz ... Sanırım Apache lisansına geçtiler mi? Yasal olarak mümkün olmalıdır.


1
Cevabınız için çok teşekkürler. Gerçekten yardımcı olur. Görünüşe göre kolay bir görev karşısında bunalmışken deli olmadığımı biliyordum. Ben onun zorluğunu küçümsemek ve aynı sorun günlerce sıkışmış sona erdi .. Bir dahaki sefere gidip bu ele, ben iyi bir plan yapmış emin olacaktır. Teşekkürler
Grimshaw

0

Manipülatör-çevirmen için takip algoritması kullanıyorum:

1) Fare aşağıdayken ışının okla kesişip kesişmediğini kontrol etmemiz gerekir. Örneğin X okunu ele alıyoruz. Ray'i dünya uzayında inşa ediyoruz (kamera frustumuna ve fare konumuna dayanarak). X ekseninin yattığı bir düzlem oluşturuyoruz: normali eşit V çapraz X çapraz V, burada V - vektör merkezden kameraya, X - x eksenini temsil ediyor. Sonra ışını uçakla kesişiriz ve bu nedenle dünya koordinatlarında kesişim noktasını buluruz. Sonra x ekseni segmentini ve ortaya çıkan noktayı ekrana geri yansıtırız, yansıtılan segment ile ekrandaki yansıtılan nokta arasındaki mesafeyi buluruz. birkaç pikselden azsa, fare ekseni keser. Ayrıca seçimin merkezi ve kavşak arasındaki dünya uzay deltası vektörünü de hesaplıyoruz.

Bu prosedür 3 eksen için yapıyoruz, bu yüzden tüm eksene mesafeler buluyoruz. Minimum mesafeyi bulun. böylece farenin hangi eksenle kesiştiğini bulduk.

2) Fare hareket ettiğinde. nesnenin hangi eksende hareket ettiğini biliyoruz (1'den). ışının düzlemle dünya uzay kesişimini buluyoruz (1'de olduğu gibi). ayrıca, kesişim noktasını nesnenin hareket ettiği çizgiye yansıtırız. son manipülatör konumu = kavşak + delta.

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.