2011-11-06 23 views
5

Tôi đang cố gắng tạo biểu đồ cảnh cho trò chơi 3D của mình, trong đó mọi biến đổi của đối tượng đều liên quan đến cha mẹ của nó. Mỗi nút của biểu đồ có vectơ Xoay, Tỷ lệ và Dịch.3D liên quan đến biến đổi tuyệt đối

Cách kết hợp ma trận chuyển đổi tương đối chính xác để có được chuyển đổi tuyệt đối của một đối tượng là gì? Tôi sẽ rất vui nếu bạn cũng có thể giải thích giải pháp của bạn.


Dưới đây là một ví dụ về để làm điều đó SAI:
Điều này thực sự bật ra được các giải pháp:

Matrix GetAbsoluteTransformation() 
{ 
    if (!this.IsRoot()) 
    { 
     return this.Transformation * this.Parent.GetAbsoluteTransformation(); 
    } 
    else 
    { 
     return this.Transformation; 
    } 
} 

Trong trường hợp này, khi node cha có thể xoay, thu nhỏ hoặc di chuyển, đứa trẻ được chuyển đổi cùng một số tiền, đó là một hành vi chính xác! Nhưng đứa trẻ sẽ chỉ xoay quanh nguồn gốc của nó và không di chuyển xung quanh nguồn gốc của bố mẹ.


Ứng dụng:

Có một mẫu xe với bốn bánh xe. Các bánh xe có vị trí tương đối xung quanh nguồn gốc của xe. Các bánh xe có thể xoay giống như bánh xe thực. Nếu bây giờ tôi xoay xe, các bánh xe nên luôn gắn liền với nó. Trong trường hợp này chiếc xe là gốc và bánh xe là các nút con.

Ví dụ khác sẽ là mô hình của hệ mặt trời. Hành tinh xoay quanh trục của chúng, di chuyển xung quanh mặt trời, và mặt trăng di chuyển xung quanh các hành tinh.

+0

Hóa ra ý tưởng đầu tiên của tôi là làm thế nào để làm điều đó, mà sau đó tôi coi là không phù hợp, thực sự là giải pháp! Tôi đã dành vài giờ đồng hồ để giải quyết vấn đề này. * facepalm * Cảm ơn mọi người vì đã giúp đỡ nhanh chóng và chính xác! – Lucius

Trả lời

3

Liên quan đến của bạn "làm thế nào để làm điều đó sai", tôi ghét để phá vỡ nó cho bạn, nhưng nó không phải là sai; thay vào đó, nó không đầy đủ. Bạn cần phải làm những loại công việc đó một cách độc lập với mối quan hệ cha mẹ con.

Dưới đây là ví dụ về điều đó: Bánh xe được gắn vào xe giống như bạn đã đề cập. Nếu bạn dịch hoặc xoay xe, bạn không cần phải chạm vào bánh xe - chúng ở cùng một vị trí liên quan đến xe hơi. Tuy nhiên, khi bạn cố gắng để có được vị trí mới của bánh xe trong 'thế giới thực', bạn phải đi qua cây, áp dụng các biến đổi ma trận như bạn đi. Đó là tất cả các công trình, phải không?

Khi bạn xoay một đối tượng, nó xoay quanh nguồn gốc OWN của nó. Vì vậy, một bánh xe có lẽ nên quay xung quanh trục y của nó, và một hành tinh xung quanh trục z của nó. Nhưng bây giờ nếu bạn cần phải di chuyển một hành tinh "xung quanh mặt trời", bạn đang làm một cái gì đó hoàn toàn khác nhau. Điều này phải được tính riêng. Đó không phải là để nói rằng nó sẽ không được giảm bớt bằng cách sử dụng một số của cùng một trận đấu bạn đã có, (mặc dù tôi không thể nói chắc chắn mà không làm toán học bản thân mình) nhưng nó hoàn toàn khác nhau.

Bạn đang thực sự đang thay đổi trạng thái của đối tượng. Đó là vẻ đẹp của đồ thị cảnh! Nếu bạn không có một đồ thị cảnh, bạn sẽ phải tìm ra tất cả các giá trị khác nhau tất cả các cách trở lại cảnh chính và sau đó làm tất cả các loại toán học. Ở đây, bạn chỉ cần làm một chút trig và đại số để di chuyển xung quanh hành tinh (bạn có thể google cơ học thiên thể) và di chuyển hành tinh tương đối với ngôi sao của nó. Lần tiếp theo cảnh chính hỏi hành tinh ở đâu, nó sẽ đi xuống biểu đồ cảnh! :-D

