30 พฤษภาคม 2553

OpenGL สร้างสีเหลี่ยมที่ไม่ใช่ลูกบาศก์

OpenGL สร้างสีเหลี่ยมที่ไม่ใช่ลูกบาศก์ จากสีีเหลี่มลูกบาศก์
โดยปกติ glut จะมีฟังก์ชัน glutWireCube สำหรับสร้างลูกบาศก์ได้อย่างง่ายดายในคำสั่งเดียว
แต่หากเราต้องการสร้างรูปที่ไม่เป็นลูกบาศก์โดยวิธีดังเดิม
โดยการกำหนดจุด มุมแต่ละจุดของแล้วสร้างเป็น polygon มาต่อกัน
ดูได้จาก GL Manager ของ อ.สยาม
void CGLMgrDlg::Box(GLdouble x0, GLdouble x1, GLdouble y0, GLdouble y1,
        GLdouble z0, GLdouble z1, GLenum type)
{
    static GLdouble n[6][3] = {
        {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
        {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}
    };
    static GLint faces[6][4] = {
        { 0, 1, 2, 3 }, { 3, 2, 6, 7 }, { 7, 6, 5, 4 },
        { 4, 5, 1, 0 }, { 5, 6, 2, 1 }, { 7, 4, 0, 3 }
    };
    GLdouble v[8][3], tmp;
    GLint i;

    if (x0 > x1) {
        tmp = x0; x0 = x1; x1 = tmp;
    }
    if (y0 > y1) {
        tmp = y0; y0 = y1; y1 = tmp;
    }
    if (z0 > z1) {
        tmp = z0; z0 = z1; z1 = tmp;
    }
    v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0;
    v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1;
    v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
    v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
    v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0;
    v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1;

    for (i = 0; i < 6; i++) {
        glBegin(type);
        glNormal3dv(&n[i][0]);
        glVertex3dv(&v[faces[i][0]][0]);
        glNormal3dv(&n[i][0]);
        glVertex3dv(&v[faces[i][1]][0]);
        glNormal3dv(&n[i][0]);
        glVertex3dv(&v[faces[i][2]][0]);
        glNormal3dv(&n[i][0]);
        glVertex3dv(&v[faces[i][3]][0]);
        glEnd();
    }
}


void CGLMgrDlg::SolidBox(double width, double height, double depth)
{
    Box(-width/(GLdouble)2., width/(GLdouble)2., -height/(GLdouble)2., height/(GLdouble)2.,-depth/(GLdouble)2., depth/(GLdouble)2., GL_QUADS);
}



ซึ่งจะวุ่นวายมากแม้จะทำ Wrapper Class ให้ใช้งานได้ง่ายๆ แล้วก็ตามนอกจากนี้หากต้องการสร้างรูปแบบ Wire
เพื่อใช้ test เส้นขอบของวัตถุฉายลงมาตรงวัตถุหรือไม่ หากเป็นรูปทรงสี่เหลี่ยม ต้องสร้าง Line ให้ครบทุกด้านเลยทีเดียวซึ่งยุ่งยากมาก

แต่ในที่นี้เราจะใช้เทคนิคสร้างลูกบาศก์ขึ้นมาขนาด 1x1x1 แล้วใช้การขยายขนาดโดย Transformation Matrix
เช่นเราอยากให้สีเหลี่ยมขนาด กว้าง x ยาว x ลึก  เช่น 50 x 25 x 25
เราจะขยายมุมของกล่องโดยใช้ฟังกชัน glScaled
    /*
    * Wire Box + Scale
    */
    glPushMatrix ();
        glColor3f (1.0, 1.0, 1.0);
        glScaled (50.0, 25.0, 25.0);
        glutWireCube (1);
    glPopMatrix ();
ทำให้เขียนโปรแกรมได้ง่ายขึ้นมากโดยคำสั่งแค่ 2 บรรทัด ก็สามารถสร้างกล่องขนาดต่างๆกันได้มากมาย

ไม่มีความคิดเห็น: