2013-01-11 41 views
8

Tôi gặp vấn đề với ứng dụng Direct3D11 mà tôi đang cố giải quyết trong vài giờ rồi. Vấn đề là phương pháp mà:Ma trận gây ra tai nạn

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); 
} 

Tất cả mọi thứ của tốt cho đến khi nó đạt đến dòng:

m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 

Bằng cách nào đó nó gây ra vụ tai nạn ứng dụng (công tắc để không đáp ứng được đúng).

Và đây là cách gọi thực tế như sau:

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); 

Năm trước, Vertex và Pixel Shader biên dịch tốt, vì vậy đó không phải là một vấn đề. Hầu hết có lẽ tôi đang làm điều gì đó sai với xnamath (tôi hoàn toàn mới với nó), nhưng tôi không có ý tưởng những gì trên trái đất có thể được. Cảm ơn trước. Tôi sẽ cung cấp thêm thông tin nếu cần.

Chỉnh sửa @ 1: Với hàng chục thay đổi tôi đã quản lý để có được Phép chiếu và ma trận thế giới hoạt động. Mặc dù tôi vẫn không thể đặt ma trận Xem. Tôi đã thay đổi mã, vì vậy nó phù hợp với thực tế và đã loại bỏ những gì không quan trọng.

Chỉnh sửa @ 2: Tin tức mới nhất từ ​​phút cuối: không có vấn đề với hàm XMMatrixLookAtLH, vì tôi quyết định lưu kết quả vào biến địa phương và nó hoạt động, nhưng nếu tôi muốn gán ma trận kết quả cho lớp thành viên sau đó tôi nhận được vụ tai nạn. Điều đó chắc chắn thú vị nhất.

+0

Thử gỡ lỗi phương thức và xem giá trị của con trỏ m_ViewMAtrix là gì? –

+0

Được rồi vì vậy tôi nhận được lỗi chính xác này. Mã chỉ bí ẩn bị treo khi nó cố gắng tính toán XMMatrixLookAtLH hoặc bất kỳ hàm XNA nào. – Caesar

+1

Sau khi thử một số thứ, cuối cùng tôi đã làm việc đó bằng cách đặt chế độ của tôi thành bản dựng 64x.Vẫn đang tìm kiếm một câu trả lời về lý do tại sao điều đó xảy ra mặc dù. – Caesar

Trả lời

5

Sau nhiều giờ cố gắng giải quyết vấn đề này, tôi tin rằng cuối cùng tôi đã giải quyết được vấn đề này.

XMMATRIX đại diện cho ma trận liên kết 16 byte và phân bổ không được ký hiệu của XMMATRIX gây ra lỗi này khi bạn cố gắng sao chép giá trị. Điều này sẽ giải thích tại sao nó không phải luôn luôn xảy ra và tại sao nó hoạt động ở chế độ khác nhau.

Giải pháp tốt nhất mà tôi đã tìm thấy cho vấn đề này là sử dụng XMFLOAT4X4 để lưu trữ giá trị.

Dưới đây là một ví dụ đơn giản:

#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

Chỉ vừa xem câu hỏi của bạn - tôi đã gặp vấn đề tương tự trong khi trước đây và đây cũng là câu trả lời. Và trong thực tế, điều này là khá nhiều những gì microsoft đề nghị anyway .. – jcoder

+0

@ jcoder Tôi chỉ muốn họ làm cho nó rõ ràng hơn. – Caesar

+0

Để tham khảo http://msdn.microsoft.com/en-gb/library/windows/desktop/ee418725(v=vs.85).aspx (Điều này có directxmath chứ không phải là xnamath cũ hơn nhưng nó giống nhau) – jcoder

3

Kể từ khi vụ tai nạn xảy ra tại công việc: m_ViewMatrix = XMMatrixLookAtLH (...

và xây dựng khập khiễng cùng tốt hơn trong x64 hơn x86 tôi sẽ giả định m_ViewMatrix hoặc thậm chí vùng chứa m_Camera của nó được ánh xạ trong một không gian bộ nhớ được chia sẻ với một thứ gì đó khác.Bạn phân bổ trường m_Camera như thế nào? Container chính cho mọi thứ là gì?

Đăng tiêu đề CameraClass đầy đủ và nơi bạn đang phân bổ nó. Ngoài ra, hãy thử rắc một số mảng xung quanh các trường và xem điều đó có giúp ích gì không. Điều đó sẽ cho thấy bộ nhớ clobbering quá.

+0

Có vẻ như tôi không thể chỉnh sửa bài đăng vì tôi không phải là người đăng ban đầu. Nhưng nếu bạn muốn xem xét mã của tôi xem xét sửa đổi hoặc xem nó ở đây trên github https://github.com/mmajeed-Fanshawe/XNAError – Caesar

+0

Tôi muốn hỏi, những gì xử lý và hệ điều hành là vấn đề này xảy ra trên? – GMasucci

+2

@GMasucci Windows 7, hãy đọc câu trả lời của tôi để xem linh hồn – Caesar

Các vấn đề liên quan