+0

Tôi chọn câu trả lời này là câu trả lời hay nhất. Cách tiếp cận ban đầu của tôi là chính xác và bây giờ tôi không biết tại sao tôi coi nó là sai (quá đơn giản? D) Bạn cũng đúng về xoay vòng hành tinh: Bây giờ tôi đã bao gồm một nút bổ sung xử lý vòng xoay quanh mặt trời. Cảm ơn nhiều! – Lucius

+0

Nếu mặt trời quay các hành tinh sẽ xoay vòng với đại số ma trận này. Chuyển tiếp động học .. – stefan

+0

@Stefan sau đó rõ ràng là mặt trời chỉ đơn giản là một đứa trẻ của hệ mặt trời như hành tinh, và tập trung tại nguồn gốc. – corsiKa

1

Tôi nghĩ đây là hành vi đúng.

Tôi không nghĩ rằng xoay quanh nguồn gốc của bố mẹ là cái gì đó có thể được thực hiện với một ngăn xếp ma trận đơn giản. Tôi nghĩ rằng bạn chỉ có thể tuyên truyền từ cha mẹ cho trẻ em.

Thay vào đó, bạn có thể thử đặt xoay vòng và chuyển đổi tương đối dựa trên khoảng cách từ nguồn gốc tuyệt đối của bố mẹ, mặc dù đó là tính toán nhiều hơn là chỉ đẩy vào ngăn xếp ma trận.

Dưới đây là một câu hỏi tương tự: Getting absolute position and rotation from inside a scene graph?

+0

Cảm ơn bạn! Cũng đúng! :) – Lucius

1

Tùy thuộc vào việc bạn đang sử dụng OpenGL hay Direct3D. Trong OpenGL, các phép biến đổi được áp dụng từ phải sang trái, trong khi trong Direct3D, chúng áp dụng từ trái qua phải. Cả hai đều là những cách hoàn toàn hợp lệ để thiết kế hệ thống biến đổi, nhưng nó có nghĩa là bạn phải suy nghĩ về chúng một cách khác nhau.

Tôi thấy dễ nhất khi nghĩ trong hệ thống của OpenGL, nhưng ngược lại. Thay vì suy nghĩ về cách các đỉnh của một đối tượng di chuyển xung quanh khi các biến đổi được áp dụng từ phải sang trái, tôi tưởng tượng hệ thống tọa độ của đối tượng đang được chuyển đổi theo thứ tự từ trái sang phải. Mỗi phép biến đổi được áp dụng liên quan đến hệ tọa độ cục bộ mới, không liên quan đến thế giới.

Trong trường hợp bánh xe trên xe, có ba biến đổi liên quan: vị trí của ô tô trong không gian, xuất xứ của bánh xe tương đối so với xe và hướng của bánh xe liên quan đến vị trí trung lập của nó. Đơn giản chỉ cần áp dụng chúng trong thứ tự từ trái sang phải (hoặc ngược lại cho Direct3D). Để vẽ bốn bánh xe, trước tiên hãy áp dụng biến đổi của ô tô, sau đó nhớ biến đổi hiện tại, sau đó áp dụng vị trí và hướng chuyển đổi lần lượt, quay lại biến đổi chiếc xe nhớ sau mỗi lần.

+0

Tôi không chắc chắn nếu câu trả lời này hoàn toàn phù hợp với câu hỏi của tôi. Tuy nhiên, tôi vẫn chưa biết về sự khác biệt này, vì vậy cảm ơn bạn! :) – Lucius

+0

Tôi tin rằng đây là các giá trị mặc định và bạn có thể lật chúng nếu cần. Ít nhất tôi khá chắc chắn bạn có thể trong OpenGL. –

+0

@user điều tốt nhất để lấy đi từ câu trả lời Marcelos là có rất nhiều khung được sử dụng bởi hàng trăm ngàn (có lẽ hàng triệu?) Của các nhà phát triển, và rằng bạn nên xem xét sử dụng một trong những người để làm việc nâng hạng nặng trong hệ thống của bạn. Không chỉ họ sẽ giúp bạn tiết kiệm rất nhiều giờ gỡ lỗi (lưu ý, nhiều giờ hơn nó sẽ làm để làm của riêng bạn) nhưng bạn cũng sẽ có một kỹ năng rất có thể tiếp thị và sinh lợi trên hồ sơ của bạn! – corsiKa

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