2011-10-25 14 views
6

The Hazy Mind tarafından bir XNA eğitimini takip ediyorum Bir Konum (Vector3) ve bir Rotasyon (Quaternion) içeren bir temel nesneye sahibim. nesne modeli öğretici kamera uygulaması itibaren bu Class DiagramBir bloğun 6 tarafı döndürüyor

gibi ben Dönmesi bir kopyasını yaptı ve yöntemleri Revolve ve Nesne bunları uyguladık görünüyor

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

Benim Blok nesne 6 yaratır Block rendered by 6 Quad objects

ve şimdi benim on the Block Döndür çağırarak, gerçek sorun var: Quad örneklerini ve her Quad nesne üzerinde işlemek yöntemini çağırır, ben her Quad atanan uzaklıklar ve rotasyonlar dokulu Blok böyle giyinip oluşturmak zorunda obj ect, nesnenin dönüşünü değiştirmesine neden olur ve Quad nesnelerim dönmez, dolayısıyla Block nesnesimde yeni bir Döndürme işlevi uygulardım.

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

Ancak bu burada görüldüğü gibi bana beklenen sonucu vermedi:

Block object rotated

yanlış çözüm

aşağıdaki çözüm çalışacak ama çok jenerik olmayacak ve sınırlı olacaktır: Bir kaç tane eksenin etrafında dönmeyi kontrol ettiğimi ve daha sonra her tarafı (Dörtlü nesneyi) doğru şekilde döndürdüğünü belirten ifadeler.

uygun çözüm

Alternatif ben Quad render Blok nesnesi (ebeveynlerinin) Dönüşleri bağımlı nesneleri yapabilir, ama bunu nasıl emin değilim.

Üçüncü ve sonuncu seçenek, Döndürme yönteminin her bir Quad nesnesinin rotasyonunu ve konumunu doğru değerlere güncellemesini sağlamaktır; bu, ayrıca nasıl yapılacağından emin değilim.

Peki ben için soruyorum bu konuda bazı fikir veya düşünce, tercihen görsel bir şekilde, XNA Kuaternionlarla nasıl kullanılacağını açıklayan belki bazı bağlantılar ve/veya öğreticiler ise soru. girişiniz :)

cevap

2
yapmanız gerekenler

ve bu sözü sabırsızlıkla

Şerefe, Quad render ebeveynin dönme bağımlı nesneleri olun.

Bu sizinki gibi bir hierachal sistemi ile oldukça kolaydır. İşleyiciniz bloğu oluşturmaya gittiğinde, bloğun dönüşümünü bir matriste saklamalıdır, buna BlockWorld diyelim. Her bir Quad işlemek için gittiğinizde, Quad'ın yerel dönüşümünü BlockWorld ile çarpın.

İlgili konular