2011-12-22 49 views
7

Tôi biết có rất nhiều câu hỏi về xoay vòng 3D đã được trả lời ở đây nhưng tất cả chúng dường như đối phó với ma trận quay và quaternions trong OpenGL (và tôi không thực sự quan tâm nếu tôi có khóa gimbal)). Tôi cần phải có được tọa độ 3d EX: (x, y, z) của một điểm mà luôn luôn phải là cùng một khoảng cách, tôi sẽ gọi nó là "d" cho bây giờ, từ nguồn gốc. Thông tin duy nhất tôi có làm đầu vào là deltax và deltay của chuột trên màn hình. Cho đến nay đây là những gì tôi đã cố gắng:xoay vòng vòng quanh nguồn gốc

Đầu tiên:

thetaxz+=(omousex-mouseX)/(width); 
thetaxy+=(omousey-mouseY)/(height); 

(thetaxy là góc theo radian trên x, trục y và thetaxz trên x, z trục) (Tôi hạn chế cả hai góc độ do đó nếu họ là nhỏ hơn hoặc bằng 0 họ bằng 2 * PI)

thứ hai:

pointX=cos(thetaxz)*d; 
pointY=sin(thetaxy)*d; 

(pointX là của điểm tọa độ x và nhọn là y)

Thứ ba:

if(thetaxz)<PI){ 
pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d)); 
}else{ 
    pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d))); 
} 

(vuông() là một hàm vuông và abs() là một chức năng giá trị tuyệt đối) (pointZ nên là của điểm z phối hợp và nó là ngoại trừ tại qua giữa z dương bán cầu và bán cầu z âm. Khi nó tiếp cận các cạnh điểm được kéo dài hơn khoảng cách mà nó luôn luôn được cho là ở trong x và y và dường như ngẫu nhiên khoảng 0,1-0,2 radians của thetaxz tọa độ z trở thành NAN hoặc undefined)

Tôi có suy nghĩ về điều này một thời gian, và trung thực tôi gặp khó khăn trong đầu của tôi xung quanh khái niệm quaternions và ma trận quay tuy nhiên nếu bạn có thể chỉ cho tôi cách sử dụng chúng để tạo ra tọa độ thực tế tôi sẽ rất vui khi học. Tôi vẫn thích nếu tôi chỉ có thể sử dụng lượng giác trong một vài trục. Cảm ơn bạn trước cho bất kỳ sự giúp đỡ và nếu bạn cần thêm thông tin xin vui lòng chỉ cần hỏi.

Ý tưởng gợi ý/phút cuối: Tôi nghĩ rằng nó có thể liên quan đến vị trí z ảnh hưởng đến vị trí x và y nhưng tôi không chắc chắn.

EDIT: Tôi vẽ một sơ đồ: enter image description here

+0

