2008-08-23 31 views
10

Tôi đang cố gắng xoay vòng đơn giản trong OpenGL nhưng phải thiếu điểm. Tôi không tìm kiếm một bản sửa lỗi cụ thể nào nhiều như giải thích nhanh hoặc liên kết giải thích vòng xoay OpenGL nói chung.OpenGL Rotation

Tại thời điểm này tôi có mã như thế này:

glPushMatrix(); 
    glRotatef(90.0, 0.0, 1.0, 0.0); 
    glBegin(GL_TRIANGLES);   
    glVertex3f(1.0, 1.0, 0.0);   
    glVertex3f(3.0, 2.0, 0.0);   
    glVertex3f(3.0, 1.0, 0.0);   
    glEnd(); 
glPopMatrix(); 

Nhưng kết quả không phải là một hình tam giác xoay 90 độ.

Chỉnh sửa Hmm nhờ Mike Haboustak - có vẻ như mã của tôi đang gọi hàm SetCamera sử dụng glOrtho. Tôi quá mới để OpenGL có bất kỳ ý tưởng về những gì này có nghĩa là, nhưng vô hiệu hóa điều này và quay trong trục Z tạo ra kết quả mong muốn.

Trả lời

6

Bạn có nhận được 1 đường thẳng không? Có vẻ như thối 90deg. xung quanh Y sẽ khiến bạn nhìn vào bên cạnh một hình tam giác không có chiều sâu.

Thay vào đó, bạn nên thử xoay quanh trục Z và xem bạn có nhận được thứ gì đó có ý nghĩa hơn không.

OpenGL có hai ma trận liên quan đến hiển thị hình học, ModelView và Chiếu. Cả hai được áp dụng cho các tọa độ trước khi dữ liệu hiển thị trên màn hình. Đầu tiên, ma trận ModelView được áp dụng, chuyển đổi dữ liệu từ không gian mô hình thành không gian xem. Sau đó, ma trận Chiếu được áp dụng với việc chuyển đổi dữ liệu từ không gian xem cho "chiếu" trên màn hình 2D của bạn.

ModelView được sử dụng để định vị nhiều đối tượng đến vị trí của chúng trong "thế giới", Phép chiếu được sử dụng để định vị các đối tượng trên màn hình.

Mã của bạn có vẻ tốt, vì vậy tôi giả sử đọc tài liệu bạn biết bản chất của các hàm như glPushMatrix() là gì. Nếu xoay quanh Z vẫn không có ý nghĩa, hãy xác minh rằng bạn đang chỉnh sửa ma trận ModelView bằng cách gọi glMatrixMode.

+0

QUAN TRỌNG! Xem thêm câu trả lời của Perry dưới đây. – Ali

6

Đảm bảo rằng bạn đang sửa đổi ma trận modelview bằng cách đặt những điều sau đây trước khi cuộc gọi glRotatef:

glMatrixMode(GL_MODELVIEW); 

Nếu không, bạn có thể được sửa đổi hoặc là chiếu hoặc một ma trận kết cấu để thay thế.

1

Khi tôi có cái nhìn đầu tiên về OpenGL, NeHe tutorials (xem menu bên trái) là vô giá.

1

Tôi muốn giới thiệu một cuốn sách:

3D Computer Graphics : A Mathematical Introduction with OpenGL Samuel R. Buss

Nó cung cấp những giải thích rất rõ ràng, và toán học được áp dụng rộng rãi để miền không phải là đồ họa. Bạn cũng sẽ tìm thấy mô tả kỹ lưỡng về các dự báo chỉnh hình và các phép biến đổi phối cảnh.

1

Về ma trận chiếu, bạn có thể tìm thấy một nguồn tốt để bắt đầu ở đây:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

Nó giải thích một chút về làm thế nào để xây dựng một loại ma trận chiếu.Phép chiếu chính tả là dạng cơ bản/nguyên thủy của ma trận như vậy và về cơ bản những gì đang thực hiện là lấy 2 trong số 3 trục tọa độ và chiếu chúng lên màn hình (bạn vẫn có thể lật trục và mở rộng chúng nhưng không có hiệu ứng dọc hoặc phối cảnh) .

chuyển đổi ma trận rất có thể một trong những điều quan trọng nhất khi vẽ trong không gian 3D và về cơ bản bao gồm 3 giai đoạn ma trận:

  • Transform1 = Object phối hệ thống thế giới (ví dụ - luân chuyển đối tượng và quy mô)
  • Transform2 = thế giới phối hệ thống camera (đặt đối tượng ở đúng nơi)
  • Transform3 = camera phối hệ thống để không gian màn hình (chiếu vào màn hình)

Thông thường kết quả phép nhân 3 ma trận được gọi là ma trận WorldViewProjection (nếu bạn đã từng sử dụng thuật ngữ này), vì nó biến đổi tọa độ từ Không gian mô hình qua Thế giới, rồi đến Camera và cuối cùng là biểu diễn màn hình.

Have fun

5

Các "Câu trả lời được chấp nhận" là không hoàn toàn đúng - xoay quanh Z sẽ không giúp bạn nhìn thấy hình tam giác này trừ khi bạn đã thực hiện một số điều kỳ lạ trước khi mã này. Việc xóa cuộc gọi glOrtho (...) có thể đã khắc phục sự cố trong trường hợp này, nhưng bạn vẫn gặp một số vấn đề khác.

Hai vấn đề lớn với các mã như viết:

  • Bạn đã đặt camera trước? Trong OpenGL, camera nằm ở gốc, nhìn xuống trục Z, với Y dương lên. Trong trường hợp này, tam giác đang được vẽ trong cùng một mặt phẳng như mắt của bạn, nhưng lên và sang phải. Trừ khi bạn có ma trận chiếu rất lạ, bạn sẽ không thấy nó. gluLookat() là lệnh dễ nhất để thực hiện điều này, nhưng bất kỳ lệnh nào di chuyển ma trận hiện tại (có thể là MODELVIEW) đều có thể được thực hiện để hoạt động.

  • Bạn đang vẽ hình tam giác ở tay trái hoặc phương pháp theo chiều kim đồng hồ, trong khi mặc định cho OpenGL là tay phải hoặc hệ tọa độ ngược chiều kim đồng hồ. Điều này có nghĩa là, nếu bạn đang loại bỏ các mặt sau (mà bạn có thể không, nhưng có khả năng sẽ chuyển sang khi bạn nâng cao hơn), bạn sẽ không thấy hình tam giác như mong đợi. Để xem vấn đề, hãy đặt tay phải của bạn trước mặt và tưởng tượng nó nằm trên mặt phẳng XY, di chuyển ngón tay theo thứ tự bạn vẽ các đỉnh (1,1) đến (3,2) đến (3,1). Khi bạn làm điều này, ngón tay cái của bạn đang đối mặt với khuôn mặt của bạn, có nghĩa là bạn đang nhìn vào mặt sau của tam giác. Bạn cần phải nhận được thói quen vẽ khuôn mặt trong một phương pháp tay phải, vì đó là cách phổ biến nó được thực hiện trong OpenGL.

Điều tốt nhất tôi có thể khuyên bạn nên sử dụng hướng dẫn NeHe - http://nehe.gamedev.net/. Họ bắt đầu bằng cách chỉ cho bạn cách thiết lập OpenGL trong một số hệ thống, di chuyển lên hình tam giác vẽ và tiếp tục từ từ và chắc chắn đến các chủ đề nâng cao hơn. Họ rất dễ làm theo.