Tag: 3D

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 2 โปรแกรมคำนวณค่าพิกัดจุดศูนย์กลางวงกลม (Circle Center Calc)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 2 โปรแกรมคำนวณค่าพิกัดจุดศูนย์กลางวงกลม (Circle Center Calc)

จุดศูนย์กลางวงกลมนั้นสำคัญไฉน

ในงานสำรวจสำหรับการก่อสร้างเช่นเข็มเจาะ ในขั้นตอนแรกช่างสำรวจจะวางตำแหน่งจุดศูนย์กลางของเสาเข็ม จากนั้นจะวัด offset อย่างน้อยสามด้านตั้งฉากแล้วตอกเหล็กเช่นเหล็กข้ออ้อยลงไปเป็นหมาย ขั้นตอนต่อไปจะปักปลอกเหล็ก (Casing) ในชั้นดินอ่อนเพื่อกันดินทลายตัวลง ในขั้นตอนนี้ช่วงการปักปลอกเหล็กจะมีการวัดระยะจากหมายที่ offset ไว้เพื่อให้ปลอกเหล็กอยู่ในตำแหน่งทั้งทางราบและทางดิ่ง เมื่อปลอกเหล็กลงไปสุดแล้ว เพื่อความมั่นใจว่าได้ตำแหน่งที่ถูกต้องแล้ว จะสำรวจเพื่อเก็บค่าพิกัดคือจุดศูนย์กลางของปลอกเหล็ก แต่คำถามคือจะวัดค่าพิกัดจุดศูนย์กลางของปลอกเหล็กวงกลมได้อย่างไร ในทางปฏิบัติบางครั้งจะใช้ตะแกรงเหล็กปิดปากปลอกเหล็ก แล้วช่างสำรวจจะใช้ตลับเมตรวัดระยะครึ่งหนึ่งของเส้นผ่าศูนย์กลางสองด้านตั้งฉากกันแล้วทำเครื่องหมายไว้บนกระดานไม้ จากนั้นจึงจะวัดค่าพิกัดโดยการตั้งเป้าปริซึม ถ้าใช้มินิปริซึม ตั้งต่ำจะให้ค่าที่ถูกต้องดียิ่งขึ้น แต่ปัญหาคือตอนใช้ตลับเมตรวัดกึ่งกลาง (เส้นที่ผ่านจุดศูนย์กลางคือเส้นที่ยาวที่สุด) เพื่อหาตำแหน่งศูนย์กลางนั้นใช้เวลาพอสมควรและมี error จากการคาดคะเน

วิธีต่อไปที่จะนำเสนอเพื่อทำให้การวัดค่าพิกัดทำได้เร็วขึ้น จะใช้สูตรทางคณิตศาสตร์มาช่วย โดยการวัดค่าพิกัดสามจุดโดยแบ่งให้ระยะห่างแต่ละจุดเท่าๆกัน จากนั้นช่างสำรวจจะใช้เครื่องคิดเลข คำนวณหาค่าพิกัดจุดศูนย์กลาง วิธีการนี้จะใช้เวลารวดเร็วกว่าวิธีแรกพอสมควร ในความเป็นจริงวิธีนี้อยู่บนสมมติฐานว่าปลอกเหล็กต้องไม่บุบเบี้ยว เมื่อได้ค่าพิกัดจุดศุนย์กลางมาแล้วจะนำมาเทียบกับค่าพิกัดที่ได้จากแบบ drawing ถ้าพบว่าค่าต่างกันมากเกินที่กำหนดไว้ จะต้องถอนปลอกเหล็กและทำการปักใหม่

คำนวณได้ทั้ง 2D และ 3D

โปรแกรมที่ผมเขียนนั้นคำนวณได้ทั้ง 2D (ไม่ต้องป้อนค่าระดับ) และ 3D (ป้อนค่าระดับไปด้วย) ส่วนสูตรนั้นถ้าคำนวณแบบ 3D นั้นค่อนข้างซับซ้อน ผมใช้วิธีทางลัดคือไปดูโค้ดที่มีคนเขียนไว้ในอินเทอร์เน็ต โค้ดเดิมเป็น Visual Basic ผมแปลงเป็นโค้ดภาษาซี ส่วนการคำนวณ 2D นั้นซับซ้อนน้อยกว่ามาก ถ้าสนใจสูตรก็สามารถดูจากโค้ดของผมได้

int calcCircleCenter3D(double Ya, double Xa, double Za, 
                       double Yb, double Xb, double Zb, 
                       double Yc, double Xc, double Zc, 
                       double *YCen, double *XCen, double *ZCen, double *Radius){
    double AB, BC, AC;
    double ABi, ABj, ABk, ACi, ACj, ACk, CDi, CDj, CDk, Ni, Nj, Nk;
    double cosBAC, sinBAC;
    double AD, CD, Xd, Yd, Zd;
    double X2e, Y2e, Z2e;

	//if the two points are on the same coordinates stop and return.
    if (((Xa == Xb) && (Ya == Yb)) || ((Xa == Xc) && (Ya == Yc)) 
     || ((Xb == Xc) && (Yb == Yc)))
      return 0;

    //Xa = 80.779; Ya = 90.198; Za = 23.567;
    //Xb = 78.334; Yb = 66.990; Zb = 25.567;
    //Xc = 45.345; Yc = 67.623; Zc = 34.123;
    // Answer Radius = 21.778
    // N Center = 80.840, E Center = 61.890, Z Center = 29.037

    //Lengths of AB, AC, AC
    AB = sqrt(pow(Xa - Xb, 2) + pow(Ya - Yb, 2) + pow(Za - Zb, 2));
    BC = sqrt(pow(Xb - Xc, 2) + pow(Yb - Yc, 2) + pow(Zb - Zc, 2));
    AC = sqrt(pow(Xa - Xc, 2) + pow(Ya - Yc, 2) + pow(Za - Zc, 2));
    //Direction cosines of AB(ABi,ABj,ABk)
    ABi = (Xb - Xa) / AB;
    ABj = (Yb - Ya) / AB;
    ABk = (Zb - Za) / AB;
    //Direction cosines of AC(ACi,ACj,ACk)
    ACi = (Xc - Xa) / AC;
    ACj = (Yc - Ya) / AC;
    ACk = (Zc - Za) / AC;
    //Cosine of angle BAC
    cosBAC = (pow(AB, 2) + pow(AC, 2) - pow(BC, 2)) / (2 * AB * AC);
    AD = cosBAC * AC;
    CD = sqrt(pow(AC, 2) - pow(AD, 2));
    //Position of point D, which is C projected normally onto AB
    Xd = Xa + (AD * ABi);
    Yd = Ya + (AD * ABj);
    Zd = Za + (AD * ABk);
    //Direction cosines of CD(Cdi,CDj,CDk)
    CDi = (Xc - Xd) / CD;
    CDj = (Yc - Yd) / CD;
    CDk = (Zc - Zd) / CD;
    //Direction cosines of normal to AB and CD
    //to be used for rotations of circle centre
    Ni = (ABk * CDj) - (ABj * CDk);
    Nj = (ABi * CDk) - (ABk * CDi);
    Nk = (ABj * CDi) - (ABi * CDj);
    //# Diameter of circumscribed circle of a triangle is equal to the
    //the length of any side divided by sine of the opposite angle.
    //This is done in a coordinate system where X is colinear with AB, Y is // to CD,
    //and Z is the normal (N) to X and Y, and the origin is point A
    //  R = D / 2
    sinBAC = sqrt(1 - pow(cosBAC, 2));
    *Radius = (BC / sinBAC) / 2;
    //Centre of circumscribed circle is point E
    X2e = AB / 2;
    Y2e = sqrt((*Radius) * (*Radius) - X2e * X2e);
    Z2e = 0;
    //Transform matrix
    //                   Rotations                 Translations
    //           ——————————————————————————————————————————————
    //              ABi  ,   ABj  ,  ABk                 Xa
    //              CDi  ,   CDj  ,  CDk                 Ya
    //               Ni  ,    Nj  ,   Nk                 Za
    //           ——————————————————————————————————————————————
    //Position of circle centre in absolute axis system
    *XCen = Xa + (X2e * ABi) + (Y2e * CDi) + (Z2e * Ni);
    *YCen = Ya + (X2e * ABj) + (Y2e * CDj) + (Z2e * Nj);
    *ZCen = Za + (X2e * ABk) + (Y2e * CDk) + (Z2e * Nk);
    return 1;
}

int calcCircleCenter2D(double N1, double E1, double N2, double E2, 
                       double N3, double E3,
                       double *Nc, double *Ec, double *Radius){
    double midN12, midE12, midN23, midE23;
    double k, l, p, q, r, s;
    
    //1 23.432m 78.234m
    //2 45.323m 98.765m
    //3 67.334m 66.999m
    //Answer R=22.907, N Center = 75.876, E Center = 46.217

    if (((N2 == N1) && (E2 == E1)) ||
       ((N2 == N3) && (E2 == E3)) ||
       ((N1 == N3) && (E1 == E3)))
      return 0;

    midN12 = (N1 + N2) / 2.0;
    midE12 = (E1 + E2) / 2.0;
    midN23 = (N2 + N3) / 2.0;
    midE23 = (E2 + E3) / 2.0;


    k = atan((E2-E1)/(N2-N1)) + PI / 2.0;
    l = atan((E2-E3)/(N2-N3)) + PI / 2.0;
    p = 1.0 / tan(k);
    q = 1.0 / tan(l);
    r = tan(k);
    s = tan(l);
    *Ec = ((midE23*q)-(midE12*p)+midN12-midN23)/(q-p);
    *Nc = ((midN23*s)-(midN12*r)+midE12-midE23)/(s-r);
    *Radius = sqrt((E1-*Ec)*(E1-*Ec) + (N1-*Nc)*(N1-*Nc));
    return 1;
}

ดาวน์โหลดโปรแกรม

ไปดาวน์โหลดโปรแกรมได้ที่หน้าดาวน์โหลด  หาโปรแกรมชื่อ Circle Center Calc จะได้ไฟล์มาชื่อ “ARCCENPT.g1a” วิธีการติดตั้งสามารถทำได้หลายวิธี วิธีแรกผมเขียนไว้แล้วที่ตอนที่ 1 ด้วยการ  copy โปรแกรมลง SD card แล้วถ่ายเข้าเครื่องคิดเลขอีกที วิธีที่ 2 ใช้โปรแกรม FA-124 ของ casio

การใช้งาน FA-124

โปรแกรม FA-124 สามารถไปดาวน์โหลดได้ที่ ลิ๊งค์ นี้ จากนั้นแตก zip แล้วทำการติดตั้งง่ายๆ เป็นโปรแกรมเล็กๆ  ผมเข้าใจว่าช่วงติดตั้งน่าจะมีการติดตั้งไดรเวอร์ของ casio ลงไปด้วย เพราะหลังจากนั้นผมเปิดโปรแกรม FA-124 แล้วเอาสาย USB  มาเสียบเชื่อมต่อเครื่องคิดเลขกับคอมพิวเตอร์จะมองเห็นได้ทันที  ที่เครื่องคิดเลขกดคีย์บอร์ดปุ่ม “F1” เพื่อจะเข้าโหมดการโอนข้อมูล (Data Transfer) คำเตือนการเสียบสาย USB นี้ไม่ควรจะนานเกิน 15 นาที เพราะจอภาพเครื่องคิดเลขจะเสื่อมสภาพได้ 

ส่วนหน้าตาโปรแกรม FA-124 ก็ประมาณนี้

จากนั้นมองที่หน้าต่างด้านขวามือคลิกที่ไอคอนที่วงด้วยหมายเลข “1” จากนั้นมาคลิกขวาที่วงด้วยหมายเลข “2” ที่คำว่า Default เลือกเมนู “Import

จะมีไดอะล๊อกบ็อกซ์ ให้เลือกโฟลเดอร์และไฟล์ ไปที่ไฟล์ “ARCCENPT.g1a” ที่เก็บไว้ในเครื่องคอมพิวเตอร์ ตรง Files of type ต้องเลือกเป็น “G1A File (*.g1a)

จะเห็นไฟล์ “ARCCENPT.g1a” เข้ามาใต้ลิสต์ของคำว่า “Default” ดังรูป ที่หน้าต่างด้านซ้ายให้คลิกที่ไอคอนรูปเครื่องคิดเลข ตามที่ผมวงไว้หมายเลข “1” โปรแกรมจะอ่านไฟล์จาก Storage memory ของเครื่องคิดเลข มาแสดงใต้คำว่า “User1” จากนั้นลากไฟล์ “ARCCENPT.g1a” มาวางที่คำว่า User1 (เผอิญเครื่องคิดเลขผมมีไฟล์นี้อยู่แล้ว) โปรแกรมจะถามว่าต้องการทับหรือไม่ตอบ “Yes” 

ก็เป็นอันว่าขั้นตอนเกือบจะเสร็จ ตอนนี้โปรแกรมนี้จะไปอยู่ใน Storage memory ของเครื่องคิดเลขเรียบร้อย ไม่ลืมว่าขนาดของเมมโมรีนี้ 1.5 MB โปรแกรมขนาดนี้สามารถวางได้ประมาณ 30-40 โปรแกรม ซึ่งเหลือเฟือมาก จากนั้นคลิกที่ไอคอนเพื่อทำการ disconnect และอย่าลืมดึงสาย USB ออก

ทดสอบการใช้โปรแกรมคำนวณจุดศูนย์กลางวงกลม (Circle Center Calc)

ที่เครื่องคิดเลขกดคีย์ “MENU”  จากนั้นเลื่อนลงมาที่โปรแกรมดังรูปด้านล่าง

จะเห็นเมนูของโปรแกรม ซึ่งมีให้เลือก 3 โปรแกรมย่อย ส่วนโปรแกรมที่ 3 นั้นเป็นของแถม

    1. 3 Points in 3D  (Circle Center in 3D) – คำนวณหาค่าพิกัดและค่าระดับจุดศูนย์กลางวงกลม โดยค่าที่ป้อน 3 จุดต้องประกอบด้วยค่าพิกัดและค่าระดับ (X, Y, Z)
    2. 3 Points in 2D (Circle Center in 2D) – คำนวณหาค่าพิกัดของจุดศูนย์กลางวงกลม โดยค่าที่ป้อน 3 จุด เฉพาะค่าพิกัดทางราบเท่านั้น
    3. 2 Angles & 1 Dist – คำนวณหาค่าพิกัดของจุดศูนย์กลางวงกลม โดยวัดมุมสองมุมที่ขอบของวงกลมและวัดระยะราบที่ขอบวงกลมตรงจุดแบ่งครึ่งระหว่างขอบวงกลม อธิบายไม่เห็นภาพค่อยดูรูปอีกทีภายหลัง

คำนวณหาจุดศูนย์กลางวงกลมแบบ 3D (Circle Center in 3D)

ที่เมนูกดเลข “1” ป้อนค่าพิกัด N, E  ตอนถามค่า Z คือป้อนค่าระดับ โดยที่จุดที่เก็บค่าพิกัดและระดับมามี 3 จุด จุดไม่ต้องเรียงตามลำดับเส้นรอบวงก็ได้

จากนั้นกด “EXE” เพื่อคำนวณหาค่าพิกัดและค่าระดับของจุดศูนย์กลาง ผลลัพธ์ดังรูปด้านล่าง

คำนวณหาจุดศูนย์กลางวงกลมแบบ 2D (Circle Center in 2D)

ที่เมนูกดเลข “2” ทดสอบป้อนตัวเลขดังนี้ ป้อนค่าพิกัดจุดที่ 1, 2 และ 3

กด “EXE”  จะได้ผลลัพธ์ดังนี้

คำนวณหาจุดศูนย์กลางวงกลมแบบวัดมุมและระยะทาง

ในบางครั้งการเก็บ As-built เช่นเสากลม เราไม่สามารถวัดค่าพิกัดของศูนย์กลางได้ จึงต้องใช้วัดทางอ้อมและใช้สูตรทางคณิตศาสตร์ช่วย จากรูปด้านล่างจะวัดมุมที่ขอบด้านซ้ายและขอบด้านขวาป้อนเข้าโปรแกรม จากนั้นโปรแกรมจะให้เปิดมุมมาที่ตรงกลาง (ถ้าการวัดมุมมีความแม่นยำ มุมที่ตรงกลางนี้จะผ่านจุดศูนย์กลางวงกลมพอดี) แล้วทำการวัดระยะทาง สุดท้ายโปรแกรมจะคำนวณค่าพิกัดจุดศูนย์กลางให้

ที่เมนูหลักกดคีย์เลข “3” ทดสอบโปรแกรมด้วยการป้อนข้อมูลดังนี้ โดยที่ BS = Back Station คือจุดเป้าหลัง ส่วน STA คือ Station  จุดตั้งกล้องนั่นเอง

จากนั้นโปรแกรมจะให้ set มุมของกล้องไปที่กึ่งกลางวงกลม จากนั้นวัดระยะทาง

และป้อนค่าระยะทาง สุดท้ายโปรแกรมจะคำนวณหาค่าพิกัดจุดศูนย์กลางวงกลมและรัศมีวงกลมมาด้วย

สรุป

โปรแกรมนี้เป็นโปรแกรมลำดับที่ 2 ผมหวังว่าคงเป็นประโยชน์ในแวดวงสำรวจบ้านเราบ้างไม่มากก็น้อย โปรแกรมต่างๆเหล่านี้ จะถูกปรับปรุงแก้ไขในอนาคต ท่านผู้อ่านอาจจะสังเกตเห็นว่า เวลาเรียกโปรแกรมมาอีกครั้ง จะไม่เรียกค่าเดิมที่เคยป้อนไว้ ทำให้ต้องป้อนใหม่ทุกครั้ง ในตอนนี้ผมไม่สามารถอ่านหรือเขียนค่าลงตัวแปรอักษร A-Z ได้ เพราะ casio ไม่ได้เขียนเอกสารไว้ (undocumented) แต่สักพักผมคิดว่าคงหาทางได้ เพราะมีคนทำ reverse engineering เครื่องคิดเลขรุ่นนี้พอสมควร แต่ละโปรแกรมที่ใช้สามารถเก็บค่าที่ป้อนเข้าตัวแปรตัวอักษร A-Z เวลาเรียกโปรแกรมมาใช้อีกครั้งถ้าค่าในตัวแปรไม่ได้ถูกทับไปก็สามารถกด “EXE” ผ่านไปได้เลย ติดตามกันตอนต่อไปครับ

 

 

การกลับมาของ OpenGL เพื่อมาต่อกรกับ DirectX

ท้าวความถึง OpenGL

  • OpenGL มองในด้านโปรแกรมมิ่งจะเป็นคำสั่งชุดหรือ APIs (Application Program Interface) สำหรับให้ผู้พัฒนาโปรแกรมด้าน 3D สามารถเรียกใช้ความสามารถจากฮาร์ดแวร์บนเครื่องคอมพิวเตอร์ OpenGL เป็น Cross-Platform สามารถจะใช้ได้บนวินโดส์ ลีนุกซ์ บนแมค
  • สำหรับโปรแกรมด้าน 3D พอจะแบ่งได้คร่าวๆ 3 ประเภทคืออย่างแรกด้าน CAD & GIS อย่างที่สองคือโปรแกรมด้าน 3D Graphic Animation(3D Max, Maya) อย่างหลังคือ Game ซึ่งเป็นตลาดที่ใหญ่มาก โปรแกรมจำพวกนี้ถ้าไม่ใช้ OpenGL ก็ใช้ DirectX ของ Microsoft ซึ่งจะได้กล่าวอีกครั้ง

ผู้ก่อกำเนิด OpenGL

  • ย้อนหลังไปในปี 1981 บริษัทฯ Silicon Graphics International Corp ได้ถูกก่อ โดย Jim Clark  ต่อไปจะเรียกชื่อบริษัทฯนี้สั้นๆว่า SGI ซึ่งตั้งขึ้นมาเพื่อตลาดด้าน 2D & 3D Graphic ประกอบไปด้วยฮาร์ดแวร์และซอฟแวร์ คือขายรวมกัน ฮาร์ดแวร์ส่วนใหญ่เป็น workstation ทำงานอยู่บน Unix
  • บทบาทที่สำคัญของ SGI คือออกแบบไลบรารี IRIS GL และสร้าง APIs สำหรับให้นักพัฒนาโปรแกรมบน workstation ของ SGI ได้พัฒนาโปรแกรมด้าน 2D & 3D บน platform ของ SGI นับว่าเป็นการปฏิวัติวงการกราฟฟิคซึ่งจะมีบทบาทอย่างสูงในช่วงปี 1990
  • ต้นปี 1990 SGI คือผู้นำในวงการ 3D Graphic เพราะความเสามารถด้านฮาร์ดแวร์และไลบรารี IRIS GL ที่มีความยืดหยุ่นใช้งานได้ง่าย ความสามารถสูงและเป็นมาตรฐานสำหรับงาน 3D Graphic แต่ก็มีปัญหาตามมาคือ platform ของ SGI ยังเป็นระบบปิด ทำให้คู่แข่งไม่มีโอกาสและความได้เปรียบ ปี 1992 ทาง SGI จึงทำการแก้ไข IRIS GL ใหม่โดยยกเลิกสิ่งที่ไม่เกี่ยวข้องบางอย่างออก และเรียกว่า OpenGL (Open Graphic Library) เพื่อให้ผู้ผลิดฮาร์ดแวร์สามารถนำพัฒนา Device Driver ให้มีความสามารถด้าน 3D Graphic ตามไลบรารีที่ SGI ได้ออกแบบไว้ ในที่สุด OpenGL ก็กลายเป็นมาตรฐาน
  • การเปิดแบบนี้ทำให้ผู้ผลิตฮาร์ดแวร์เช่นการ์ดจออื่นๆสามารถนำความสามารถของ  OpenGL ไปผลิตการ์ดจอให้ได้ตามที่ต้องการไม่ต้องยึดติดกับ platform ของ SGI และในทางเดียวกันผู้พัฒนาโปรแกรมก็สามารถนำ APIs ของ OpenGL ไปพัฒนาซอฟแวร์ประเภท 3D ที่กล่าวไปแล้วเช่นเดียวกัน ตราบเท่าที่ฮาร์ดแวร์สนันสนุนโปรแกรม 3D นั้นๆก็สามารถรันได้

ความยืดหยุ่น (Flexibility)

  • ประโยชน์สูงสุดของ OpenGL ในตอนนี้คือผู้ผลิตฮาร์ดแวร์ต่างๆสามารถเสริมความสามารถด้วย Extension หรือส่วนเสริม ถ้า OpenGL ไม่มีฟีเจอร์ในส่วนนั้น ผู้ผลิตหลายรายเช่น Nvidia, Apple ได้พัฒนา extension เพื่อสนับสนุนฮาร์ดแวร์ของตนโดยเฉพาะ มองในข้อดีคือความยืดหยุ่น แต่ข้อเสียก็ตามมาคือไม่เป็นมาตรฐาน

มาตรฐานเปิด (Open Standard)

  • ในปี 1992 มีการก่อตั้ง ARB (OpenGL Architechure Review Board) เพื่อรวบรวมความต้องการของผู้ผลิตฮาร์ดแวร์และซอฟแวร์ต้องการฟีเจอร์อะไรเพิ่มในอนาคต ทั้งนี้เพื่อความเป็นมาตรฐานและเป็นระบบที่เปิดนั่นเอง
  • และแล้ว OpenGL ก็กลายเป็นผู้นำในเรื่อง 3D Graphic API และเป็นหนึ่งเดียวที่สามารถใช้งานได้หลาย platform

OpenGL บนวินโดส์

  • ไมโครซอฟต์ปล่อย Windows NT ในปี 1993 ซึ่งจะเป็นคู่แข่งของระบบ Unix ด้วยการสนับสนุนฮาร์ดแวร์ 32 บิต และก็ปล่อย Win32 API สำหรับสร้างโปรแกรมใช้บนวินโดส์ ซึ่งโปรแกรมเมอร์ C คงจะจำกันได้ดีในยุคนั้น
  • เนื่องจาก  Windows NT ยังไม่มีไลบรารี 3D จึงสนันสนุน OpenGL ปี 1994 ขณะนั้น Windows NT เป็นรุ่น 3.5 แต่ก็ทำงานช้ามาก เพราะยังไม่มีการปรับ OpenGL ให้เข้ากับฮาร์ดแวร์บนวินโดส์

