Làm cách nào để triển khai dịch, tỷ lệ, xoay vòng để thao tác các biến đổi của đối tượng 3D?


11

Tôi đang trong quá trình phát triển trình chỉnh sửa 3D cơ bản. Nó sử dụng OpenGL để hiển thị một thế giới 3D. Ngay bây giờ cảnh của tôi chỉ là một vài hộp có kích thước khác nhau và tôi đang ở giai đoạn mà tôi muốn có thể chọn từng hộp rồi di chuyển / chia tỷ lệ / xoay nó để đạt được bất kỳ biến đổi nào tôi muốn.

Làm cách nào tôi có thể giải quyết vấn đề triển khai cả hiển thị gizmos của công cụ này (hoặc tay cầm hoặc cách mọi người thường gọi chúng), và cũng chọn chúng trên mỗi trục để thực hiện thay đổi trong biến đổi bằng chuột của tôi? Cho rõ ràng: nhập mô tả hình ảnh ở đây

Nghiên cứu của tôi cho đến nay đã đề xuất cách tiếp cận sạch nhất là có một hộp giới hạn căn chỉnh trục cho mỗi mũi tên trong gizmo và một cái khác trên mỗi hình vuông (những cái di chuyển vật thể trong một mặt phẳng chứ không phải là một trục) và sau đó chiếu tia từ chuột vị trí và xem những gì nó va chạm với. Nhưng điều này vẫn còn quá trừu tượng đối với tôi, tôi sẽ đánh giá cao hướng dẫn thêm về cách thuật toán này sẽ đi (mã giả là quá đủ)


1
Thông thường, bạn sẽ chiếu vào thế giới với vị trí chuột và xem bạn có trúng gizmo không. Bạn cũng có thể biến gizmo thành không gian màn hình để phát hiện va chạm ở đó. Thông thường mặc dù bạn chỉ cần thực hiện khoảng cách từ tia đến loại phân đoạn của sự vật. Xoay thường được thực hiện như một quả bóng theo dõi ảo. Xem Melax trong Đá quý lập trình trò chơi 1. Bản dịch gần như là một sản phẩm chấm và quy mô cũng vậy.
RandyGaul

Câu trả lời:


9

Tại một số thời điểm của tôi tại e-on, tôi đã duy trì dòng sản phẩm của Vue .
Tôi có thể nói với bạn, nó sẽ đưa bạn nhiều ngày, toàn thời gian.
Trừ khi bạn tìm thấy một số thư viện hoặc cách siêu thông minh, cách cổ điển là lấy tọa độ của chuột trong cửa sổ khi bạn nhấp, nếu đó là tọa độ tương đối của chế độ xem, bạn chỉ cần chia x và y theo chiều rộng và chiều cao, bạn lấy một vectơ (float 2d) trong phạm vi [0,1]. trừ (0,5,0,5) cho nó để vào phạm vi [-0,5, 0,5] cho cả x và y.
Sau đó, bạn tạo một tia từ tọa độ này bằng cách sử dụng x và y đơn giản là tia x và y, và bạn đặt z thành khoảng cách tiêu cự. đôi khi tỷ lệ khung hình là một cơn đau ở mông trong hoạt động này. Một chút lỗi và thử nghiệm sẽ giúp bạn sửa chữa.
Sau đó, bạn cần kiểm tra giao điểm với các phần tử gizmos của mình, hoặc bạn có một lưới mà bạn đã tạo hoặc được mô hình hóa trong máy xay hoặc DCC khác, hoặc các phần lưới có thể khớp nối với nhau ... Chỉ cần sử dụng phần lưới đó như một tia / truy vấn tam giác.
Hoặc nếu bạn có nó, tia / hình trụ, tia / hình cầu tùy theo ngoại hình và bộ phận của bạn.
Bạn cần có các thói quen giao nhau có khả năng áp dụng ma trận biến đổi trên nguyên thủy mà chúng va chạm . Vô cùng quan trọng vì gizmo của bạn sẽ dịch với đối tượng mà nó phục vụ để di chuyển, nó sẽ xoay và nó sẽ mở rộng theo tỷ lệ nghịch của khoảng cách với máy ảnh, để nó giữ kích thước chiếu cố định trên màn hình.
Sau đó, bạn có phần tương tác, dễ nhất là lấy điểm delta khi chuột là sự kiện "chuột xuống" đầu tiên và vị trí "Chuột di chuyển" hiện tại, ở dạng 2D thuần túy và sử dụng delta này làm chuyển động trục hiện tại trong không gian thế giới, nhân với một số kmà bạn quyết định theo kinh nghiệm. Theo các đơn vị nội bộ của bạn so với pixel so với tỷ lệ thu phóng hiện tại, v.v.
Bước cuối cùng chỉ đơn giản là áp dụng ma trận của gizmo cho đối tượng bị thao túng, để nó tuân theo nó.

