2013-01-11 13 views
8

Direct3D11 uygulamasında, birkaç saatliğine çözmeyi denediğim tuhaf bir sorunum var.Matrisler çökmeye neden oluyor

m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 

nasılsa uygulama çökme (anahtarlar doğru cevap vermeyen) neden olur: o çizgiye ulaşana kadar

void CameraClass::Render() 
{ 
    XMFLOAT3 sUp, sLookAt, sRotationInRadians; 

    sUp.x = 0.0f; 
    sUp.y = 1.0f; 
    sUp.z = 0.0f; 

    sLookAt.x = 0.0f; 
    sLookAt.y = 0.0f; 
    sLookAt.z = 1.0f; 

    sRotationInRadians.x = m_Rotation.x * 0.0174532925f; 
    sRotationInRadians.y = m_Rotation.y * 0.0174532925f; 
    sRotationInRadians.z = m_Rotation.z * 0.0174532925f; 

    XMVECTOR vecLookAt = XMVectorSet(sLookAt.x, sLookAt.y, sLookAt.z, 0.0f); 
    XMVECTOR vecUp = XMVectorSet(sUp.x, sUp.y, sUp.z, 0.0f); 
    XMVECTOR vecPosition = XMVectorSet(m_Position.x , m_Position.y, m_Position.z, 0.0f); 

    XMMATRIX RotationMatrix(XMMatrixRotationRollPitchYaw(sRotationInRadians.x, sRotationInRadians.y, sRotationInRadians.z)); 

    vecLookAt = XMVector3TransformCoord(vecLookAt, RotationMatrix); 
    vecUp = XMVector3TransformCoord(vecUp, RotationMatrix); 

    vecLookAt += vecPosition; 

    m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 
} 

Yolunda: Sorun o yöntemdir. Gerçek aramalar benzemesi burada

Ve geçerli: bu bir sorun değil yani öncesinde

XMMATRIX ViewMatrix; 
XMMATRIX ProjectionMatrix; 
XMMATRIX WorldMatrix; 

m_D3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f); 

m_Camera->Render(); 

m_D3D->GetWorldMatrix(WorldMatrix); 
m_D3D->GetProjectionMatrix(ProjectionMatrix); 

, Vertex ve Piksel shader, sadece iyi derlemek. Muhtemelen xnamath ile yanlış bir şeyler yapıyorum (onunla tamamen yeni yaşıyorum), ama Dünyada ne olabileceği hakkında hiçbir fikrim yok. Şimdiden teşekkürler. Gerekirse daha fazla bilgi vereceğim.

Edit @ 1: Düzinelerce değişiklikle Projeksiyon ve Dünya matrislerinin çalışmasını sağladım. Yine de View matrix'i ayarlayamıyorum. Kodu değiştirdim, bu yüzden gerçek olanla eşleşiyor ve önemli olmayan şeylerden kurtuluyor.

Düzenleme 2 @: Son dakikada gelen dakika haberi: orada yerel değişkene sonucu kurtarmaya karar çünkü XMMatrixLookAtLH fonksiyonu ile ilgili bir sorun değildir ve çalışır, ancak ben sınıfa sonuç matrisi atamak istiyorsanız üye o zaman kazayı alıyorum. Bu kesinlikle ilginç.

+0

Yöntemi hata ayıklamayı deneyin ve m_ViewMAtrix işaretçisinin değerini öğrenin. –

+0

Tamam, ben de aynı hatayı alıyorum. XMMatrixLookAtLH veya herhangi bir XNA işlevini hesaplamaya çalıştığında kod gizemli bir şekilde çöküyor. – Caesar

+1

Bazı şeyleri denedikten sonra, modumu 64x derlemeye ayarlayarak çalıştım.Yine de bunun neden olduğuna dair bir cevap arıyorum. – Caesar

cevap

5

Bu problemi çözmek için saatler harcadıktan sonra, sonunda çözdüğümü düşünüyorum.

XMMATRIX, 16 baytlık hizalanmış bir matrisi temsil eder ve XMMATRIX'in hizasız bir şekilde atanması, değeri kopyalamayı denediğinizde bu hataya neden olur. Bu her zaman neden olmadığını ve neden farklı modda çalıştığını açıklar.

Bu sorunu bulduğum en iyi çözüm, değeri depolamak için XMFLOAT4X4 kullanmaktır. Kilitlenme atamasının olur yana

#include <windows.h> 
#include <xnamath.h> 

class Camera 
{ 
protected: 
    XMFLOAT4X4 view_; 
public: 
    XMFLOAT4X4 const& Update() 
    { 
     XMStoreFloat4x4(&this->view_ , XMMatrixIdentity()); 
     return this->view_; 
    } 
}; 

int main() 
{ 
    Camera* cam = new Camera; 
    XMFLOAT4X4 const& mat = cam->Update(); 
    XMMATRIX x = XMLoadFloat4x4(&mat); 
} 
+0

Sadece az önce sorunuzu gördüm - bir süre önce aynı problemi yaşadım ve bu da cevaptı. Ve aslında bu microsoft neyse ne tavsiye ederse .. – jcoder

+0

@jcoder Sadece daha net yaptıklarını dilerim. – Caesar

+0

Başvuru için http://msdn.microsoft.com/en-gb/library/windows/desktop/ee418725(v=vs.85).aspx (Bu, eski xnamath yerine directxmath var ama çok aynı) – jcoder

3

: m_ViewMatrix = XMMatrixLookAtLH (...

ve ben varsayılabilir inşa x86 daha birlikte daha iyi x64 içinde limps İşte

basit bir örnek m_ViewMatrix veya kapsayıcısı m_Camera, başka bir şeyle paylaşılmış bir bellek alanında eşleştirilir Bellek yutulması: 64bit'e geçiş, sorunu gizlemek için belleği hareket ettirmiş olabileceğinden, buna yönelik başka bir göstergedir.

m_Camera alanını nasıl ayıracaksınız? Her şey için ana konteyner nedir?

Tüm CameraClass üstbilgisini ve bunu nereye tahsis ettiğinizi yazın. Ayrıca, alanların etrafındaki bazı dizilerde yağmurlama yapmayı deneyin ve bunun işe yarayıp yaramadığını görün. Bu da hafızanın gizlenmesini gösterir.

+0

Gönderiyi düzenleyemediğim için orijinal poster değilim. Ama benim kod gözden bir gözden geçirmek veya gözden geçirmek veya github https://github.com/mmajeed-Fanshawe/XNAError – Caesar

+0

burada görüntülemek istiyorum görmek istiyorum, hangi işlemci ve işletim sistemi üzerinde bu sorun ortaya çıkıyor? – GMasucci

+2

@GMasucci Windows 7, lütfen soultion görmek için cevabımı okuyun – Caesar