DirectX

  • ไมโครซอฟท์เริ่มมองเห็นความสำคัญของ 3D Graphic ในตลาดเกมส์ และมองหาไลบรารี 3D เพื่อจูงใจผู้พัฒนาเกมส์ ความพยายามครั้งแรกเริ่มที่ WinG API แต่ไลบรารีก็แค่ 2D ก็ยังไม่มีเรื่อง 3D สุดท้ายซื้อบริษัท RenderMorphics ในปี 1995 ผู้ซึ่งผลิต 3D API ในนาม Reality Lab
  • API ตัวนี้ถูกเปลี่ยนชื่อเป็น Direct3D และรวมๆเรียกว่า DirectX ที่มีเครื่องมืออื่นๆเช่นเรื่องเสียง เน็ตเวิร์ค การวาดแบบ 2D อุปกรณ์เช่น Joystick
  • เริ่มต้นแล้ว DirectX การแสดงผลและประสิทธิภาพยังช้าอยู่มาก ทำให้ไมโครซอฟท์ยังคงสนับสนุน OpenGL 1.1 ต่อไปบนวินโดส์ 95 และ NT 4.0

เริ่มต้นสงคราม

  • ขณะที่ไมโครซอฟท์พยายามยืนกรานว่า OpenGL ดีสำหรับงาน CAD (Computer Aided Design) เท่านั้น เพื่อที่จะครอบครองตลาดเกมส์แต่เพียงผู้เดียว John Carmack แห่ง id software บริษัทผู้พัฒนาเกมส์ Quake ที่ใช้ OpenGL ออกมาวิจารณ์ถึงความง่ายในการใช้งาน OpenGL
  • ธันวาคม ปี 1996 John Carmack แสดงเอกสารพร้อมทั้งข้อคับข้องใจต่อ Direct3D ไม่เพียงเท่านั้นยังแสดงการเปรียบเทียบโค๊ดของโปรแกรมที่วาดรูปสามเหลี่ยมบนจอภาพ OpenGL ใช้เพียง 4 บรรทัดเท่านั้นแต่ Direct3D กลับใช้โค๊ดมากกว่าหลายบรรทัด
  • กุมภาพันธ์ ปี 1997 Alex St. John ผู้พัฒนา Direct3D ของไมโครซอฟท์ก็ออกมาตอบใต้ว่าคำวิจารณ์ของ John Carmack ได้สร้างความเสียหายให้กับ Direct3D เขาอธิบายว่า Direct3D นั้นเน้นเข้าถึงฮาร์ดแวร์มากกว่าซอฟแวร์ ถึงโค๊ดของโปรแกรมไม่สวยแต่ก็ทำงานได้ดี และก็ตอกย้ำอีกครั้งว่า OpenGL เหมาะที่จะเป็น API สำหรับโปรแกรมด้าน Cad เท่านั้น
  • เดือนมิถุนายน 1977 SGI ออกมาสำทับต้อบโต้กับบทวิจารณ์ของ Alex St. john เรื่องความบกพร่องต่อการออกแบบ Direct3D เปรียบเทียบ  API  ทั้งสองและแสดงถึงความง่ายในการใช้งาน OpenGL
  • ไมโครซอฟท์ปรับปรุง Direct3D ในรุ่น 5.0 ถอดเอาฟึเจอร์ที่ไม่สะดวกในการใช้งานออก ในตอนนี้ทั้งสอง API ใช้งานได้ง่ายแล้ว

เรื่องของ Driver

  • สำหรับไดรเวอร์ของ OpenGL จะถูกใช้งานใน Windows NT ผ่านทางไดรเวอร์ที่เรียกว่า Mini-Client Driver (MCD) ซึ่งทำให้ประสิทธิภาพต่ำมาก แต่ก็เป็นวิธีการที่ง่ายที่สุดในการสร้างไดรเวอร์สำหรับฮาร์ดแวร์ที่ต้องการใช้กับ OpenGL แต่ไมโครซอฟท์ก็ตอบโต้ด้วยการไม่อนุญาตให้ใช้ MCD ทาง SGI จึงเสนอวิธีสร้างไดรเวอร์สำหรับ Windows NT ผ่านทางที่เรียกว่า Installation Client Driver (ICD) ทางผู้ผลิตฮาร์ดแวร์ได้ใช้ ICD เพื่อสร้างไดรเวอร์ ไม่นานจากนี้อุตสาหกรรมเกมส์เริ่มนำ OpenGL มาใช้เป็นทางเลือกแทนที่ Direct3D

การปฏิวัติของวงการฮาร์ดแวร์

  • ในช่วงปลายของศตวรรษ 1990 OpenGL ได้ปักหลักในอุตสาหกรรมไม่เฉพาะด้าน CAD เท่านั้น เกมส์ดังๆเช่น Quake 2, Unreal และ Half-Life ก็ได้ใช้ OpenGL และเป็นที่นิยมในเกมส์อื่นๆเช่นเดียวกัน ในตอนนี้ก็มีผู้ผลิตการ์ดจอในราคาไม่แพงและจะเป็นผู้มาปฏิวัติวงการก็คือ 3Dfx
  • 3Dfx ได้ปล่อยการ์ดจอเรียกว่า Voodoo ซึ่งมีประสิทธิภาพสูงมากในสมัยนั้น ในขณะนั้นทาง ATI เริ่มขาย 3D Rage และ S3 Virge แต่ก็ไม่มีใครสู้ Voodoo ของ 3Dfx ได้ ต้องนี้ 3Dfx คิดการใหญ่ได้สร้าง API ของตัวเองขึ้นมาใหม่เรียกว่า Glide ซึ่งเป็น API ที่เร็วและแรงที่สุด แต่อย่างว่าผู้ผลิตฮาร์ดแวร์อื่นๆก็ใช้ไม่ได้ แต่ Glide ก็สร้างปรากฎการณ์ ไม่นาน Glide ก็พบจุดจบ
  • NVIDIA ถูกก่อตั้งในปี 1999 และขายการ์ดจอชื่อ Geforce 256 และได้เรียกการ์ดจอว่า GPU (Graphic Processing Unit) ได้เพิ่มคุณสมบัติที่เรียกว่า T&L (Transform & Lighting) ตัว T&L จะย้ายการคำนวณ Vertex transformation จาก CPU ไปสู่ GPU ซึ่งข้อดีของ GPU จะคำนวณทางคณิตศาสตร์ได้รวดเร็วมากกว่า  CPU เนื่องจากถูกออกแบบให้ทำงานนี้โดยตรง น่าเศร้าที่ 3Dfx ไม่มีคุณสมบัติ T&L ไม่นาน 3Dfx ก็พบจุดจบ
  • สุดท้าย 3Dfx ก็ล้มละลาย จึงถูก NVIDIA เข้าไปซื้อกิจการและ NVIDIA ก็ไม่ได้ออกการ์ดจอรุ่น Voodoo อีกเลย ในขณะนั้นคู่ปรับตลอดกาลของ NVIDIA คือ ATI ซึ่งมีการ์ดจอชื่อ Radeon 7000 ซึ่งเป็น GPU เช่นเดียวกัน และทั้งสองเจ้านี้ก็สนับสนุนเฉพาะ Direct3D และ OpenGL เท่านั้น

การเปลี่ยนแปลงคุณสมบัติที่สำคัญ

  • ในตอนนี้การเรนเดอร์เพื่อให้ได้ภาพ 3D ถูกย้ายจากการคำนวณจาก CPU ไป GPU เพื่อลดคอขวด สองฟีเจอร์ที่จะกล่าวต่อไปนี้คือวิธีการที่กล่าวไปแล้ว

Buffers

  • ในทางโปรแกรมมิ่งแล้วคำว่า Buffers คือสถานที่ในหน่วยความจำที่ถูกเก็บข้อมูลบางอย่างแบบชั่วคราว เมื่อเลิกใช้แล้ว Buffers ก็จะถูกทำลายเพื่อคืนหน่วยความจำให้กับระบบ
  • วัตถุที่จะถูกเรนเดอร์เป็น 3D บนจอภาพจะถูกเก็บในรูป buffers เช่น Vertex array วิธีการเดิมๆ Vertex array จะถูกเก็บในหน่วยความจำกลาง (บนแรมนั่นเอง) จากนั้นจะย้าย buffer นี้ไป GPU ซึ่งทำให้ช้าเนื่องจาก buffer มีขนาดใหญ่ วิธีการใหม่คือ buffer จะถูกเก็บในหน่วยความจำของ GPU  ทำให้ไม่มีคอขวดอีกต่อไป การเรนเดอร์ทำได้เร็ว
  • ใน OpenGL ตัว buffer นี้เรียกว่า Vertex Buffer Objects (VBOs) ใน Direct3D เรียกว่า Vertex Buffers

Shaders

  • ในปี 2000 ไมโครซอฟท์ได้ปล่อย Direct3D รุ่น 8.0 เพิ่มคุณสมบัติที่เรียกว่า Shaders ซึ่งเป็นโปรแกรมเล็กๆที่รันบน GPU ทำให้เพิ่มความเร็วของการเรนเดอร์ภาพ 3D จะเป็นการลดภาระของ CPU อีกแรงหนึ่ง ไมโครซอฟท์เรียก shaders ที่มีสองแบบว่า Vertex Shader และ Pixel Shaders
  • Vertex Shaders เป็นโปรแกรมที่จะถูกรันต่อหนึ่ง vertex ที่ถูกกำหนดให้ ส่วน Pixel Shaders จะถูกรันต่อหนึ่ง pixel การใช้ shader ดังกล่าวจะลดคอขวดที่จะเรียกใช้งาน CPU ได้มาก แต่ข้อเสียคือยากในการเขียนโปรแกรมเนื่องจากโครงสร้างคล้ายกับภาษา Assembly
  • ในปี 2003 ไมโครซอฟท์ เปลี่ยนโครงสร้างของโปรแกรมให้เขียนได้ง่ายขึ้นเรียกว่า High Level Shader Language (HLSL) พร้อมกับการปล่อย Direct3D รุ่น 9.0 ทั้งนี้โครงสร้างภาษาอยู่บนพื้นฐานภาษา C

ยุคซบเซาของ OpenGL

  • ในตอนนั้น OpenGL ยังไม่สนับสนุนเรื่อง shaders จนกระทั่งในปี 2004 ที่ออก OpenGL รุ่น 2.0 เรียกโครงสร้างของการเขียนโปรแกรม shader นี้ว่า OpenGL Shader Language (GLSL) แต่การตามหลังไมโครซอฟท์ถึง 4 ปีทำให้ OpenGL ต้องวิ่งไล่ Direct3D เหมือนกับที่ Direct3D เคยวิ่งไล่ OpenGL ในทศวรรษก่อนหน้านี้
  • ในปี 2004-2006 มีเกมส์น้อยที่สนับสนุน OpenGL จนกระทั่งปี 2005 ไมโครซอฟท์ออก XBox เพื่อยึดคลองตลาดเกมส์คอนโซล ตอนนี้ทั้ง ARB หรือ SGI ทำตัวเงียบทำให้ดูเหมือนว่า OpenGL ตายแล้ว
  • ในปี 2006 OpenGL รุ่น 2.1 ก็ถูกปล่อยมา มีการเพิ่มฟีเจอร์ไม่กี่อย่าง สถานการณ์ยิ่งเลวร้ายขึ้นเมื่อไมโครซอฟท์ปล่อย Direct3D รุ่น 10.0 ซึ่งจะใช้ได้บน Windows Vista เท่านั้น ผู้ผลิตฮาร์ดแวร์เริ่มปรับทิศทางตามไมโครซอฟท์
  • ในระหว่างนี้โปรแกรมเมอร์ที่ใช้ OpenGL เริ่มถามและต้องการคำตอบจาก ARB และ SGI แต่คำตอบกลับเป็นสิ่งที่แตกต่างตาลปัตร