Tôi không phải 100% đây chính là điều bạn muốn, nhưng tôi nghĩ bạn có thể muốn xem [gluUnProject] (http://nehe.gamedev.net/article/using_gluunproject/16013 /) để chuyển đổi tọa độ 2D thành 3D dựa trên ma trận máy ảnh. Làm điều này cho một điểm trên máy bay gần và xa máy bay, và sau đó sử dụng một số trig để tìm điểm dọc theo dòng kết quả của bạn đó là khoảng cách mong muốn từ nguồn gốc. Lưu ý rằng có 0, 1 hoặc 2 giải pháp cho vấn đề này mặc dù, tùy thuộc vào dòng – Hybrid

+3

Bạn có thể nêu rõ vấn đề ban đầu một chút rõ ràng hơn, có lẽ với một hình ảnh? –

+0

Tôi đã thêm một liên kết hình ảnh vì tôi chỉ có 1 đại diện vì tôi mới tham gia trang web này. –

Trả lời

5

Nếu bạn thực sự muốn có bất kỳ thành công trong việc này, bạn sẽ phải nhẫn nhục chịu đựng và tìm hiểu về rotation matrices và/hoặc quaternion rotations. Có thể có những cách khác để làm những gì bạn muốn, nhưng ma trận quay và xoay vòng quaternion được sử dụng đơn giản bởi vì chúng được hiểu rộng rãi và trong số các phương tiện biểu đạt và áp dụng phép quay đơn giản nhất cho vectơ. Bất kỳ đại diện nào khác mà ai đó có thể đưa ra có lẽ sẽ là một sự cải cách phức tạp hơn của một hoặc cả hai. Trong thực tế, nó có thể được hiển thị quay là một linear transformation và do đó có thể được thể hiện như là một matrix. Quaternion quay chỉ là một phương tiện đơn giản của luân phiên vectơ trong 3D, và do đó có đại diện ma trận tương đương.

Điều đó có vẻ như bạn đang quan tâm đến việc lấy một đối tượng trong cảnh của bạn bằng một cú click chuột và xoay theo một cách tự nhiên. Nếu đúng như vậy, bạn nên xem phương thức ArcBall (có numerous examples bạn có thể muốn xem qua). Điều này vẫn yêu cầu bạn biết một chút về quaternions. Bạn cũng sẽ thấy rằng ít nhất một sự hiểu biết tối thiểu về các khía cạnh cơ bản của linear algebra sẽ hữu ích.

Cập nhật: Dựa trên biểu đồ của bạn và nhận xét chứa trong đó, có vẻ như tất cả những gì bạn thực sự cố gắng làm là chuyển đổi Spherical Coordinates thành Cartesian Coordinates. Miễn là chúng tôi đồng ý về ký hiệu, thật dễ dàng. Gọi θ là góc bạn đang gọi XY, nghĩa là góc giữa trục X xoay quanh trục Z; điều này được gọi là góc góc phương vị và sẽ nằm trong phạm vi [0, 2 π) radian hoặc [0 °, 360 °). Gọi φ là một góc giữa mặt phẳng XY và vectơ của bạn; điều này được gọi là góc độ cao và sẽ nằm trong phạm vi [- π/2, + π/2] hoặc [-90 °, +90 °] và nó tương ứng với góc bạn đang gọi góc XZ (xoay vòng trong Mặt phẳng XZ về trục Y). Có những công ước khác, vì vậy hãy chắc chắn rằng bạn nhất quán. Dù sao, việc chuyển đổi chỉ đơn giản là:

x = d∙cos(φ)∙cos(θ) 
y = d∙cos(φ)∙sin(θ) 
z = d∙sin(φ)
+0

Cảm ơn, nhưng tôi không sử dụng opengl và tôi không thực sự lấy một đối tượng Tôi quay camera cảnh không chuyển đổi hệ tọa độ cảnh. Có cách nào để có được tọa độ từ một ma trận xoay vì sau đó tôi có thể sử dụng chúng? –

+0

Dựa trên biểu đồ của bạn, tôi nghĩ bạn chỉ muốn chuyển đổi từ tọa độ hình cầu sang Descartes. Tôi đã chỉnh sửa phản hồi của tôi để chỉ cho bạn cách thực hiện điều đó. Nếu bạn đang cố gắng để làm bất cứ điều gì tương tác với con chuột và di chuyển máy ảnh của bạn về nguồn gốc theo cách này, tôi không nghĩ rằng bạn sẽ nhận được khá kết quả bạn đang hy vọng. Điều đó nói rằng, tôi thực sự nghĩ rằng bạn sẽ tốt hơn ít nhất là xem xét cách tiếp cận ArcBall. – andand

+0

Cảm ơn bạn, tôi đã tìm ra điều đó ngay trước khi bạn đăng bài này nhưng vẫn cảm ơn! Trợ giúp tuyệt vời tôi sẽ cung cấp cho bạn cộng một nhưng tôi không hoàn toàn có đủ đại diện cho bản thân mình. Tôi sẽ cố gắng và quay lại sau vì bạn rất hữu ích và có nhiều thông tin. –

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