ผลต่างระหว่างรุ่นของ "PyOpenGL Programming/Tutorial 1: First Program"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 12 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน)
แถว 9: แถว 9:
 
def display():
 
def display():
 
     glClearColor(0,0,0,0)
 
     glClearColor(0,0,0,0)
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+
     glClear(GL_COLOR_BUFFER_BIT)
 
      
 
      
 
     glBegin(GL_QUADS)
 
     glBegin(GL_QUADS)
แถว 22: แถว 22:
 
if __name__=="__main__":
 
if __name__=="__main__":
 
     glutInit(sys.argv)
 
     glutInit(sys.argv)
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)
+
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
 
     glutInitWindowSize(512, 512)
 
     glutInitWindowSize(512, 512)
 
     glutCreateWindow("Test 01")
 
     glutCreateWindow("Test 01")
แถว 30: แถว 30:
 
     glutMainLoop()
 
     glutMainLoop()
 
</pre>
 
</pre>
 +
== การ import โมดูล PyOpenGL ==
 +
โดยมากเราจะ import สองโมดูอคือ OpenGL.GL และ OpenGL.GLU ซึ่งเป็นโมดูลหลัก
 +
 +
<pre title="python">
 +
from OpenGL.GL import *
 +
from OpenGL.GLU import *
 +
</pre>
 +
 +
นอกจากนี้เราจะต้อง import โมดูล OpenGL.GLUT เพื่อใ้ช้ฟ้ังก์็ชันต่างๆ ของ GLUT ด้วย
 +
 +
<pre title="python">
 +
from OpenGL.GLUT import *
 +
</pre>
 +
 
== คำสั่ง OpenGL ==
 
== คำสั่ง OpenGL ==
 
ถ้าเราตัดโปรแกรมข้างบนเอามาแค่ส่วนที่เป็นคำสั่ง OpenGL จะได้ผลดังต่อไปนี้
 
ถ้าเราตัดโปรแกรมข้างบนเอามาแค่ส่วนที่เป็นคำสั่ง OpenGL จะได้ผลดังต่อไปนี้
 
<pre title="python">
 
<pre title="python">
    glClearColor(0,0,0,0)
+
glClearColor(0,0,0,0)
    glClear(GL_COLOR_BUFFER_BIT)
+
glClear(GL_COLOR_BUFFER_BIT)
 
      
 
      
    glBegin(GL_QUADS)
+
glBegin(GL_QUADS)
    glVertex2d(-0.5, -0.5)
+
glVertex2d(-0.5, -0.5)
    glVertex2d(0.5, -0.5)
+
glVertex2d(0.5, -0.5)
    glVertex2d(0.5, 0.5)
+
glVertex2d(0.5, 0.5)
    glVertex2d(-0.5, 0.5)
+
glVertex2d(-0.5, 0.5)
    glEnd()
+
glEnd()
 
</pre>
 
</pre>
  
