2010-08-07 34 views
12

Tôi đang cố gắng hiểu hệ thống tọa độ OpenGL. Ở khắp mọi nơi tôi thấy nó được mô tả như một tay phải, nhưng nó không tương ứng với kinh nghiệm của tôi. Tôi đã cố gắng vẽ một số hình dạng và các đối tượng 3 chiều và tôi thấy rằng các điểm z trục rõ ràng "vào màn hình" (trong khi x trỏ sang phải và y lên - đó là mô tả hệ tọa độ thuận tay trái). Tôi đang thiếu gì?Trường hợp điểm trục OpenGL z?

chỉnh sửa: Ví dụ:
http://img576.imageshack.us/img576/9234/triangles.jpg
Nếu + điểm Z xem, tại sao tam giác màu xanh lá cây, mà z-tọa độ là lớn hơn, là đằng sau một màu đỏ?

initializeGL:

qglClearColor(Qt::darkGray); 
glClearDepth(1.0); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL);  
glEnable(GL_COLOR); 

resizeGL:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef (-30.0, 1.0, 0.0, 0.0); 
glRotatef (20.0, 0.0, 1.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_LINES); 
glVertex3f(45.0, 0.0, 0.0); 
glVertex3f(-45.0, 0.0, 0.0); 
glVertex3f(0.0, 45.0, 0.0); 
glVertex3f(0.0, -45.0, 0.0); 
glVertex3f(0.0, 0.0, 45.0); 
glVertex3f(0.0, 0.0, -45.0); 
glEnd(); 
glBegin(GL_TRIANGLES); 
//Red triangle: 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.0, 0.0, 1.0); 
glVertex3f(0.0, 20.0, 1.0); 
glVertex3f(20.0, 0.0, 1.0); 
//Green triangle:  
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-15.0, 0.0, 20.0); 
glVertex3f(0.0, 25.0, 20.0); 
glVertex3f(15.0, 0.0, 20.0); 
glEnd(); 
+0

"Nếu + Z chỉ người xem, tại sao tam giác màu xanh lục, tọa độ z lớn hơn, phía sau màu đỏ?" Bạn đã xoay toàn bộ cảnh hai lần. Gọi glLoadIdentity cho ma trận chế độ xem mô hình trước khi hiển thị tam giác, sau đó so sánh kết quả. – SigTerm

Trả lời

5

cuối 2 thông số glOrtho tham khảo:

nearVal, farVal
Xác định khoảng cách đến gần hơn và máy bay chiều sâu cắt xa hơn. Các giá trị này là âm nếu mặt phẳng nằm phía sau trình xem.

Mặt cắt gần hơn của bạn ở phía trước người xem và xa hơn, phía sau. Nó sẽ lật trục Z.

+3

Đó là cơ bản những gì tôi đã nói 12 giờ trước câu trả lời này. – JustBoo

+0

Có, trục z thực sự vô tình bị lật nhưng sau đó tôi gặp sự cố khi xác định chính xác dòng mã chịu trách nhiệm cho điều đó – majaen

8

Được rồi, điều mà đứng ra đối với tôi là chức năng glOrtho. Bạn có máy bay cắt gần và xa chỉ cách nhau 100 đơn vị. Điều đó có vẻ rất nhỏ. Bạn có thực sự muốn nó theo cách đó không? Nó được đại diện bởi 2 tham số cuối cùng trong hàm đó.

Ngoài ra đối tượng của bạn rất lớn liên quan đến sự thất vọng nhỏ này. Các đối tượng có thể ngồi ngay trước máy ảnh của bạn và nó sẽ chặn các vật khác khỏi bị nhìn thấy.

Tôi sẽ phóng to tất cả các tham số trong lệnh gọi glOrtho. HTH


Trong hệ thống tay phải (OpenGL) âm Z (-Z) nên trỏ vào màn hình. Tích cực Y nên được "lên", và tích cực X nên ở bên phải.

Điều này có vẻ là những gì bạn mô tả và đó là hệ tọa độ thuận tay phải.

Có lẽ điều này có thể hữu ích. http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

+0

Bởi trục z "vào màn hình" Tôi có nghĩa là tích cực Z (điểm Z lớn hơn của tọa độ là, xa nó được). Tôi không sử dụng glScale với giá trị âm hoặc bất cứ thứ gì như thế này, vì vậy đó là một chút mysteriuos đối với tôi. – majaen

+0

@majaen: Có thể bạn thiết lập ma trận modelview khác nhau. Z càng lớn thì vật thể càng gần bạn. – SigTerm

+1

Bạn có chắc chắn rằng, một nơi nào đó trong mã, một trong các trục không bị "lật"? Tôi nhớ (mơ hồ) một khi tôi lật một số trục xung quanh và thậm chí làm xuất xứ ở phía trên bên trái để chứa một hệ thống trong Windows. Nó xuất hiện một cái gì đó trong mã một nơi nào đó gây ra sự kỳ quặc. – JustBoo

1

Tùy thuộc vào cách bạn vẽ.

Bản sắc cho modelview và gluPerspective thường xuyên cho phép chiếu sẽ mong đợi một hệ tọa độ đầu vào thuận tay phải (như JustBoo đã đề cập, -z là vào màn hình).

nếu bạn tải một bộ ma trận khác nhau, tuy nhiên, không có gì ngăn bạn lật một trong các tọa độ trong ma trận, dẫn đến hệ thống thuận tay trái. (hoặc không phải lật. gluPerspective/glFrustum thực sự lật z tọa độ). Có một số điều thực tế cần lưu ý khi thực hiện việc này, giống như thứ tự cuộn dây để chọn lọc.

5

Tôi đang thiếu gì?

In (cửa quan sát của) hệ thống thuận tay trái x điểm đúng, y điểm lên, z điểm về phía trước (cách xa người xem).

Ở bên phải x điểm bên phải, y chỉ lên, z điểm lạc hậu (về phía trình xem).

Picture

Ảnh được lấy từ wikipedia.

x là ngón tay cái, y là ngón trỏ và z là ngón giữa.

+0

cảm ơn cho liên kết, nó đơn giản hơn nhiều để giải thích với hình ảnh này :) – Calvin1602

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