2016-04-05 44 views
0

İki parçadan, gövdeden ve lastiklerden oluşan çizmek istediğim bir araba modelim var. Her biri ayrı bir .OBJ dosyasında ayrı bir modeldir ve her biri ayrı bir drawcall kullanılarak çizilir.İlgili modellerin uygun şekilde döndürülmesi için uygun yol

Input geometry

ilk çizim Tamam görünüyor, her şey dizilmiş gibi görünüyor:

enter image description here

Ancak, ben dönen başladığında, her şey sonları:

enter image description here

Her nesne aynı şekilde (XNAMath'ın tran'ı kullanılarak dönüştürülür) slasyon, ölçek ve rotasyon matrisi) ve her nesnenin bir Dünya uzayında kendi konumu vardır.

Buradaki sorunun rotasyonun "tutturma noktaları" olduğunu düşünüyorum.

  • Bir nesneyi "çapa noktası" etrafında nasıl döndürebilirim?
  • Hangi "bağlantı noktası" kullanılmalıdır?
  • Her iki nesne için ortak "bağlantı noktası" kullanmak yeterli mi?

Ve bir yan soru, bu tür yapıları temsil etmenin uygun bir yolunun ne olacağını biliyor musunuz? Şimdilik bunlar iki ayrı örneğidir, ancak eğer iç, ayna vb. Eklemek istersem, tüm nesneler için ortak özelliklere sahip bazı konteyner sınıflarını yapmak daha doğru olur mu?

cevap

1

Matris birleştirme işleminizin yanlış olduğu görülüyor. senin büyük bir modele farklı modeller ekleyerek Çünkü u bu şekilde yapmalıdır:

  1. tek parçaların her örgü x, y için aralık [-1,1] içindeki köşeleri, z
  2. Taşı her vardır Objectspace içindeki yerini araç (parça, döndürme, taşıma) konumuna getirme, Tipik olarak Objectspace, x, y, z için Range [-1,1] değerini ayarlıyor. Lastikler belki küçültülmeli ve araç gövdesinin dibine taşınmalıdır.
  3. Arabayı, bir dünya matrisi ile sahnede son konuma getirin (ölçek, döndürme, taşıma). Burada, aracın son sahnesine yerleştirilmesi için gerçek ölçekleme, rotasyon veya çeviri yapıyorsunuz.
  4. Bu, WorldMatrix öğesinin tüm parçaların her bir ObjectSpace matrisi ile çarpılmasıyla yapılır.
  5. Her Nesne için, aşağıdaki yapıya sahip bir Matris zinciri elde edersiniz: Aracın localSpace'i -> Aracın nesnesi -> Sahne Alanı'ndaki WorldSpace => (Aracın her parçası için ObjectSpaceMatrix * WorldMatrix).

Modelinizde, araç parçalarınızın menzil dahilinde olduğu görülüyor [0,1]. Ölçekleme (0,0,0) ile yapıldığı için, bu tipik aşırı hareketi bir yöne alırsınız. Köşelerinizi ağda değiştirirsiniz ya da nesnenin ortalandığından ve ölçeklemenin doğru olacağından emin olmak için önce nesne parçalarını [-0.5, -0.5, -0.5] ile çevirirsiniz.

Aşağıda bazı yapının bazı sahte kod u kullanabilirsiniz vardır:

class CarPart 
{ 
    Float4x4 ObjectSpaceMatrix; //matrix moves part to its position in the "CarObjectSpace" withing range[-1,1] 
    Mesh Instance; 
} 

class Car 
{ 
    Float4x4 WorldSpaceMatrix; //matrix moves complete mesh inside the scene 

    CarPart Tires; 
    CarPart Body; 
    CarPart Engine; 
    ... 
} 

void render() 
{ 
    Float4x4 FinalTiresMatrix = Car.Tires.ObjectSpaceMatrix * Car.WorldSpaceMatrix; 
    Float4x4 BodyTiresMatrix = Car.Body.ObjectSpaceMatrix * Car.WorldSpaceMatrix; 
    ... 
} 

Ben, bu size yardımcı olacaktır iyi şanslar umut!

+0

Bu cevap için teşekkürler @kaiser! Bazı hata ayıklama baskısı ekledim, köşeler hakkında haklı olduğun ortaya çıktı, onlar menzilde (-1.44918, 4.5572), normalleştirdim ve şimdi (-0.317997, 1). Bu yaygın bir uygulama mı? Object Space'deki köşe noktalarının temelde herhangi bir değere sahip olabileceğini düşündüm. Her neyse, önerdiğin değişiklikleri yapmaya devam ediyorum, bir şey alır almaz geri döneceğim. –

+1

Evet normalize aralık yaygın bir uygulamadır. Kafes yapılarında erken bilgiden kaçınmaya çalışın. Yüklenen temel ağ, ölçeklendirme, döndürme ve çeviri işlemlerinden bağımsız ise, programınız çok daha genel olacaktır. – kaiser