2011-07-29 49 views
5

Tôi đang thực hiện trò chơi ô tô 3d và tôi gặp vấn đề với xoay vòng. Tôi muốn xoay một mô hình xung quanh chính nó nhưng khi tôi di chuyển, nó bắt đầu di chuyển xung quanh thế giới!Làm thế nào để xoay một mô hình 3D xung quanh trung tâm của nó?

Câu hỏi đặt ra là: Làm cách nào để tạo trung tâm cho mô hình di chuyển?

Tôi cố gắng để thay đổi mã như thế này:

effect.World = Matrix.CreateRotationZ(modelRotation) * effect.World = Matrix.CreateTranslation(position); 

tại thay vì di chuyển về phía trước so với các mô hình, định hướng nó di chuyển theo một hướng thiết lập! & đây là mã của tôi:

effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation); 
       effect.View = camera.View; 
       effect.Projection = camera.Projection; 
+0

Tôi khuyên bạn nên gắn bó với một toán tử gán cho mỗi câu lệnh. Nếu không, kết quả có thể gây nhầm lẫn, đáng ngạc nhiên và khó đọc. –

+0

Điều gì đã xảy ra khi bạn thực hiện điều này: effect.World = Matrix.CreateRotationZ (modelRotation) * effect.World = Matrix.CreateTranslation (position); Tôi bối rối, bạn nói nó 'di chuyển theo một hướng đã định', ý bạn là gì? – tweetypi

Trả lời

3

Tôi có một vài lời khuyên để giúp bạn bắt đầu:

  1. Matrix để nhân trong DirectX/XNA là differrent hơn bạn học ở trường.

Trong trường học v = A B y có nghĩa là: v = A (B y). Vì vậy, khi ma trận chuỗi, B được áp dụng đầu tiên.

Nếu bạn muốn kết hợp ma trận A và B, bạn nhân họ như C = A B

trong DirectX/XNA, trật tự bị đảo ngược. Để kết hợp ma trận B và A, bạn viết var C = B * A;

để ngăn cản tôi từ những sai lầm, tôi áp dụng một quy ước đặt tên: mỗi ma trận (hoặc chuyển đổi) được gọi AtoB: WorldToView, ModelToWorld, hoặc ModelToRotatedModel.

này nhắc nhở bạn rằng đầu ra của ma trận đầu tiên phải phù hợp với đầu vào của các ma trận phải:

var modelToView = modelToWorld * worldToView; 

và không:

var nowhereToNowhere = worldToView * modelToWorld; 

này đã giúp tôi rất nhiều, tôi hy vọng nó giúp bạn sắp xếp các vấn đề ma trận của mình.

P.S. Tôi hy vọng nguồn gốc của mẫu xe của bạn nằm ở trung tâm của chiếc xe, nếu không nó sẽ vẫn di chuyển xung quanh kỳ lạ.

+0

Làm thế nào để có được nguồn gốc của chiếc xe? – zionpi

+0

@zionpi Cách dễ nhất là tính toán hộp giới hạn của xe, và sau đó lấy trung tâm của hộp này. –

3

Hãy thử chuyển đổi các giá trị xung quanh:

effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation);

để nó trở thành:

effect.World = Matrix.CreateRotationZ(modelRotation) * Matrix.CreateTranslation(position);

tôi theo một thats viết tắt đơn giản gọi là ISROT

nhận dạng

Scale

Rotation

Định hướng

Dịch

Bạn làm việc phải sang trái, vì vậy bạn luôn luôn kết thúc tuyên bố của bạn với Translation.

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