2011-08-29 14 views
5

Trước hết, tôi muốn xin lỗi về một câu hỏi dài như vậy. Bạn không cần phải đọc nó. Bạn có thể nhảy thẳng đến các câu hỏi và sau đó tra cứu chi tiết nếu cần (Tôi đã cố gắng cung cấp càng nhiều thông tin càng tốt, vì trong quá trình trải nghiệm quá nhiều mã của tôi tốt hơn quá ít). Vì vậy, ...Nhầm lẫn về việc xoay quanh hình tam giác và biến đổi

Tôi hơi bối rối về việc uốn lượn và chuyển đổi hình tam giác, điều mà tôi nghĩ tôi đã hiểu. Tôi cố gắng để vẽ một khối lập phương được quy định như sau:

const float a = 0.5f; //half of the cube side length 
    float positions[nComponents] = 
    { 
     //front face 
     -a, -a, -a, 
     a, -a, -a, 
     a, a, -a, 

     -a, -a, -a, 
     a, a, -a, 
     -a, a, -a, 

     //back face 
     -a, -a, a, 
     a, a, a, 
     a, -a, a, 

     -a, -a, a, 
     -a, a, a, 
     a, a, a, 

     //up face 
     -a, a, -a, 
     a, a, -a, 
     a, a, a, 

     -a, a, -a, 
     a, a, a, 
     -a, a, a, 

     //down face 
     -a, -a, -a, 
     a, -a, a, 
     a, -a, -a, 

     -a, -a, -a, 
     -a, -a, a, 
     a, -a, a, 

     //right face 
     a, -a, -a, 
     a, -a, a, 
     a, a, a, 

     a, -a, -a, 
     a, a, a, 
     a, a, -a, 

     //left face 
     -a, -a, -a, 
     -a, a, a, 
     -a, -a, a, 

     -a, -a, -a, 
     -a, a, -a, 
     -a, a, a, 
    }; 

Và đây là những màu sắc giả định của khuôn mặt của tôi:

float face_colors[nFaces * dim] = 
{ 
    1,0,0, //front RED 
    1,1,1, //back WHITE 
    0,0,1, //up BLUE 
    0,1,1, //down SKY BLUE 
    0,1,0, //right GREEN 
    1,1,0, //left YELLOW 
}; 

Như bạn có thể nhìn thấy từ những ý kiến, tôi sử dụng thuật ngữ lên, xuống, trái, phải, vv Những từ này có ý nghĩa của chúng nếu chúng ta giả sử rằng chúng ta đang nhìn vào khối lập phương từ vị trí, giả sử, (0, 0, -3a) trong các tọa độ thế giới. Bây giờ, như tôi đã hiểu, mặt trước của khối lập phương của tôi là vết cắt theo chiều kim đồng hồ (nghĩa là, nếu chúng ta nhìn khối lập phương từ bất kỳ vị trí nào bên ngoài nó, và liệt kê các đỉnh trong tam giác chúng ta thấy, chúng ta sẽ cuộn ngược chiều kim đồng hồ) .

Vì vậy, tôi cần phải 1. Bật tính năng hủy. 2. Nói ngược chiều kim đồng hồ là mặt trước 3. Mặt sau lưng. Đây là mã cho rằng:

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 
glFrontFace(GL_CCW); 
glCullFace(GL_BACK); 

Ma trận chiếu của tôi là ma trận chiếu phối cảnh và ma trận modelView chỉ là ma trận LookAt. Chúng được cho ăn như đồng phục cho đổ bóng đỉnh.

ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f); 
glm::vec3 center(0.0f, 0.0f, 0.0f); 
glm::vec3 eye(1.0f, 2.0f, -3.0f); 
glm::vec3 up(0.0f, 1.0f, 0.0f); 
ModelViewMatrix = glm::lookAt(eye, center, up); 
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix)); 
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix)); 

vertex của tôi được định nghĩa như sau:

#version 400 
layout(location = 0) in vec4 vVertex; 
layout(location = 1) in vec4 vColor; 
uniform mat4 P; 
uniform mat4 MV; 
out vec4 vFragColor; 
void main(void) 
{ 
    vFragColor = vColor; 
    gl_Position = P * MV * vVertex; 
} 

fragment shader của tôi là tầm thường - nó chỉ xuất ra màu nội suy.

Bây giờ ... đây là kết quả mà tôi nhận được:

enter image description here

Nếu tôi thay đổi glFrontFace(GL_CCW); để glFrontFace(GL_CW);, hoặc cách khác, thay đổi glCullFace(GL_BACK)-glCullFace(GL_FRONT), tôi nhận được sự mong đợi (ít nhất là hơn dự kiến ​​hơn trước đó, xem quesions thứ hai và thứ ba) render:

enter image description here

tôi thấy ba vấn đề ở đây, ea ch được mô tả trong một câu hỏi:

CÂU HỎI THỰC TẾ:

Q1: Tại sao là điều ngược lại quanh co về những gì tôi dự định? Tôi đã không vết thương các đỉnh ngược chiều kim đồng hồ cho mặt trước?
Q2 Tại sao mặt "trái" và mặt "phải" của tôi chuyển vị trí? Khuôn mặt trái được cho là màu vàng và màu xanh lá cây bên phải, chứ không phải ngược lại! Có gì sai với sự biến đổi của tôi?
Q3 điều gì đó sai với chuyển đổi của tôi vì tọa độ x của vector mắt của tôi là dương, có nghĩa là tôi thực sự sẽ thấy một chút ở bên phải, không phải một chút ở phía bên trái!

Tôi đã hỏi những câu hỏi này cùng nhau bởi vì tôi nghĩ rằng tất cả chúng đều được kết nối và có thể có thứ gì đó rất cơ bản mà tôi thiếu. Cảm ơn bạn rất nhiều vì đã dành thời gian để làm rõ những điều này.

Trả lời

9

OpenGL theo mặc định giả sử hệ tọa độ tay phải, tức là trục Z dương trỏ ra khỏi màn hình. Các vị trí đỉnh khối của bạn cho biết bạn đang giả định một hệ tọa độ thuận tay trái. Tuy nhiên nếu bạn đặt các giá trị đó vào RHS thì tọa độ ngược chiều kim đồng hồ LHS của bạn trở thành theo chiều kim đồng hồ (1), mặt trên một vị trí hoán đổi trục (2) và biến đổi mắt giả định của bạn sẽ đi ngược chiều (3).

+1

Tôi vẫn còn bối rối. Tôi không được tự do định nghĩa hệ thống tọa độ "thế giới" của tôi nhưng tôi thích? Và hàm LookAt có vectơ trong các tọa độ thế giới, phải không? Sau đó, sự khác biệt nào làm cho hướng trục Z mặc định? –

+1

Ahhh ... Tôi nghĩ rằng tôi đang bắt đầu nhận được nó ngay bây giờ ... Tôi không thể thay đổi các *** tương đối *** dispositions của ba trục ngay cả trong hệ thống phối hợp thế giới. Có đúng không? –

+3

@Armen Đúng vậy. Bạn có thể mở rộng ma trận modelview của bạn bằng (1,1, -1) và do đó phản chiếu trục z để giả định hệ thống thuận tay trái của bạn, nhưng tôi sẽ không đề xuất điều này, vì nó sẽ giống như một hack xung quanh tiêu chuẩn thực tế của một hệ thống thuận tay phải. –