{{PyOpenGL Programming/Navigation|Basic Vocabulary|Tutorial 2:
+
เรามาดูกันทีละคำสั่ง
 +
* <tt>glClearColor(0.0, 0.0, 0.0, 0.0)</tt>
 +
*: เปลี่ยนสีที่จะใช้ล้างหน้าจอเป็นสีดำ
 +
* <tt>glClear(GL_COLOR_BUFFER_BIT)</tt>
 +
*: ล้าง bitplane ที่เก็บสีด้วยสีทีกำหนดใน glClearColor
 +
* <tt>glColor3f(1.0, 1.0, 1.0)</tt>
 +
*: เปลี่ยนสีเป็นสีขาว โดยที่จุด เส้น และรูปทรงที่วาดต่อจากนี้ไปจะเป็นสีขาว
 +
* <tt>glBegin(GL_QUADS)</tt>
 +
*: บอกว่าต่อไปนี้เราจะวาดรูปสี่เหลี่ยม
 +
* <tt>glVertex3f(x, y, z)</tt>
 +
*: กำหนดจุดยอดมุมของสี่เหลี่ยม
 +
* <tt>glEnd()</tt>
 +
*: บอกว่าสิ่งที่เริ่มไปตั้งแต่ glBegin ที่แล้วได้เสร็จสิ้นแล้ว ในที่นี้คือบอกว่ากำหนดสี่เหลี่ยมเสร็จสิ้นแล้ว (เราได้กำหนดไปสี่จุดพอดี!)
 +
 
 +
สังเกตว่าคำสั่ง OpenGL จะขึ้นต้นด้วย <tt>gl</tt> เสร็จแล้วจะตามด้วยชื่อคำสั่ง เช่น <tt>Vertex</tt> หรือ <tt>Color</tt> เป็นต้น บางคำสั่งอาจมีจำนวนและชนิดของ argument เช่น <tt>3f</tt> บอกว่าต้องการ argument เป็นตัวเลขประเภท float จำนวน 3 ตัว หรือ <tt>3i</tt> บอกว่าต้องการ argument ประเภท int จำนวน 3 ตัว เป็นต้น อย่างไรก็ดีภาษาไพทอนไม่ได้มาตรวจเช็คว่า argument ต้องเป็นประเภทตามที่ระบุไว้จริงๆ ชื่อคำสั่งแปลกๆ เหล่านี้เป็นผลมาจากการที่ OpenGL ถูกเขียนขึ้นมาใช้กับภาษา C เป็นภาษาแรก ดังนั้นคนเขียนโปรแกรม PyOpenGL จึงต้องระมัดระวังตรวจสอบให้ตัวแปรที่ส่งไปมีชนิดที่ถูกต้องด้วยตัวเอง สำหรับตัวย่อของตัวแปรชนิดต่างๆ สามารถดูได้ที่ http://fly.cc.fer.hr/~unreal/theredbook/chapter01.html ที่หัวข้อ Open Command Syntax
 +
 
 +
ข้อควรรู้อีกประการหนึ่ีงคือ OpenGL ทำงานเป็น state machine กล่าวคือ มันจะจำค่าต่างๆ ที่ผู้ใช้กำหนดได้เอาไว้ โดยเมื่อผู้ใช้กำหนดค่า ค่านั้นจะถูกใช้ต่อไปเรื่อยๆ จนกว่าจะเปลี่ยน ค่าที่ OpenGL จำไว้ ได้แก่ สีที่ใช้ล้างหน้าจอ สีของจุด ทิศทางและตำแหน่งของกล้องถ่ายรูป ฯลฯ ยกตัวอย่างเช่น ยกตัวอย่างเช่น เวลาเราเรียก <tt>glColor3f(1,1,1)</tt> แล้วสีของจุดที่กำหนดด้วย <tt>glVertex</tt> จะเป็นสีขาวไปจนกว่าจะเรียก <tt>glColor</tt> ใหม่อีกครั้ง
 +
 
 +
{{PyOpenGL Programming/Navigation|Basic Vocabulary|Tutorial 2: Geometric Primitives}}

รุ่นแก้ไขปัจจุบันเมื่อ 06:10, 27 ตุลาคม 2551

โปรแกรมต่อไปนี้วาดสี่เหลี่ยมจัุตุรัสสีขาวรูปหนึ่งที่กลางวินโดว์

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

def display():
    glClearColor(0,0,0,0)
    glClear(GL_COLOR_BUFFER_BIT)
    
    glBegin(GL_QUADS)
    glVertex2d(-0.5, -0.5)
    glVertex2d(0.5, -0.5)
    glVertex2d(0.5, 0.5)
    glVertex2d(-0.5, 0.5)
    glEnd()
    
    glutSwapBuffers()

if __name__=="__main__":
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
    glutInitWindowSize(512, 512)
    glutCreateWindow("Test 01")
    
    glutDisplayFunc(display)
    
    glutMainLoop()

การ import โมดูล PyOpenGL

โดยมากเราจะ import สองโมดูอคือ OpenGL.GL และ OpenGL.GLU ซึ่งเป็นโมดูลหลัก

from OpenGL.GL import *
from OpenGL.GLU import *

นอกจากนี้เราจะต้อง import โมดูล OpenGL.GLUT เพื่อใ้ช้ฟ้ังก์็ชันต่างๆ ของ GLUT ด้วย

from OpenGL.GLUT import *

คำสั่ง OpenGL

ถ้าเราตัดโปรแกรมข้างบนเอามาแค่ส่วนที่เป็นคำสั่ง OpenGL จะได้ผลดังต่อไปนี้

glClearColor(0,0,0,0)
glClear(GL_COLOR_BUFFER_BIT)
    
glBegin(GL_QUADS)
glVertex2d(-0.5, -0.5)
glVertex2d(0.5, -0.5)
glVertex2d(0.5, 0.5)
glVertex2d(-0.5, 0.5)
glEnd()

เรามาดูกันทีละคำสั่ง

  • glClearColor(0.0, 0.0, 0.0, 0.0)
    เปลี่ยนสีที่จะใช้ล้างหน้าจอเป็นสีดำ
  • glClear(GL_COLOR_BUFFER_BIT)
    ล้าง bitplane ที่เก็บสีด้วยสีทีกำหนดใน glClearColor
  • glColor3f(1.0, 1.0, 1.0)
    เปลี่ยนสีเป็นสีขาว โดยที่จุด เส้น และรูปทรงที่วาดต่อจากนี้ไปจะเป็นสีขาว
  • glBegin(GL_QUADS)
    บอกว่าต่อไปนี้เราจะวาดรูปสี่เหลี่ยม
  • glVertex3f(x, y, z)
    กำหนดจุดยอดมุมของสี่เหลี่ยม
  • glEnd()
    บอกว่าสิ่งที่เริ่มไปตั้งแต่ glBegin ที่แล้วได้เสร็จสิ้นแล้ว ในที่นี้คือบอกว่ากำหนดสี่เหลี่ยมเสร็จสิ้นแล้ว (เราได้กำหนดไปสี่จุดพอดี!)

สังเกตว่าคำสั่ง OpenGL จะขึ้นต้นด้วย gl เสร็จแล้วจะตามด้วยชื่อคำสั่ง เช่น Vertex หรือ Color เป็นต้น บางคำสั่งอาจมีจำนวนและชนิดของ argument เช่น 3f บอกว่าต้องการ argument เป็นตัวเลขประเภท float จำนวน 3 ตัว หรือ 3i บอกว่าต้องการ argument ประเภท int จำนวน 3 ตัว เป็นต้น อย่างไรก็ดีภาษาไพทอนไม่ได้มาตรวจเช็คว่า argument ต้องเป็นประเภทตามที่ระบุไว้จริงๆ ชื่อคำสั่งแปลกๆ เหล่านี้เป็นผลมาจากการที่ OpenGL ถูกเขียนขึ้นมาใช้กับภาษา C เป็นภาษาแรก ดังนั้นคนเขียนโปรแกรม PyOpenGL จึงต้องระมัดระวังตรวจสอบให้ตัวแปรที่ส่งไปมีชนิดที่ถูกต้องด้วยตัวเอง สำหรับตัวย่อของตัวแปรชนิดต่างๆ สามารถดูได้ที่ http://fly.cc.fer.hr/~unreal/theredbook/chapter01.html ที่หัวข้อ Open Command Syntax

ข้อควรรู้อีกประการหนึ่ีงคือ OpenGL ทำงานเป็น state machine กล่าวคือ มันจะจำค่าต่างๆ ที่ผู้ใช้กำหนดได้เอาไว้ โดยเมื่อผู้ใช้กำหนดค่า ค่านั้นจะถูกใช้ต่อไปเรื่อยๆ จนกว่าจะเปลี่ยน ค่าที่ OpenGL จำไว้ ได้แก่ สีที่ใช้ล้างหน้าจอ สีของจุด ทิศทางและตำแหน่งของกล้องถ่ายรูป ฯลฯ ยกตัวอย่างเช่น ยกตัวอย่างเช่น เวลาเราเรียก glColor3f(1,1,1) แล้วสีของจุดที่กำหนดด้วย glVertex จะเป็นสีขาวไปจนกว่าจะเรียก glColor ใหม่อีกครั้ง

หน้าก่อน: Basic Vocabulary สารบัญ หน้าต่อไป: Tutorial 2: Geometric Primitives