2009-12-14 56 views
8

Tôi muốn biết cách vẽ hình xoắn ốc.cách vẽ hình xoắn ốc bằng cách sử dụng opengl

tôi đã viết mã này:

void RenderScene(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    GLfloat x,y,z = -50,angle; 
    glBegin(GL_POINTS); 

    for(angle = 0; angle < 360; angle += 1) 
    { 
     x = 50 * cos(angle); 
     y = 50 * sin(angle); 
     glVertex3f(x,y,z); 
     z+=1; 
    } 
    glEnd(); 
    glutSwapBuffers(); 
} 

Nếu tôi không bao gồm các điều khoản z tôi nhận được một vòng tròn hoàn hảo nhưng khi tôi bao gồm z, sau đó tôi nhận được 3 dấu chấm đó là nó. Điều gì có thể đã xảy ra?

tôi đặt viewport sử dụng glviewport (0,0, w, h)

Để đưa z i nên làm gì để thiết lập khung nhìn theo hướng z?

Trả lời

14

Bạn thấy điểm vì bạn đang vẽ điểm với glBegin(GL_POINTS). Thử thay thế bằng glBegin(GL_LINE_STRIP).

LƯU Ý: khi bạn nhìn thấy vòng tròn, bạn cũng chỉ vẽ các điểm, nhưng được vẽ đủ gần để xuất hiện dưới dạng vòng tròn được kết nối.

Ngoài ra, bạn có thể chưa thiết lập bộ đệm độ sâu để chấp nhận các giá trị trong phạm vi z = [-50, 310] mà bạn sử dụng. Các đối số này phải được cung cấp dưới dạng số zNearzFar cắt máy bay trong số cuộc gọi gluPerspective, glOrtho() hoặc glFrustum() của bạn.

LƯU Ý: điều này sẽ giải thích tại sao với giá trị z bạn chỉ thấy một vài điểm: các điểm khác được cắt bớt vì chúng nằm ngoài phạm vi z-buffer.

CẬP NHẬT SAU BẠN đã chỉ ra mã của bạn:

glOrtho(-100*aspectratio,100*aspectratio,-100,100,1,-1); sẽ chỉ cho phép z-giá trị trong [-1, 1] phạm vi, đó là lý do tại sao chỉ có ba điểm với z = -1, z = 0z = 1 sẽ rút ra (do đó 3 điểm).

Cuối cùng, bạn có thể đang xem hình xoắn ốc từ trên cùng, nhìn trực tiếp theo hướng của trục xoay. Nếu bạn không sử dụng phép chiếu phối cảnh (nhưng một phép chiếu đẳng động), hình xoắn ốc sẽ vẫn hiển thị dưới dạng hình tròn. Bạn có thể muốn thay đổi chế độ xem của mình với gluLookAt().

VÍ DỤ HÀNH LẬP QUAN ĐIỂM

Sau đây code được lấy từ các hướng dẫn OpenGL tuyệt vời bởi NeHe:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix 
glLoadIdentity();       // Reset The Projection Matrix 

// Calculate The Aspect Ratio Of The Window 
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); 

glMatrixMode(GL_MODELVIEW);      // Select The Modelview Matrix 
glLoadIdentity();       // Reset The Modelview Matrix 

Sau đó, trong draw loop của bạn sẽ trông như thế này:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth Buffer 
glLoadIdentity(); 
glTranslatef(-1.5f,0.0f,-6.0f);     // Move Left 1.5 Units And Into The Screen 6.0 
glBegin(GL_TRIANGLES);      // Drawing Using Triangles 
    glVertex3f(0.0f, 1.0f, 0.0f);    // Top 
    glVertex3f(-1.0f,-1.0f, 0.0f);    // Bottom Left 
    glVertex3f(1.0f,-1.0f, 0.0f);    // Bottom Right 
glEnd();  

Tất nhiên, bạn nên thay đổi mã ví dụ này theo nhu cầu của bạn.

1

catchmeifyoutry cung cấp phương pháp hoàn toàn có khả năng, nhưng sẽ không vẽ hình xoắn ốc 3D chính xác về không gian, vì bất kỳ lệnh gọi render nào sử dụng kiểu nguyên thủy GL_LINE sẽ rasterize thành độ rộng pixel cố định. Điều này có nghĩa là khi bạn thay đổi phối cảnh/chế độ xem, các dòng sẽ không thay đổi chiều rộng. Để thực hiện việc này, hãy sử dụng trình đổ bóng hình học kết hợp với GL_LINE_STRIP_ADJACENCY để tạo hình học 3D có thể được rasterized giống như bất kỳ hình học 3D nào khác.(Tuy nhiên, điều này yêu cầu bạn sử dụng đường ống chức năng cố định sau)

Tôi khuyên bạn nên thử phương pháp của catchmeifyoutry trước tiên vì nó sẽ đơn giản hơn nhiều. Nếu bạn không hài lòng, hãy thử phương pháp tôi mô tả. Bạn có thể sử dụng các bài sau đây là hướng dẫn:

http://prideout.net/blog/?tag=opengl-tron

+0

Thật thú vị khi đọc, mr. salad :) – catchmeifyoutry

+0

Vâng, blog đó có đầy đủ các thuật toán đồ họa tuyệt vời. Đây là yêu thích của tôi: http://prideout.net/blog/?p=69 –

1

Dưới đây là chức năng Spiral tôi trong C. Các điểm được lưu vào một danh sách có thể dễ dàng được vẽ bởi OpenGL (ví dụ như kết nối điểm liền kề trong danh sách với GL_LINES) .

  • cx, cy ... xoắn ốc trung tâm x và y phối
  • r ... bán kính xoắn tối đa
  • NUM_SEGMENTS ... số phân đoạn xoắn ốc sẽ có

    SOME_LIST* UniformSpiralPoints(float cx, float cy, float r, int num_segments) 
    { 
    SOME_LIST *sl = newSomeList(); 
    int i; 
    
    for(i = 0; i < num_segments; i++) 
    { 
    float theta = 2.0f * 3.1415926f * i/num_segments; //the current angle 
    
    float x = (r/num_segments)*i * cosf(theta); //the x component 
    float y = (r/num_segments)*i * sinf(theta); //the y component 
    
    //add (x + cx, y + cy) to list sl 
    
    } 
    return sl; 
    } 
    

Một hình ảnh ví dụ với r = 1, num_segments = 1024:

enter image description here

P.S. Có sự khác biệt trong việc sử dụng cos (double) và cosf (float). Bạn sử dụng biến số float cho hàm cos kép.

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