2010-11-10 65 views
6

Tôi hiện đang cố gắng sử dụng OpenGL (Với SDL) để vẽ hình lập phương đến vị trí mà tôi nhấp chuột trái vào màn hình và sau đó chuyển đến chỉ vào vị trí trên màn hình nơi tôi nhấp chuột phải.Tìm các góc cho trục X, Y và Z trong chế độ 3D - OpenGL/C++

Tôi có thể vẽ thành công khối lập phương tại vị trí mong muốn của mình bằng cách sử dụng gluUnproject - Có nghĩa là tôi đã biết tọa độ của khối lập phương của tôi.

Tuy nhiên, tôi không biết cách tính tất cả các góc cần thiết để tạo điểm lập phương của tôi tại vị trí mới.

Tất nhiên tôi vẫn đang sử dụng gluUnproject để tìm tọa độ của nhấp chuột phải, nhưng tôi chỉ biết cách xoay quanh trục Z khi sử dụng đồ họa 2D.

Ví dụ trước, nếu tôi muốn xoay một góc xoay quanh trục Z (Tất nhiên, đây sẽ là chế độ xem từ trên xuống khi trục Z vẫn "đi qua" màn hình) trong 2D, tôi sẽ làm một cái gì đó như :

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX); 
glRotatef(angle*180/PI, 0, 0, 1); 

Câu hỏi của tôi là, tôi sẽ thực hiện điều này bằng 3D như thế nào?

  • Tôi có cần tính toán các góc cho mỗi trục như tôi đã làm ở trên không?
  • Nếu vậy, làm cách nào để tính góc quay xung quanh trục X và trục Y?
  • Nếu không, tôi nên sử dụng phương pháp nào để đạt được kết quả mong muốn?

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Làm thế nào để bạn xác định z-tọa đại diện bởi mỗi click chuột? Nếu bạn chỉ cần đặt cả 0, thì hình học 2D đủ, và tôi đoán đó không phải là ý định của bạn. –

+0

Một cú nhấp chuột trong không gian 3d sẽ xác định một tia, không phải là một điểm. Tôi tò mò muốn biết làm thế nào bạn đạt được vị trí khối lập phương ở nơi đầu tiên. – tafa

+0

@Marcelo Cantos: Tha thứ cho tôi nếu tôi hiểu sai câu hỏi của bạn, nhưng tôi mới làm quen với điều này và vì vậy mặc dù tôi nghĩ rằng tôi biết những gì bạn đang yêu cầu, tôi vẫn có thể có ý tưởng sai.Về cơ bản nếu khối lập phương của tôi là (100, 200, 300) và tôi nhấp vào (400, 500, 600), tôi cần phải tìm các góc mà tại đó tôi cần phải xoay khối lập phương, để làm cho nó nhìn vào tập thứ hai của tọa độ. –

Trả lời

9

Nếu cube của bạn là A = (x0, y0, z0)

Nếu cube của bạn hiện đang nhìn vào B = (x1, y1, z1)

và nếu bạn muốn nó nhìn vào C = (x2, y2, z2) rồi;

let V1 là vector từ A đến B

v1 = B - Một

và V2 là một từ A đến C

v2 = C - Một

Đầu tiên bình thường hóa chúng.

v1 = v1/|v1| 
v2 = v2/|v2| 

sau đó tính toán góc quay và trục xoay như

angle = acos(v1*v2) //dot product 
axis = v1 X v2 //cross product 

Bạn có thể gọi glRotate với

glRotate(angle, axis[0], axis[1], axis[2]) 
+0

Cảm ơn bạn rất nhiều vì câu trả lời này! Tôi đã tìm kiếm các hướng dẫn và các tài nguyên khác về vấn đề này trong vài ngày qua, và thử nghiệm các công cụ với các sản phẩm dot vv, nhưng kể từ khi tôi chỉ mới đến từ 2D nó đã không được làm cho rất nhiều ý nghĩa với tôi.Nhưng câu trả lời của bạn đã giải thích tất cả mọi thứ tôi cần biết một cách rất rõ ràng, rằng không có nguồn tài nguyên tôi tìm thấy trên google có thể Cảm ơn bạn –

+0

@ Lemon của bạn, vui mừng khi nghe điều đó. – tafa

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