OpenGL รุ่นใหม่

  • ปี 2006 ก่อตั้ง Khronos Group ขึ้นมาเพื่อดูแล OpenGL แทน SGI ทั้งที่ SGI ยังถือลิขสิทธิ์อยู่ Khronos Group เป็นกลุ่มของผู้ผลิตฮาร์ดแวร์และซอฟแวร์ที่ยังสนใจที่จะใช้ OpenGL ต่อ มีการเปิดเผยว่าใช้รูปแบบการเก็บข้อมูล 3D เรียกว่า Collada ในระหว่างนี้มีข่าวว่า OpenGL จะถูกปรับปรุงเพื่อเปลี่ยนแปลงคุณสมบัติคร้งใหญ่ หลังที่เงียบมาแล้วสองปี

Long Peak และ Mt. Evans

  • รุ่นของ OpenGL ที่จะพัฒนามี code name ว่า Long Peak และ Mt. Evans ตัว Long Peak จะถูกปล่อยในฤดูร้อนปี 2007 และ Mt. Evans จะปล่อยตามติดในเดือนตุลาคมปีเดียวกัน
  • รุ่นดังกล่าวให้ความหวังจะมาต่อกรกับ Direct3D รุ่น 10.0 และการเรนเดอร์จะต้องใช้ buffers และ shader ทั้งหมด ผลก็คือตัว API ต้องเขียนใหม่ทั้งหมดด้วยกลุ่มทีเรียกว่า Technical Sub Group (TSG)
  • หนึ่งในสิ่งที่จะพัฒนาขึ้นมาใหม่คือ Object Model ซึ่งจะต้องมาเกี่ยวข้องกับ buffers การเสนอ Object Model ใหม่นี้ทำให้เกิดวิธีการสร้าง Object Model แบบใหม่ เพียงการใช้ฟังก์ชั่นไม่กี่บรรทัด ตัว Long Peak จะออกแบบใหม่ให้มีการเข้ากันกับฮาร์ดแวร์ก่อนหน้านี้ ส่วน Mt.Evans จะถูกออกแบบโดยไม่มีการเข้ากันกับอุปกรณ์ก่อนหน้านี้ มุ่งไปข้างหน้า ด้วยฟีเจอร์ที่เสนอนี้ ทำให้ได้รับการรอคอยอย่างคาดหวังจากชุมชนคน OpenGL
  • แต่ในฤดูร้อนปี 2007 ก็ผ่านไปจนถึงเดือนตุลาคม มีข่าวจาก Khronos Group ว่าเลื่อนการออก OpenGL ชุมชนคน OpenGL ก็มีอาการไม่พอใจเล็กน้อย แต่เทียบกับคุณสมบัติใหม่ที่รอคอยแล้วก็คุ้มที่จะรอ และแล้วก็ผ่านไปอีกปี

OpenGL รุ่น 3.0

  • เดือนกรกฎาคม ปี 2008 ก็ออกรุ่น 3.0 มา นับเป็นระยะเวลา 4 ปี ตั้งแต่รุ่น 2.1 ออกมา แต่ที่น่าผิดหวังคือคุณสมบัติที่รอคอยกลับไม่มี ดูเหมือนจะเปลี่ยนแปลงไปเล็กน้อย ที่สัญญาเรื่อง Object Model ก็ไม่มีและไม่มีทีท่าว่าจะเกิดขึ้นในรุ่นต่อๆไป มีเพียงฟีเจอร์ใหม่ที่เสนอมาคือ deprecation mode และความเข้ากันได้กับฮาร์ดแวร์ก่อนหน้านี้
  • ยังผลทำให้ชุมชนคน OpenGL ต่อต้านตามเว็บบอร์ด ซึ่งหนึ่งในข้อกล่าวหาต่อ Khronos Group ที่ทำให้ OpenGL มีความเข้ากันได้ฮาร์ดแวร์เก่าๆเพราะต้องการรักษาลูกค้าขายซอฟท์แวร์ด้าน CAD ยังผลให้ผู้พัฒนาซอฟท์แวร์บนวินโดส์ เริ่มทิ้ง OpenGL หันไปใช้ Direct3D ความสิ้นหวังต่อ OpenGL ดูเหมือนว่าสงครามระหว่าง API ได้จบลงไปแล้ว

After the Shock

  • ถึงแม้จะไม่พอใจใน OpenGL รุ่นนี้ก็ตาม แต่ OpenGL 3.0 ก็มีฟีเจอร์เทียบเท่ากับ Direct3D 10.0 แต่สิ่งที่เหนือกว่าคือ OpenGL 3.0 ยังใช้งานได้บน Windows XP แต่ Direct3D 10.0 ต้องรันบน Vista เท่านั้นเนื่องจากโครงสร้าง Drivers ใหม่ของไมโครซอฟท์ที่ต้องการ Vista ขึ้นไปเท่านั้น
  • เดือนมีนาคม 2009 ก็ออก OpenGL 3.1 มาคุณสมบัติใกล้เคียงกันกับ Long Peak และ Mt.Evans ดั่งที่เคยเสนอไปแล้ว ตอนนี้ OpenGL กลับมาอยู่ในเส้นทางที่พร้อมจะต่อกรอีกครั้ง ไม่กี่เดือนต่อมาก็ออกรุ่น 3.2 พร้อมคุณสมบัติใหม่คือ Geometry Shaders

OpenGL รุ่น 4.0

  • หนึ่งปีผ่านไปหลังจากปล่อยรุ่น 3.2 ไปแล้วก็ได้เวลาคลอดรุ่น 4.0 ซึ่งคุณสมบัติพอฟัดพอเหวี่ยงกับ Direct3D 11.0 ในขณะเดียวกันก็ได้ออกรุ่น 3.3 ออกมาด้วยซึ่งมีคุณสมบัติใกล้เคียงกับ 4.0 แต่มีความเข้าได้กับฮาร์ดแวร์รุ่นเก่า
  • ในทุกวันนี้ถ้าต้องการเขียนโปรแกรม 3D ที่สามารถรันได้นอกเหนือจาก platform ของไมโครซอฟท์แล้วทางเลือกเดียวคือ OpenGL ถ้าสนใจจะพัฒนาโปรแกรมด้าน 3D บนอุปกรณ์มือถือเช่น Android หรือ iPad, iPhone ก็มีไลบรารี OpenGL ES ซึ่งใกล้เคียง กับ OpenGL รุ่นใหญ่ ทำให้การ port code ให้สามารถรันได้บน PC, Macs ลีนุกซ์หรือแม้แต่อุปกรณ์มือถือที่กล่าวไปแล้ว
  • นอกจาก OpenGL ES แล้วยังมีรุ่น WebGL สำหรับพัฒนาโปรแกรม 3D บนเว็บ

OpenGL รุ่น 4.1 และ OpenGL 4.2

  • เดือนกรกฎาคม ปี 2010 ออกรุ่น 4.1 มีการปรับปรุงคุณสมบัติบางอย่างที่เทียบเท่ากับ Direct3D 11.0 ในรุ่นนี้โค๊ดของ OpenGL มีการเข้ากันกับ (Full campatibility) OpenGL ES ได้อย่างสมบูรณ์
  • เดือนสิงหาคม ปี 2011 ออกรุ่น 4.2 เช่นเดียวกันปรับปรุงคุณสมบัติหลายอย่างทำให้การเรนเดอร์ทำได้เร็วกว่าเดิม
  • ความต้องการของฮาร์ดแวร์ ได้แก่ Nvidia GeForce 400 series, Nvidia GeForce 500 series, ATI Radeon HD 5000 series, AMD Radeon HD 6000 Series

OpenGL ในมุมของ Lazarus

  • ไม่นานมานี้เองผมพยายามหาไลบรารีที่จะมาช่วยทำโปรแกรม 2D จากที่เคยเขียนมาเองแต่ก็หน่อมแน๊มเกินไป ก็ไปเจอ GLSCene ดั้งเดิมพัฒนาโดย Mike Lischke เปิดเป็น opensource และภายหลังดูแลโดย Eric Grange ตอนแรกพัฒนาเป็น VCL สำหรับโปรแกรมเมอร์ Delphi โดยเฉพาะในรุ่นหลังใช้ได้กับ Lazarus ซึ่งผมลองแล้วทั้งบนวินโดส์กับลีนุกซ์ แต่บนวินโดส์เมื่อดาวน์โหลด sourcecode ตอนติดตั้ง package จะมีปํญหา ผมจึงทำการแก้ไขโค๊ดไปเล็กน้อยก็ใช้งานได้ แต่ตัวอย่างที่ให้มาประมาณ 60% ที่ใช้งานได้ เนื่องจากโน๊ตบุ๊คที่ใช้งานอยู่ ยังเป็นการ์ดจอบนบอร์ด จึงทดสอบคุณสมบัติบางอย่างไม่ได้
  • ผมลองดูตัวอย่างที่ให้มาก็คือพยายามเรียนรู้จากตัวอย่าง ก็ไม่ได้ยากเกินไป จุดเริ่มต้นของผมแค่อยากพัฒนา 2D ในตอนแรกก็เลยมีความตั้งใจจะเรียน 3D ไปด้วย ปีหน้าจะซื้อโน๊ตบุ๊คเครื่องใหม่คงได้ลองฟีเจอร์เด็ดๆดูกัน
GLScene ที่ติดตั้งบน Lazarus
  • ผมนำโค๊ดจากตัวอย่างมาปรับเพิ่ม effect บางอย่างมาเขียนเป็นเมนู Aboutของโปรแกรมแสดงข้อมูลที่เกี่ยวข้องกับโปรแกรมเช่นชื่อโปรแกรม รุ่นของโปรแกรม ผู้พัฒนาก็ได้ผลดังรูปด้านล่าง แสดงรูปของทีมงานผู้พัฒนาโปรแกรมหมุนรอบ effect  ไฟ คล้ายนั่งม้าหมุนที่นั่งกันสมัยเด็ก

    About ของโปรแกรม

ก่อนจากกัน

  • ถ้าสนใจจะลองไลบรารี GLScene บน Lazarus ถ้าดาวน์โหลดมาแล้วใช้ไม่ได้ก็ลองขอมาดู ผมจะนำไฟล์ไปฝากไว้แถวๆ file share ครับ โลกนี้ถ้ามีแต่ไมโครซอฟท์วินโดส์ อย่างเดียวโลกนี้คงเหงาพิลึก ความคาดหวังของผมแล้ว OpenGL ไม่ต้องเหนือกว่า Direct3D แต่ขอให้เทียบเท่าก็พอ เพราะสินค้าที่ผลิตมาเพื่อการพาณิชย์จากยักษ์ใหญ่ย่อมมีกำลังที่เหนือกว่า

เครดิต

  • เรื่อง OpenGL ที่เขียนมาเกือบทั้งหมดผมเรียบเรียงมาจาก http://openglbook.com/the-book/ เนื่องจากไม่มีวิทยาการที่ลึกซึ้งกับ OpenGL ผิดพลาดประการใดก็ขออภัยครับ

Terrain Bender โปรแกรมแสดง DEM ที่บรรเจิดสุดๆ

  • ช่วงไม่นานมานี้ผม search ใน google พบกับโปรแกรมแสดงการจำลอง DEM เป็น 3D คือโปรแกรม Terrain Bender เห็นโปรแกรมต้องทึ่งในไอเดีย ครั้งแรกๆที่ผมเห็นใน website ผมคิดว่าคนพัฒนาโปรแกรมต้องเพี๊ยนสุดๆ ลองดูรูปจาก website
ภาพจาก website ของผู้พัฒนา Terrain Bender
  • ตัวโปรแกรมเป็น cross-platform มีให้ดาวน์โหลดใช้บน Windows, Linux แล้วก็ Mac OS X พัฒนาด้วย Java แสดงผล 3D โดยใช้ OpenGL ได้สวยงามทีเดียว
  • ผู้พัฒนาโปรแกรมเป็นชาวสวิสเซอร์แลนด์ คือ Helen Jenny and Bernhard Jenny, Institute of Cartography, ETH Zurich ผมดูชื่อแล้วสองคนน่าจะเป็นสามี ภรรยากัน ดู profile แล้วพบแต่ของ Bernhard Jenny ดูผลงานและรางวัลที่ได้รับไม่ธรรมดาเลย กลับมาดูงานวิจัยที่เกี่ยวกับงาน Cartography ของ Bernhard Jenny พบว่ามีหลายชิ้นที่น่าสนใจ งานวิจัยบางส่วนตกผลึกกลายเป็นผลงานก็คือ Terrain Bender ที่กำลังกล่าวถึงอยู่