Tôi nói với bạn đó là một hành trình trong địa ngục để thực hiện, và nếu bạn đang thực hiện nó trong thời gian rảnh rỗi thì hơn một tuần. Nhiều tuần nếu bạn hoàn toàn khám phá lĩnh vực này. Hơn một tháng nếu cuối tuần của bạn bận rộn với các hoạt động khác :)

Tôi khuyên bạn nên tải xuống Embree 2.0 từ intel để thực hiện truy vấn giao điểm tia / tam giác cho bạn, vì vậy bạn không phải lo lắng về việc mã hóa điều đó. Hoặc bạn có thể sao chép / dán và điều chỉnh mã không thương tiếc từ máy xay sinh tố ... Tôi nghĩ rằng họ đã chuyển sang giấy phép Apache? Nên có thể hợp pháp.


1
Cảm ơn rất nhiều cho bạn trả lời. Nó thực sự hữu ích. Tôi biết tôi không điên khi cảm thấy bị choáng ngợp bởi một nhiệm vụ dễ dàng. Tôi đánh giá thấp sự khó khăn của nó và cuối cùng bị mắc kẹt trong cùng một vấn đề trong nhiều ngày .. Lần sau tôi đi và xử lý việc này, tôi chắc chắn sẽ thực hiện một kế hoạch tốt. Cảm ơn
Grimshaw

0

Đối với trình điều khiển-trình dịch tôi sử dụng thuật toán theo:

1) Khi chuột xuống, chúng ta cần kiểm tra xem tia có giao nhau với mũi tên không. Ví dụ, chúng tôi xem xét mũi tên X. Chúng tôi xây dựng Ray trong không gian thế giới (dựa trên vị trí máy ảnh và vị trí chuột). Chúng ta xây dựng một mặt phẳng trong đó trục x nằm: bình thường của nó bằng V chéo X chéo V, trong đó V - vectơ từ tâm đến camera, X - đại diện cho trục x. Sau đó, chúng ta giao cắt tia với mặt phẳng và do đó chúng ta tìm thấy điểm giao nhau trong tọa độ thế giới. Sau đó, chúng tôi chiếu phân đoạn trục x và điểm kết quả trở lại màn hình, tìm khoảng cách giữa phân đoạn được chiếu và điểm được chiếu trên màn hình. nếu nó nhỏ hơn một vài pixel, chuột sẽ điều chỉnh trục. Ngoài ra, chúng tôi tính toán vectơ không gian thế giới giữa trung tâm của lựa chọn và giao điểm của chúng tôi.

Quy trình này chúng tôi thực hiện cho 3 trục, vì vậy chúng tôi tìm khoảng cách đến tất cả các trục. Tìm khoảng cách tối thiểu. Vì vậy, chúng tôi đã tìm thấy trục mà chuột giao nhau.

2) Khi chuột di chuyển. chúng ta biết đối tượng di chuyển theo trục nào (từ 1). chúng ta tìm thấy giao điểm không gian thế giới của tia với mặt phẳng (như trong 1). Ngoài ra, chúng tôi chiếu điểm giao nhau trên đường mà đối tượng di chuyển dọc. vị trí thao tác cuối cùng = giao điểm + delta.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.