การ projection ภาพ 3D ด้วยมุมต่างๆของสายตา
  • โปรแกรมนี้มุ่งแสดงภาพ 3D บน plane ที่บิดทุกรูปแบบจนถึงทรงกลม สามารถนำภาพถ่ายทางอากาศมาสวมให้ก็ได้ (Drape) แต่จำกัดขนาดภาพใหญ่ไม่เกิน 8192×8192 pixels การแสดง DEM ที่ผู้พัฒนาเรียกว่า Progressive Bending คล้ายกับว่าผู้มองลงมาที่ DEM อยู่บนเครื่องบิน สายตาของมุมมองชันลงมาด้านล่าง และมุมมองเกือบจะราบเมื่อมองไปไกลๆ ที่เส้นขอบฟ้า มีประโยชน์มากเพราะแสดงได้สมจริงมากและสามารถพลิกดูพื้นที่ที่ต้องการได้อย่างรวดเร็ว

ดาวน์โหลด

  • ตามลิงค์นี้ไปแล้วค่อยไปหน้าดาวน์โหลด http://www.terraincartography.com/terrainbender/ มีให้เลือกทั้ง windows, linux และก็ Mac OS X บนวินโดส์มีทั้ง 32 bit และ 64 bit เมื่อดาวน์โหลดมาแล้วไม่มีไฟล์ setup ให้แตก zip ไปวางไว้ตรงไหนก็ได้ เมื่อจะรันแค่เข้าไปคลิกที่ไฟล์ TerrainBender.exe ก็เป็นอันใช้ได้

ไฟล์ข้อมูลที่ใช้ทดสอบ

    • ผมดาวน์โหลด DEM จาก Aster GDEM ที่ผมเคยถึงไปแล้ว ได้มา 2 ไฟล์คือ ASTGTM_N13E099_dem.tif และ ASTGTM_N14E099_dem.tif ทั้งสองรูปเป็น geographic Lat/Long ผมนำมารวมกันด้วย tool ของ GDAL/OGR คือ gdalwarp เพื่อรวมไฟล์ก่อน แล้ว reproject จากระบบพิกัด geographic WGS84 (EPSG = 4326) ไปเป็น UTM zone 47N (EPSG=32647)

$gdalwarp ASTGTM_N13E099_dem.tif ASTGTM_N14E099_dem.tif merge_dem_wgs84.tif
$gdalwarp -s_srs EPSG:4326 -t_srs EPSG:32647 merge_dem_wgs84.tif merge_dem_utm47n.tif

  • บางครั้งการ reprojection ในวินโดส์โปรแกรมฟ้องว่าหาไฟล์ ที่เก็บ EPSG คือไฟล์ gcs.csv ไม่พบเนื่องจากตั้งค่า GDAL_DATA ไม่ถูกหรือไม่ตรง path ที่เก็บไฟล์ gcs.csv ใน Dos prompt ผมป้อน $set GDAL_DATA=C:\OSGeo4W\share\gdal (ผมติดตั้ง OSGeo4W) แล้วถึงจะรัน gdalwarp เพื่อ reprojection ได้สำเร็จ
  • ลองเปิดดูด้วย Quantum GIS ว่าใช้ได้หรือไม่ ลองแล้ว OK
แสดงผลใน QGIS
  • ส่วนรูปเป็นไฟล์ jpeg ของแผนที่ L7018 แถวๆจังหวัดกาญจนบุรี  (s7018-kan.jpg พร้อมด้วย world file) ต่อไปจะ crop DEM ให้มีขนาดเท่ากับไฟล์รูปแผนที่ ตรวจสอบขนาดของไฟล์ด้วย gdalinfo

$gdalinfo s7018-kan.jpg
Driver: JPEG/JPEG JFIF
Files: s7018-kan.jpg
s7018-kan.jgw
Size is 2986, 2554
Coordinate System is `’
Origin = (502376.972592156264000,1547332.968661365099251)
Pixel Size = (8.000000000000000,-8.000000000000000)
Image Structure Metadata:
SOURCE_COLOR_SPACE=YCbCr
INTERLEAVE=PIXEL
COMPRESSION=JPEG
Corner Coordinates:
Upper Left ( 502376.973, 1547332.969)
Lower Left ( 502376.973, 1526900.969)
Upper Right ( 526264.973, 1547332.969)
Lower Right ( 526264.973, 1526900.969)
Center ( 514320.973, 1537116.969)
Band 1 Block=2986×1 Type=Byte, ColorInterp=Red
Image Structure Metadata:
COMPRESSION=JPEG
Band 2 Block=2986×1 Type=Byte, ColorInterp=Green
Image Structure Metadata:
COMPRESSION=JPEG
Band 3 Block=2986×1 Type=Byte, ColorInterp=Blue
Image Structure Metadata:
COMPRESSION=JPEG

  • จะเห็นขนาดของไฟล์ที่แสดงทั้งสี่มุม เราเลือกเฉพาะ มุมล่างซ้าย (Lower Left) และมุมบนขวา (Upper Right) การ crop DEM ด้วย gdalwarp นำค่าพิกัดมุมล่างซ้ายและบนขวา ไปใส่หลัง options -te ส่วน options -ts ระบุขนาด pixel ลงไปเลยว่าขนาดเท่ากันทั้ง x และ y ผมใช้ค่า 30.5864 เมตร (ุถ้าขนาดไม่เท่ากัน Terrain Bender จะไม่ยอมอ่าน) ต่อไป แปลงฟอร์แม็ตเป็น ESRI Ascii grid format(*.asc) ที่ Terrain Bender ต้องการด้วย gdal_translate

$gdalwarp -te 502376.973 1526900.969 526264.973 1547332.969 -ts 30.5864 30.5864 merge_dem_utm47n.tif crop_dem_utm47n.tif
$gdal_translate -of AAIGrid crop_dem_utm47n.tif crop_dem_utm47n.asc

  • ลองรันโปรแกรม เปิดมาจะถามหาไฟล์ DEM เลือกไฟล์ crop_dem_utm47n.asc จะเห็นหน้าตาของโปรแกรมที่ยังไม่ได้ปรับแก้มุมมองดังรูปข้างล่าง
หน้าตาของ Terrain Bender เรียบง่าย

ปรับ shading

  • คลิกที่แท็บ “Shading” ลองปรับดูดังรูปด้านล่าง
ปรับ shading

ปรับ Vertical Exaggeration

  • ปรับ Vertical Exaggeration ไปสัก 2-4 กำลังสวย
ปรับความดิ่งเกินจริง

การ Drape

  • ลองสวมภาพแผนที่ L7018 ที่เตรียมไว้ด้วยการคลิกที่เมนู File > Open Texture Image… เลือกไฟล์ที่เตรียมไว้ ลองใช้เมาส์หมุน ส่วนการ zoom เลื่อนทำได้โดยการเลื่อนแถบ Distance, Shift X และ Shift Y
การ Drape ภาพลองไปบน DEM
  • ลองบิดไปอีกมุมหนึ่ง
มุมมองในอีกมุม

สรุป

  • เป็นผลงานที่น่าทึ่งมาก ถึงแม้จะพัฒนาด้วย Java ถึงขึ้นชื่อว่าช้า แต่ OpenGL ก็ช่วยภาพสามมิติได้มาก ไม่มีอาการกระตุกให้เห็นเลย การหมุนเลื่อนทำได้เนียนมาก ข้อเสียอย่างเดียวคือผมไปคอมไพล์เพื่อจะรันใน Ubuntu Linux แต่ไม่สำเร็จ (ส่วนหนึ่งผมไม่ค่อยคุ้นกับ Java) ถามหา library เมื่อจัดให้แล้วก็ไปฟ้อง error ที่เรื่องอื่น มันน่าจะมีคนทำเป็น package ติดตั้งได้ง่ายๆ แต่โดยรรมๆ แล้วประทับใจมากๆ
  • สนใจข้อมูลทดสอบผมฝากไฟล์เอาไว้ ไปดาวน์โหลดได้ Test_Data.zip

การ Crop DEM ด้วย Global Mapper

  • เวลา download DEM ของ SRTM ขนาด 5 องศา x 5 องศา (ขนาด 1 องศาเท่ากับ 60 ลิปดา, 1 ลิปดาเท่ากับ 60 ฟิลิปดาและ 1 ฟิลิปดาประมาณ 30 เมตร) ดังนั้น 5 องศาประมาณ 5 x 60 x 60 x 30 ประมาณ 540,000 เมตร (540 กิโลเมตร) ดังนั้น 5 องศา x 5 องศา ประมาณเท่ากัน 540 กม. x 540 กม. อืม…. ขนาดก็ไม่เล็กนัก แต่ถ้าพื้นที่ใช้งานเล็กกว่า วิธีการที่ใช้ต้อง Crop DEM ให้มีขนาดที่พอเหมาะ แต่ DEM ของ SRTM นั้นขนาด 1 pixel ประมาณ 90 เมตร x 90 เมตร ไฟล์ขนาด 5 องศา x 5 องศา จึงไม่ใหญ่มากนัก
  • หรืออีกสถานการณ์หนึ่งถ้า DEM เช่นของประเทศไทยเรา เป็น DEM ของกรมแผนที่ทหารขนาด 1 pixel = 30 เมตร x 30 เมตร ซึ่งตามหลักการแล้วพื้นที่ขนาดเท่ากัน DEM ของ กรมแผนที่ฯ ควรจะมีขนาดมากกว่าของ SRTM ประมาณ 3 เท่า (ถ้าเป็นฟอร์แม็ตเดียวกัน) ไฟล์ที่ผมได้มาถูกแปลงเป็น GeoTiff เรียบร้อยมีขนาดประมาณ 3 GB

เปิดไฟล์ DEM ของประเทศไทยในรูปแบบ GeoTiff

DEM ของประเทศไทย
  • ใช้ Global Mapper เปิดไฟล์นี้ด้วยคลิกเมนเมนู File >Open Data File(s)… เลือกฟอร์แม็ตเป็น GeoTiff แล้วคลิกที่ไฟล์ ผมใช้เวลาเปิดไฟล์นี้ประมาณ 20 นาทีจะเห็นว่า Global Mapper ทำ render แต่ช่วงสีที่ผู้สร้าง DEM ทำมาให้สีบริเวณพื้นที่ที่มีค่าระดับอยู่ 2 ค่า คือใ้ห้เป็นค่าระดับ -32767 เมตร เป็นสีน้ำเงิน และพื้นที่ที่สีแดง ค่าระดับ 32767 เมตร ซึ่งเป็นค่าระดับที่ไม่จริงเพียงแต่ผู้สร้าง mark ไว้ให้พื้นที่ที่ไม่มีค่าระดับ ทำอย่างไรถึงจะ remove พื้นที่ตรงนี้ออกไปได้เลย เพื่อให้ไฟล์มีขนาดเล็กลง และกินเมโมรีน้อยลงเมื่อเปิดด้วยโปรแกรมใดๆ และพื้นทีดังกล่าวถ้าสามารถ remove ออกไปได้ขนาดประมาณ 50 % ทีเดียว
  • การ Remove บางส่วนของ DEM ใน Erdas Imagine มีอยู่ในโมดูล Create Surface เมื่อทำการอ่านไฟล์นี้เข้าไป โดยสามารถสร้างเงื่อนไขค่าระดับที่ invalid ได้ บังคับให้โปรแกรมอ่านเข้าไปเฉพาะค่าระดับประมาณ 0 – 3000 เมตร แต่โชคร้าย Erdas Imagine ก็ไม่รอด ผมเดาว่า Erdas Imagine คงใช้เมโมรีของระบบจนหมด (วิธีการที่คิดแต่ยังไม่ทำคือ แบ่งพื้นที่ออกเป็นส่วนๆ แล้ว crop เอาไปทีละส่วน แล้วนำเข้า Erdas Imainge แล้วลบจุด invalid range ทิ้งแล้วเซฟ สุดท้ายนำแต่ละส่วนหรือแต่ละไฟล์ มาอ่านด้วย Global Mapper ทำการรวม DEM อีกครั้งให้อยู่ในไฟล์เดียว ก็น่าจะลดขนาดไปได้เกินครึ่ง)
  • เมื่อการ Remove invalid ค่าระดับที่ไม่ต้องการ ไม่เป็นผล ก็ไม่เป็นไรเราจะ crop เฉพาะพื้นที่ที่จะนำไปใช้ ก็แล้วกัน

Crop DEM โดยกำหนด Area

  • การ Crop DEM ใน Global Mapper ทำได้โดยอาจจะลากเส้นพื้นที่ (Area) แล้วเอาพื้นที่นี้เป็นขอบเขตที่จะ crop DEM หรือถ้ามีพื้นที่ที่แน่นอนเช่นมีรูปแบบพื้นที่เป็นฟอร์แม็ต DWG, Shape file, DGN ก็สามารถเปิดเข้ามาได้ใน Global Mapper ผมมี shape file ของประเทศไทย แล้ว extract เอาออกมาเฉพาะพื้นที่ภาคอิสาณ ใช้ Global Mapper คลิกที่เมนเมนู File > Open Data File(s)…คลิกที่ไฟล์ shape จะเห็นดังรูปด้านล่าง เป็นสีดำหนาๆ ผมจะใช้เส้นนี้เป็นพื้นที่ในการ crop
พื้นที่ที่จะ crop DEM
  • ทำการเลือก พื้นที่ที่จะ crop ด้วยการ activate ทำดังรูปด้านล่าง ด้วยการใช้ tool “Feature info tool” (รูปตัว i และมีลูกศรเล็กๆ) มาคลิกที่ขอบเขตพื้นที่ จะเห็น dialog โผล่ขึ้นมา เราไม่ได้ใช้ให้คลิกปิด
Activate พื้นที่ที่จะ crop
  • และมาถึงตอนสำคัญคือการ save file ตรงพื้นที่ที่ต้องการ crop ใช้เมนูคลิกดังรูปด้านล่าง
เลือกรูปแบบไฟล์ DEM เพื่อจะ save
  • ผมเลือกเป็น GeoTiff ต่อไปจะตั้งเงื่อนไขในขั้นตอนต่อไปเมื่อ dialog ป๊อปอัพขึ้นมาดังรูปด้านล่าง ที่แท็ปของ GeoTiff Options เลือก Elevation (16 bit integer samples) ซึ่งในการเซฟเป็น DEM สามารถเลือกได้ 2 อย่างคือ Elevation (16 bit) และ Elevation (32 bit)  ขยายความอีกนิดว่า 16 bit หรือ 32 bit คือขนาดที่ใช้เก็บ DEM ต่อ 1 pixel ตอนนี้ผมเลือก 16 bit (2  byte) ใน 1 pixel หมายความว่า เราใช้หน่วยความจำหรือพื้นที่ในการจัดเก็บเท่ากับ 2 byte ต่อ 1 pixel ส่วนความเป็นไปได้ของความสูงของ DEM คิดจาก  2 ยกกำลัง 16 จะได้ 65536 เนื่องจากเป็น signed มีเครื่องหมายลบด้วยจึงต้องหารสองแบ่งกันไปข้างละครึ่ง จะได้ -32767 ….0….32768 (คุ้นๆไหมครับ เป็นตัวเลขของ DEM  ที่ตอนแรก mark ค่าระดับเป็น invalid อยู่ที่ -32767 สีน้ำเงิน และ 32768 สีแดง)
  • เลือกสร้าง world file ตรง Generate TFW (world file) เผื่อบางโปรแกรมที่ชอบ world file มากกว่า GeoTiff
ตั้งค่าให้ GeoTiff DEM

ตั้ง GeoTiff options

  • ที่ dialog เดียวกันให้คลิกไปที่แท็ป Export Bounds (สำคัญมาก) เลือก Crop to Selected Area Feature(s)

 

 

  • จากรูปด้านบนถ้าเราไม่เลือกพื้นที่เอาไว้ก่อน ตรง Crop to Selected Area Feature(s) ก็จะจางไม่ให้คลิก เมื่อคลิก OK โปรแกรมจะถามชื่อไฟล์ให้ save จัดการ save แล้วเราจะใช้ Global Mapper เปิดมาอ่านอีกครั้ง
  • ผมต้องตกใจต่อกระบวนการ crop DEM ช่วงเขียนเป็นไฟล์ใหม่ ใช้เวลาประมาณ 2 ชั่วโมง ถ้าใคร crop DEM ที่มีขนาดเท่านี้ไปทำอย่างอื่นต่อไม่ต้องรอครับ เมื่อเปิดมาจะเห็น DEM ที่มี valid range (ไม่มีตัวเลขค่าระดับ -32767 และ +32768) ดังรูปด้านล่าง สวยสดงดงามตามสไตล์ของ Global Mapper
แสดง DEM ภาคอิสาณของไทยที่ได้จากการ crop
  • Global Mapper ที่เป็นโปรแกรมในเชิงพาณิชย์รุ่นเดียวกันมีหลายโปรแกรม แต่ที่สัมผัสมา ผมว่า Global Mapper เร็วสุด ใช้ง่าย แต่การ crop DEM ทำไมถึงใช้เวลามาก ไฟล์ที่ได้จากการ crop ประมาณ 522 MB ผมว่าผู้พัฒนา Global Mapper คงรู้ปัญหานี้ดี ตอนนี้ในรุ่น 11 ได้ออกเวอร์ชั่น 64 bit มาแล้ว ถ้าใช้ windows  64 bit Global Mapper รุ่น 64 bit น่าจะแก้ไขเรื่อง memory ไม่พอ (หมายถึงเครื่องคอมพิวเตอร์ต้องมีเมโมรีมากพอเช่นสมมติ 32-64 GB และ OS ก็ต้อง support ด้วย) ที่เหลือเป็นเรื่องอัลกอริทึ่ม ที่จะต้องปรับปรุงใหม่ ยกตัวอย่างเรื่อง Lidar ที่จะมี point มหาศาลระดับ เป็น 100 ล้านจุด และอีกเรื่องคือ CPU ต้องเร็วพอ แต่ในปัจจุบันคิดว่าเร็วพอไหม ก็น่าจะยัง มีกลุ่มคนคิดนำเรื่องความเร็วของกราฟฟิคการ์ดมาช่วยสนับสนุนการคำนวณช่วย CPU สำหรับค่าย nVidia ชื่อก็คือ CUDA(Compute Unified Device Architecture)
  • ผมดูแล้ว โปรแกรมด้าน GIS อีกโปรแกรมหนึ่งคือ Manifold System V.8 ก็พยายามเหมือนกัน นำเอา CUDA มา implement เข้าไปแล้วแต่เสียดายผมไม่สามารถลองได้เพราะใช้ graphic card เป็น ATI อยู่ มีหลายโปรแกรมเช่นแม้แต่ Photoshop ก็มี plug-in ของ CUDA ให้ใช้
  • แล้ว Global Mapper สนับสนุน CUDA แล้วหรือยัง  เท่าที่ค้นใน google ตอนนี้ ไม่มีแม้แต่เงา

การสร้าง 3D Anaglyph ด้วย MicroDem

  • ตอนที่แล้วผม post การทำ animation (flyby) ด้วย 3Dem ซึ่งโปรแกรมได้หยุดพัฒนาไปแล้ว มาดู Tools ที่ฟรีตัวต่อไป ที่นำมาใช้งานด้าน GIS เป็นโปรแกรมรุ่นเก่าเหมือนกัน แต่ตัวนี้ยังพัฒนาต่อเนื่อง และ MicroDem นี้มี feature ที่แฝงอยู่เป็นจำนวนมาก แต่ข้อเสียของโปรแกรมนี้คือ ใช้งานยาก ถ้าไม่รู้ว่าอะไรอยู่ตรงไหน เวลาใช้งานครั้งแรกๆ จะหงุดหงิด พาลเลิกไปเลย คือมี icon ของฟังก์ชั่น เยอะไปหมด พอคลิกดูที่น่าใช่กลับไม่ใช่ คือวิจารณ์ข้อเสียของ software ส่องกระจกดูก็เป็นข้อเสียของผมสะท้อนกลับมาเหมือนกัน คือนิสัยเสียไม่ค่อยอยากอ่านคู่มือ ใช้วิธีแกะวิธีใช้จากการลองผิดลองถูก แต่ถ้าเป็น User Interface ที่เรียบง่ายคือออกแบบได้อย่างที่เรียกว่า User friendly อย่าง Global Mapper นี่แทบไม่เคยอ่านคู่มือเลย
  • อย่างที่ผมจะเขียนเรื่องการทำ 3D Anaglyph คือเป็นภาพสามมิติ ที่ต้องใช้แว่นตา แดง/น้ำเงิน (ที่ใช้ดูหนัง 3D บนทีวีหรือโรงหนังก็ได้) มาส่องดูถึงจะเห็นเป็นภาพสามมิติ ถ้าเอาไปขึ้นจอ projector ก็เป็น idea ที่ไม่เลว แต่ต้องเตรียมแว่นตา ไว้หลายๆอันหน่อย ถูกๆหน่อยก็ที่ทำด้วยกระดาษ ถ้าใครที่ใช้โปรแกรมด้าน GIS อยู่บ่อยๆ จะเข้าใจเลยว่าถ้าพูดถึงภาพ 3D Anaglyph ต้องมีอะไรบ้าง หนึ่งคือ tools ที่ใช้สร้างภาพ Anaglyph อย่างง่าย สองต้องมี DEM  สามที่ต้องไม่ลืมคือแว่นตา แดง/น้ำเงิน
  • เมื่อเปิด DEM แล้ว ทำการ Map shading ซึ่งมีให้เลือก 4-5 อย่าง ต่อจากนั้นสั่งให้โปรแกรม render เป็น 3D Anaglyph แล้วใส่แว่นตาดู โปรแกรมถ้าใช้งานง่าย concept ก็ควรจะเป็นอย่างที่ผมกล่าว ที่นี้มาดูว่า MicroDem ใช้งานยากที่ร่ำลือเป็นอย่างไรกัน
MicroDem01
การสวมภาพ Map Shading จาก MicroDem เข้า Google Earth โดยตรง(แค่คลิกเมาส์สองคลิก) ทำให้ 3D ของ MicroDem ไปโผล่ใน Google Earth ดูสวยแปลกตา

ความเป็นมาของ MicroDem

  • เป็นโปรแกรม Freeware ด้าน GIS ที่ดูประวัติแล้วเริ่มต้นจากทีมงานของหน่วยทหารช่างของอเมริกา คือ US Naval Academy ที่เริ่มต้นครั้งแรกปี 1985 พยายามครั้งแรกบนเครื่อง Apple II แต่มาประสบความสำเร็จบนเครื่อง PC. ปี 1987 หัวหน้าทีมพัฒนาโปรแกรมก็คือ ศาตราจารย์ Peter Guth ครั้งแรกถูกพัฒนาด้วย Turbo Pascal เวอร์ชั่นบน DOS ถูก port เป็น Borland Delphi ในปี 1995 และถูกพัฒนาด้วย Delphi ตลอดมา
  • MicroDem สนับสนุนฟอร์แม็ตได้หลายๆตัวที่สำคัญๆ เช่น GeoTiff, Shape file, SRTM DEM, MrSid
  • ที่ผมสนใจโปรแกรมตัวนี้เป็นพิเศษเพราะว่าพัฒนาด้วย Delphi ถือว่าเป็น compiler ต้นธารของผมเลย คือมีความผูกพันธ์กับ compiler ตัวนี้ถึงแม้ผู้สร้างคือ Borland จะล้มหายตายจากไปแล้วก็ตาม

เตรียม Resource ให้ MicroDem

  • ผมขอใช้ resource เดียวกันกับตอนที่แล้ว ที่ใช้ 3DEM มี DEM อยู่หนึ่งไฟล์ พื้นที่เป็นแหลมเมืองทวาย พม่า DEM ที่วัดได้จากกระบวนการภาพถ่ายทางอากาศ เพื่อสร้างแผนที่ 1:50000 ของพม่า มีความละเอียดมากกว่า SRTM DEM อยู่พอสมควร คือ resource ของพื้นที่บริเวณนี้ได้มาเป็นจุด DTM ในรูป DWG แล้วนำมา export เป็น 3D Points นำเข้า Global Mapper แล้วสร้างเป็น GeoTiff DEM มีขนาด pixel 15mx15m (ทึ่จริงขนาด 30mx30m ก็ได้)

ปรับแต่ง Configuration ของ MicroDem ก่อนใช้งาน

  • ผู้ใช้บางท่านอาจจะมีข้อมูลที่อ้างอิงกับ Indian 1975 datum อยู่แต่พารามิเตอร์ที่โปรแกรมตั้งมายังไม่ถูกต้อง กับพารามิเตอร์ของกรมแผนที่ทหาร ดังนั้นถ้านำข้อมูลที่อ้างอิงกับ Indian 1975 มาใช้งานจะไม่ถูกต้อง
  • ตอนติดตั้งโปรแกรม MicroDem จะเลือกติดตั้งที่ C:\MicroDem จะมีไฟล์กำหนดรูปทรงรี คือ  GT_Ellip.dat และไฟล์กำหนด datum คือ GT_datum.dat ไฟล์กำหนดรูปทรงรีไม่ต้องสนใจเพราะถูกต้องแล้ว แต่จะำทำการแก้ไข GT_datum.dat ให้ถูกต้องตามพารามิเตอร์ของกรมแผนที่ทหาร ผมใช้ Notepad++ หรือจะใช้  Notepad ที่ติดมากับ windows ก็ได้

microdem02

  • ทำการแก้ไขให้ถูกต้องดังรูปด้านล่าง แล้ว save
microdem03
แก้ใขค่าพารามิเตอร์ของการ Transformation ใหตรงกับของกรมแผนที่ทหาร
  • รันโปรแกรม MicroDem ที่เมนูหลักของ MicroDem คลิกที่ Options แล้วแท็ปไปที่ Datum ตั้งค่าที่ UTM zone ตั้งเป็น 47 ซึ่งเป็นพื้นที่ส่วนใหญ่ของไทย ถ้าใช้งานอยู่แถว Zone 48 ก็ตั้งค่าเป็น 48 Hemisphere เลือกเป็น North เพราะไทยเราอยู่เหนือเส้นศูนย์สูตร Primary Datum เลือกเป็น WGS84 ส่วน Secondary Datum ผมเลือกเป็น INDIAN 1975, Thailand (ที่เราเพิ่งแก้ค่าพารามิเตอร์ไป) ก็เลือกตามรูปด้านล่าง แต่อย่าลืมติ๊กเครื่องหมาย Verify datums เวลาเปิดรูป เปิด DEM โปรแกรม MicroDem จะถามเพื่อ confirm
microdem04
ตั้งค่า configuration ที่ datum

นำเข้า DEM

  • ที่เมนูหลักของ MicroDem คลิกที่ File > Open > Open DEM เลือกไฟล์ DEM ที่เราเตรีียมไว้ จากนั้นโปรแกรมจะถาม Datum ตั้งค่าให้ตรงกับ DEM ของเราดังรูปด้านล่าง

microdem05

  • จะเห็น DEM แสดงผลในลักษณะ Map Shaded ซึ่งภายหลังเราสามารถปรับได้หลายอย่าง (มากกว่าโปรแกรม 3DEM)

microdem06

  • ที่กรอบการแสดงผลของ DEM สังเกต icon ที่เป็นรูปสี่เหลี่ยมมีลูกศรชี้เข้าหา (icon ที่ 5 จากซ้ายมือ คลิกเพื่อขยายรูป) เลือกพื้นที่ที่ต้องการขยาย
  • microdem08ต่อไปเราจะตั้ง Map shading options ซึ่ง MicroDem เตรียมรูปแบบมาให้แตกต่างกัน 3-4 อย่าง ที่รูป DEM คลิกขวาเพื่อเลือก options แล้วคลิกที่ Map Shading Options ดังรูปด้านล่าง

microdem09

การทำ Map Shading

  • จะเห็นเงื่อนไขหรือทางเลือก DEM color merge อยู่ 4 อย่างคือ Elevation, Slope, Reflectance, Terrain Shading
    • ถ้าเลือก Elevation การไล่เฉดสีจะเป็นไปตามค่าระดับของพื้นที่
    • ถ้าเลือก Slope การไล่เฉดสีเป็นไปตามความชัันของพื้นที่ เช่นความชันน้อยๆเป็นสีอ่อน ถ้าชันมากก็เป็นสีเข้ม ซึ่งผู้ใช้สามารถเลือกตั้งค่าได้
    • ถ้าเลือก Reflectance ผมคิดว่าดูดีที่สุดเป็นธรรมชาติคือสามารถตั้งแสงเงาและทิศทางได้ด้วย
    • ถ้าเลือก Terrain Shadings คล้ายกับ Reflectance มาก แต่เหมือนจะใส่การ blending เข้าไปมากจะทำให้ภาพดูมืดมากกว่า แต่ความคมชัดมากกว่า Reflectance
  • ลองเลือกดูตามใจชอบ ส่วนผมชอบ Refectance มากที่สุด
microdem10
ตั้งค่าสำหรับ DEM Color merge ลองเลือก Elevation
microdem11
เมื่อเลือก DEM Color Merge เป็น Elevation
  • ดูที่กรอบหน้าต่างแสดงผล DEM สามารถ pan ได้ด้วยการคลิกที่เครื่องหมายลูกศร UI ยังโบราณมาก ความจริงถ้าให้คลิกเมาส์ปุ่มกลางกดค้างแล้วลากจะสะดวกมากกว่า ลองเลือกเป็น reflectance ดู
microdem12
เลือก DEM Color merge เป็น Reflectance

การส่งภาพไปแสดงผลที่ Google Earth

  • นี่เป็น feature ที่เด็ดที่สุดของ MicroDem สามารถยิงไปออกที่ Google Earth ได้เลย ในแง่โปรแกรมมิ่ง เทคนิคนี้เป็นไม่ใช่เทคนิคใหม่ เรียกอะไรจำไม่ได้แล้ว คือ Google Earth ต้องให้ Type Library มา ถึงจะเขียนโปรแกรมติดต่อได้ ที่ผมใช้อยู่ประจำคือ Autocad และ Microsoft Excel สามารถเขียนแบบด้วยโค๊ดแล้วส่งเข้าไปแสดงผลใน Autocad หรือ Excel ได้เลย ถึงจะเป็นเทคนิคเก่าแต่สะดวกมาก (แต่ที่โปรแกรมเมอร์ไม่ค่อยอยากเขียนเท่าไหร่เพราะคุมไม่ได้เช่น Type library สำหรับ Google Earth version 5 แต่พอถึง version  7 อาจจะเปลี่ยนการ interface ใหม่ ทำหให้โปรแกรมที่เขียนติดต่อกับ Google Earth ที่ยังอิงกับ Type library version เก่าก็ใช้ไม่ได้) ไม่ต้องหาโปรแกรมมาแปลงเป็น KML/KMZ คลิกเมาส์แล้วส่งออกไปเลย มาดูกันครับ ที่ภาพของ DEM คลิกขวาเลือก Load > Google Earth overlay

microdem13

  • ลองดูผลลัพธ์ ภาพที่ overlay เข้าโดยมีฟอร์แม็ต PNG ที่สามารถทำ transparency กับ ภาพของ Google Earth ลองดูรูปด้านล่าง
microdem14
ภาพที่ส่งเข้ามาจาก MicroDem
  • ดูภาพด้านบน สวยงามมาก ที่จริงเป็นภาพอะไรก็ได้ที่อ้างอิงกับ Georeference ที่สามารถอ่านด้วย MicroDem ก็สามารถส่งเข้ายัง Google Earth ได้เสมอ

3D Anaglyph

  • สุดท้ายที่เราตั้งเป้าไว้คือการแสดงผลแบบ 3D Anaglyph ที่หน้าต่างแสดง DEM คลิกขวาเลือก 3D Map  Options ตั้งค่า ที่ stereo mode ตั้งเป็น Anaglyph คลิกที่ OK เพื่อ Render ใหม่
microdem15
ตึ้งค่า 3D Anaglyph
  • เตรียมแว่นตา 3D ดูได้เลย
microdem16
ภาพ 3D Anaglyph

ข้อดีและข้อด้อยของ MicroDem

  • ในขณะใช้ MicroDem ทำ render ภาพ 3D ถ้าเกิดภาพหายไปดื้อๆ ไม่ต้องตกใจ เป็นเรื่องปกติ ปิดหน้าต่างแล้วเปิด DEM มาใหม่ มี  bug  บางส่วนไม่ได้รับการแก้ไขอยู่อีกหลายจุด
  • การ pan การ zoom ไม่เคยปรับปรุงมานานแล้ว ใช้งานยาก การเพิ่มโค๊ดเพื่อการ pan และ zoom แบบ real time ก็ไม่ใช่เรื่องหนักหนาสาหัสอะไรในทางโปรแกรมมิ่ง
  • ส่วนที่น่าสนใจมากของโปรแกรมนี้คือสนับสนุนเรื่อง Geology ซึ่งผู้พัฒนาโปรแกรมแต่ละคนก็ขนาดศาสตราจารย์ทั้งนั้น และทำงานให้แผนก Geology โปรแกรมจึง support ด้านนี้ สามารถนำภาพที่ได้จากการสำรวจ side scan sonar, sub-bottom profiler (เป็นงานสำรวจที่ทีมงานผมทำอยู่เหมือนกัน) เข้าไปซ้อนเป็นชั้นข้อมูลกับ DEM ได้ หรือสามารถนำข้อมูลชั้นดินมารวมกับชั้นข้อมูลอื่นๆ ได้ ฟีเจอร์หลายๆอย่างน่าสนใจ ถ้าถามว่าทำไมโปรแกรมใช้งานยาก หนึ่งคือไม่ใช่โปรแกรมเพื่อการค้า สองดูที่ผู้พัฒนาโปรแกรมระดับศาสตราจารย์ทั้งนั้น (เหตุผลข้อหลังไม่ขยายความต่อนะครับ) ถึงแม้จะใช้งานยาก แต่ก็ไม่เกินความพยายามของเรา เพราะเป็นของฟรี และความสามารถของโปรแกรมก็มีอะไรดีที่คาดไม่ถึงอยู่อีกมากครับ
  • ความคิดของผมเมื่อโปรแกรมมาถึงในจุดที่ทำต่อไปไม่ไหวก็เปิดเป็น opensource มี library หลายตัวของ MicroDem ที่น่าสนใจสามารถนำมาทำเป็น GIS Component ได้สบายๆ

การจำลองภาพเคลื่อนไหวมุมสูง (Flyby) 3D ด้วย Tools ฉบับกระเป๋า 3DEM

3Dem

  • เป็นโปรแกรมขนาดเล็กมาก จะเรียกว่าฉบับกระเป๋าก็ได้ เขียนโดย Richard Horne ตอนนี้หยุดพัฒนาไปแล้วครับ ถึงจะหยุดพัฒนาไปแล้วแต่ก็ยังหา download ได้หลาย website เช่นที่นี่  3dem_setup.exe โปรแกรม 3DEM เมื่อออกมาใหม่ๆเป็นที่กล่าวขานพอสมควร คือออกมานานมากตั้งแต่ Windows 95 นู่นครับ ใช้ OpenGL เป็น engine ในการ render เป็น 3D และแน่นอนสามารถจำลองเป็นภาพเคลื่อนไหว สามารถจัดเก็บเป็นฟอร์แม็ต avi และ mpg
  • น้องๆที่เป็นนักศึกษาที่ศึกษาด้าน GIS และคงจะมีหลายๆคนที่ศึกษาด้านโปรแกรมมิ่งด้วย โปรแกรม 3DEM นี้ก็เป็นโปรแกรมตัวอย่างที่ดี ที่ทำใ้ห้ผู้พัฒนาเป็นที่รู้จัก ถึงแม้คุณ Richard Horne จะไม่เอาดีด้านการค้า แต่ก็เขาก็ฝากชื่อไว้ให้เป็นที่รู้จัก

3Dem

  • รูปด้านบนนี่เป็นภาพจาก website ของ 3DEM ซึ่งปิดตัวไปแล้ว หลักการจำลองภาพ 3D แบบนี้เรียกว่าการ Drape ถ้าแปลตรงๆก็คือการสวม หลักการก็คือต้องมี DEM ก่อนแล้วหาไฟล์ที่เป็นภาพถ่ายทางอากาศสวมทับลงไป ยิ่งเป็นภาพถ่ายทางอากาศที่ละเีอียดก็ยิ่งสวย ภาพถ่ายอาจจะเป็นภาพถ่ายดาวเทียม(satelite image) หรือภาพถ่ายจากเครื่องบิน (aerial image) ที่สำคัญคือภาพถ่ายทางอากาศต้องมีลักษณะที่อ้างอิงกับค่าพิกัดภูมิศาสตร์จริง (Georeference) ส่วน DEM ถ้าเป็นประเทศไทยมี DEM (ขนาด pixel 30mx30m) ของกรมแผนที่ทหาร หรือจะใช้ของ SRTM DEM (ขนาด pixel 90mx90m) ที่แนะนำวิธีการ Download ได้จาก blog ของผมตอนก่อนๆ

เตรียมของให้ 3DEM

  • download ภาพถ่าย Landsat 7 ด้วย Global Mapper เป็นวิธีที่ง่ายที่สุด แต่เวลา save ไฟล์ออกมา จะเสียเวลาหน่อย ยิ่งเป็นไฟล์ใหญ่ก็ใช้เวลามากขึ้น
ภาพถ่ายดาวเทียม Landsat 7
ภาพถ่ายดาวเทียม Landsat 7
  • download SRTM DEM พื้นที่เีดียวกันกับภาพถ่ายดาวเทียม ใช้วิธี download ผ่าน Google Earth ที่ผมเขียนไปแล้วก็ง่ายสะดวกดี DEM ที่ผมจะใช้เป็นตัวอย่างได้จาก link ของ Google Earth srtm_56_10.zip ขนาดของ DEM ไฟล์นี้ค่อนข้างใหญ่ ผมใช้ Global Mapper ทำการ Crop ให้ DEM มีขนาดใกล้เคียงกับภาพถ่ายดาวเทียม Landsat แล้ว save เป็นฟอร์แม็ต GeoTiff

เริ่มใช้ 3DEM

  • หลังจาก download โปรแกรม 3DEM มาแล้วทำการติดตั้งแล้วก็รัน เมื่อเปิดโปรแำกรมมา จะถามหาไฟล์ DEM เลือกไฟล์ที่เราเซฟไว้
3DEM01
เลือก GeoTiff สำหรับ DEM
  • ข้อสังเกต ฟอร์แม็ตที่ 3DEM อ่านได้ยังถือว่าน้อยไปแต่ก็ไม่เป็นไร เมื่อเปิด DEM มาแล้วจะเห็นภาพของ DEM ที่ทำการ Shaded reliedf แล้ว ก็สวยงามดี
3DEM02
3DEM แสดง SRTM DEM บริเวณแหลมทวาย พม่า

การ Drape

  • ต่อไปจะโหลดภาพถ่ายดาวเทียมแล้วสวม (drape) ลงไป ที่เมนูหลัก คลิกที่ Operation > F4 Apply/Remove Map Overlay เลือกไฟล์ภาพถ่ายดาวเทียม Landsat 7
3DEM04
เปิดภาพถ่ายดาวเทียม Landsat 7
  • เมื่อ Drape ลงไปจะเห็นโปรแกรม 3DEM แสดงภาพถ่ายดาวเทียม Landsat 7 บน DEM
3DEM05
สวมภาพถ่ายลงบน DEM
  • จากรูปด้านบนจะเห็นกรอบสีดำอยู่ด้านล่าง กรอบนี้คือบริเวณที่โปรแกรมจะแสดงภาพ 3D

3D View

  • ต่อไปจะเปิดโหมดการแสดงผล 3D ที่เมนูหลักคลิกที่ Operation > F2 3D Scene หรือกด F2 ที่คีย์บอร์ดก็ได้ จะเห็น Dialog ให้ตั้งค่าดังรูปด้านล่าง
3DEM06
ตั้งค่าการแสดงผล 3D
  • 3DEM จะเปิดหน้าต่าง 3D Scene มาแสดงผลภาพ 3D
3DEM07
3D View
  • ภาพ 3D ก็พอดูได้ ข้อเสียถึงแม้เรามี DEM ขนาดใหญ่แต่ 3DEM พยายาม render ให้เฉพาะกรอบสีดำที่ผมกล่าวไปข้างต้น จึงทำให้ภาพ 3D จึงดูขาดๆ ค้านกับความเป็นจริง แต่รวมๆก็ OK นะครับสำหรับเป็น case study ที่เมนู 3D Scene สามารถ save เป็นฟอร์แม็ต 3D VRML ได้ด้วย

3D VRML

  • ถ้าสนใจ VRML มีโปรแกรมที่เป็น plug in ของ browser ชื่อ Cortona 3D สามารถดาวน์โหลดและติดตั้งได้ที่ download แล้วใช้เมนูของ browser (ผมใช้ Firefox) คลิกที่เมนู File > Open file… เปิดไฟล์ 3D VRML (.wrl) จะเห็นภาพ 3D ที่พร้อมจะทำ animate ดังรูปด้านล่าง
Cortona3D
Cortona 3D บน Firefox

3D Flyby

 

  • มาดูความสามารถของ 3DEM ที่ทำ Flyby จะเห็นหน้าต่าง 3D Scene อีกครั้ง ถ้าต้องการดูภาพเคลื่อนไหวก็ดูได้ แต่ถ้าต้องการเซฟเป็นไฟล์ วีดีโอ ต้องปิดหน้าต่าง 3D Scene นี้ก่อน การจะ flyby เราต้องมีเส้นทาง (fly path) ให้โปรแกรม 3DEM ซึ่งสามารถใช้เมาส์คลิกเป็นจุดๆต่อเนื่องตามความพอใจ ที่เมนูหลัก เลือก GPS > Enter GPS Points by mouse จัดการคลิกเพื่อสร้างจุดต่อเนื่องเป็นเส้นทางการบิน ที่รูปด้านล่างสังเกตดูเส้นสีแดงที่ผมสร้างไว้
3DEM09
สร้างเส้นทางการบินจำลอง
  • ที่เมนูหลักคลิกที่ Operation > Animate Flyby ตั้งค่าให้ตรงกับความต้องการ
3DEM08
ตั้งค่าสำหรับ Flyby
  • เมื่อคลิก OK แล้วป้อนชื่อไฟล์ เลือกชนิดไฟล์วีดีโอเป็น mpg จากนั้นจะมี dialog ถามเกี่ยว codec และ frame rate ตั้งค่าตามค่าปริยาย คลิก OK แล้วหน้าต่าง 3D Scene จะขึ้นมาอีกครั้งและแสดงภาพเคลื่อนไหวบินจำลอง รอจนกระทั่งสิ้นสุด fly path ลองเปิดไฟล์วีดีโอด้วยโปรแกรมพวก Media player
3DEM10
3D Flyby animation
  • เมื่อนำไฟล์มาเล่นด้วยโปรแกรมจำพวก Media player ดูแล้ว smooth มากน่าประทับใจไม่แพ้สร้างใน Google Earth

การสร้าง (Create/Generate) DEM จาก DTM (3D Points) ด้วย Global Mapper

  • ตัว Global Mapper สำหรับความรู้สึกผมนั้นดูเรียบง่ายและทรงพลัง การสร้าง DEM (Digital Elevation Model) จากโปรแกรมดังๆอย่าง Erdas Imagine หรือ ArcGIS ยังดูยากไปนิด มาดูกันว่า Global Mapper นั้นเรียบง่ายเพียงใด

Global Mapper V.10

  • ผมมีเหตูต้องศึกษาเรื่องน้ำที่แม่น้ำตะนาวศรี(Tanintharyi River) ชื่อน่าจะคุ้นคนไทยเรา หลักสูตรวิชาภูมิศาสตร์จะมีเทือกเขาตะนาวศรีคั่นไทยกับพม่าอยู่ และก็แม่น้ำที่ไหลเคียงข้างกับเทือกเขาตะนาวศรีด้านพม่าก็คือแม่น้ำตะนาวศรีนี้เอง คนพม่าเรียกแม่น้ำนี้ว่า ตาเน็นตายี่
  • ผมใช้ข้อมูลความสูง ซึ่งมีอยู่ 2 sources ต้องนำมาผสมกัน ข้อมูลแรกเป็น DTM (Digital Terrain Model) ของพม่า โดยที่ DTM ได้ข้อมูลมาเป็นจุดซึ่งวัดมาจากภาพถ่าย Stereo (พม่าจัดทำแผนที่ สเกล 1:50000 ใหม่ทั้งประเทศด้วยกระบวนการภาพถ่ายทางอากาศเมื่อปี 2005 เป็นแผนที่ภาพถ่ายทางอากาศ (Orthophoto map) และแผนที่ลายเส้น) ข้อมูลที่สองเป็น DEM ของ SRTM DEM ที่ผมเคยเขียนวิธีการ download ไปแล้ว
3D points as DTM (Digital Terrain Model)
3D points as DTM (Digital Terrain Model)
  • จากรูปด้านบนจะเห็นจุดที่เรียงเป็นกริดนั้น import มาจาก SRTM DEM ส่วนจุดที่กระจายไม่เป็นระเบียบเป็น 3D points ที่ได้จากก  DTM  ของพม่า
  • ที่เมนูหลักคลิกที่ Tools > Control Center… หรือใช้ shortcut ก็ได้ด้วยการกด Alt + C ผมมี layer ที่เก็บ points รวมไว้แล้วเป็น layer เดียว ที่เลเยอร์นี้คลิกขวาเลือก Create Elevation Grid form 3D Vector Data…
Create elevation grid.
Create elevation grid.
  • จะมีไดอะล็อก ให้ตั้งเงื่อนไขของ Elevation Grid ก่อน
ตั้งค่าเพื่อสร้าง Elevation grid
ตั้งค่าเพื่อสร้าง Elevation grid
  • จากรูปด้านบนตั้งชื่อที่ Description ผมตั้งเป็น Tanintaryi_DEM ระยะ spacing ของกริดผมเลือกเป็น 10 เมตรทั้ง x และ y จากนั้นตัวอื่นทิ้งไว้ตามค่าปริยายคลิกที่ OK เพื่อเริ่มสร้าง elevation grid โปรแกรม Global Mapper จะเริ่มสร้าง TIN (Triangulation Irregular Network) ใช้เวลาประมาณ 3-4 นาทีต่อจำนวนจุดประมาณ 1.4 ล้านจุดก็ถือว่าเร็ว ต่อจากนั้นก็ฟอร์มเป็น Elevation Grid ซึ่งพร้อมจะสร้างเป็น DEM ต่อไป
Generated DEM
Generated DEM
  • จากรูปด้านบนเมื่อกด ALT+C ตัว Control Center จะพ๊อพอัพออกมา ติ๊กที่ layer 3d points ออก ให้เห็น layer ใหม่คือ Tanintaryi_Dem อย่างเดียวจะเห็นรูป DEM สวยงามดังรูปข้างบน

การ Export เป็น DEM

  • ที่เมนูหลัก คลิกที่ File > Export Raster and Elevation Data > Export GeoTiff… เราจะ Export เป็น GeoTiff DEM
Export to DEM
Export to DEM
  • จะเห็นไดอะล็อกถาม options ของฟอร์แม็ต GeoTiff ตั้งค่าดังรูปด้านล่าง
ตั้งค่า GeoTiff
ตั้งค่า GeoTiff
  • จากรูปด้านบนเมื่อคลิก OK โปรแกรมจะให้ป้อนชื่อไฟล์ GeoTiff เมื่อป้อนชื่อไฟล์ รอประมาณ 3 นาทีก็จะเสร็จ ทดสอบดูว่ามีอะไรผิดพลาดหรือไม่ลองไปเปิดด้วยโปรแกรมอื่นผมใช้ Viewer ของ Erdas Imagine ก็ OK
Viewer by Erdas Imagine
Viewer by Erdas Imagine