2008/04/28

glRotate

前回は行列を持いて回転を行いましたが、今回はglRotateコマンドを持ちいて回転を行います。こちらの方が普通のようです。前回からの変更点は
glMultMatrixf(translate)

glRotatef(2 , 0.5 , 1 , 0.25)
に代わっているだけです。
今回もhttp://wisdom.sakura.ne.jp/system/opengl/gl11.htmlを参照させて頂きました。

From my previous example, I made only one change. From glMultMatrixf(translate) to glRotatef(2 , 0.5 , 1 , 0.25). I don't have to use matrix. This would be more straight forward.


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

def disp():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POLYGON)
glColor3f(1 , 0 , 0)
glVertex2f(-0.9 , -0.9)
glColor3f(0 , 1 , 0)
glVertex2f(0 , 0.9)
glColor3f(0 , 0 , 1)
glVertex2f(0.9 , -0.9)
glEnd()
glFlush()

def timer(value):
glRotatef(2 , 0.5 , 1 , 0.25)
glutPostRedisplay()
glutTimerFunc(50 , timer , 0)

glutInit(sys.argv)
glutInitWindowPosition(100 , 50)
glutInitWindowSize(400 , 300)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutCreateWindow("rotate4.py")
glutDisplayFunc(disp)
glutTimerFunc(100 , timer , 0)
glutMainLoop()

Translate

モデル・ビュー変換というものを使って三角形を回転させてみましょう。今回も、
http://wisdom.sakura.ne.jp/system/opengl/gl11.html
を参考にさせて頂きました。Pythonに変換した時にわかったことは、C言語の配列
GLfloat translate[] = {
1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 ,
0 , 0 , 1 , 0 ,
0 , 0 , 0 , 1
};

はPythonでは単に
translate = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
と書けば良いようです。

By using Model-View translation, a triangle is rotated around Y axis.
During making Python sample from original C sample, I found that array in C,

GLfloat translate[] = {
1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 ,
0 , 0 , 1 , 0 ,
0 , 0 , 0 , 1
};
can be implemented in Python as follows.
translate = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]


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

ANGLE = 0.2
translate = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]

def disp():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POLYGON)
glColor3f(1 , 0 , 0)
glVertex2f(-0.9 , -0.9)
glColor3f(0 , 1 , 0)
glVertex2f(0 , 0.9)
glColor3f(0 , 0 , 1)
glVertex2f(0.9 , -0.9)
glEnd()
glFlush()

def timer(value):
glMultMatrixf(translate)
glutPostRedisplay()
glutTimerFunc(50 , timer , 0)

glutInit(sys.argv)
glutInitWindowPosition(100 , 50)
glutInitWindowSize(400 , 300)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutCreateWindow("rotate3.py")
glutDisplayFunc(disp)
glutTimerFunc(100 , timer , 0)
translate[0] = cos(ANGLE)
translate[2] = -sin(ANGLE)
translate[8] = sin(ANGLE)
translate[10] = cos(ANGLE)
glutMainLoop()

Timer

OpenGLでは一定時間処理を待つ方法をglutTimerFuncで提供しています。これをテストするために、
http://wisdom.sakura.ne.jp/system/opengl/gl10.html
からCで書かれたサンプルをお借りし、Pythonに変換してみました。自分でサンプルを作ろうとしたのですが、うまくいかなかったので、助かりました。ありがとうございました。

OpenGL provides Timer function by glutTimerFunc to add specified delay in execution. I refered a sample program from
http://wisdom.sakura.ne.jp/system/opengl/gl10.html
and translated it into Python.

# OpenGL Timer sample in Python


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

top = -0.9
isUp = 1
def disp():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POLYGON)
glVertex2f(-0.9 , -0.9)
glVertex2f(0 , top)
glVertex2f(0.9 , -0.9)
glEnd()
glFlush()

def timer(value):
global top, isUp
if top > 0.9:
isUp = 0
elif top <= -0.9:
isUp = 1
if isUp:
topadd = 0.1
else:
topadd = -0.1
top = top + topadd
glutPostRedisplay()
glutTimerFunc(1000 , timer , 0)

glutInit(sys.argv)
glutInitWindowPosition(100 , 50)
glutInitWindowSize(400 , 300)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutCreateWindow("Kitty on your lap")
glutDisplayFunc(disp)
glutTimerFunc(100 , timer , 0)
glutMainLoop()


2008/04/27

pwd, cd, ls in Python


PythonのIDLEでcshのpwd, cd, lsに相当するコマンドが判明しました。
まずおまじないとして,
from os import *
getcwd() ==> pwd
chdir("..") ==> cd ..
listdir (".") ==> ls

osモジュールの中の関数名を調べるコマンドは
dir (os)

ここまで分かれば、後はなんとかなりそうです。

I got Python command same function as pwd, cd, ls of csh.
from os import *
getcwd() ==> pwd
chdir("..") ==> cd ..
listdir (".") ==> ls

dir(os) shows all fucntions in os module. This enable me to find csh equivalent commands.

Vertex color smooth shading

Smoth shading. I feel better using IDLE pull dowm meny. It's straight forward.
徐々にIDLEに慣れてきました。慣れれば悪くなさそうです。

cd and ls command in Python IDLE


PythonのGUIであるIDLEの中でPythonのプログラムを実行するために、フォルダーを変えて、ファイルを探そうとしたのですが、うまくいきません。WindowsのIDLEの中では次のようなコマンドは使えません。
cd
ls
dir
import os
os.system("dir")

一時間ほど調べたのですが、Webには何も出ていません。結局IDLEのプルダウンメニューを使う以外の方法はないというのが、今日のところの結論です。
IDLE --> File --> Open でソースファイルを開く
Run --> Run Module F5

I cannot use Windows system commands such as cd, ls, dir to look for and run a Python source file . import os, os.system("dir") also cannot be used because a DOS window is opend and closed immdiately after the command finished.

After around an hour, I found I should use IDLE pull down menu to do this. It's easy.
IDLE --> File --> Open
Run --> Run Module F5

Immediate mode


Python上でのOpenGL Immediateの例:
Phthon GUI (IDLE)上で実行するには、以下のソースコードを"immed.py"というファイルに保存し、
>>> import immed.py
とタイプして下さい。終了のコードは入っていませんので、強制終了してください。Pythonにはsourceというコマンドはなく、importを使うようです。

OpenGL Immediate mode example on Python. Simply draw a rectangle uin a window.
To run this program from Python GIU (IDLE), save the prigram in "immed.py" and then type,
>>> import immed.py
Note this doen't have exit routine and you have to kill the window.

# immed.py
import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

init_flag = 0

def display():
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
  glColor3f(1.0, 0, 0) # set the color of the polygon in R,G,B
  glBegin(GL_POLYGON)
  glVertex2f(-0.5, -0.5)
  glVertex2f(-0.5, 0.5)
  glVertex2f(0.5, 0.5)
  glVertex2f(0.5, -0.5)
  glEnd()
  glFlush()
glutInit( sys.argv ) # initialize glut. This must be called first
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowSize( 256, 256 ) # set the window size
glutCreateWindow( 'immediate' ) # set the window title
glutDisplayFunc( display ) # set display callback
glutMainLoop() # get into main loop

2008/04/26

Use Phyton as calculator


Pythonはインタープリタですので簡単な電卓としても使えますが、複素数も扱えるそうです。

Python is an interpreter. It can be used as a simple calculator which can handle complex.

Python document


パイソン2.5.2には日本語のドキュメントは付属していませんが、パイソン2.3.4jp(python234jp-20040927.exe)には日本語のドキュメント(Python234jp.chm)が付いていますので、python234jpをインストールするのも良いアイデアです。異なるバージョンのパイソンはうまく共存できるようです。

Python 2.5.2 doesn't include Japanese document. But, Python 2.3.4jp (python234jp-20040927.exe) includes Japanese document. I installed this just to get the document.

2008/04/24

Python and PyOpenGL install on Windows Vista

OpenGL is usually used with C/C++ compiler. But, it's a little too much to me at this point of time. I looked for a interpreter and I found I can use Python which is very handy, free and platform independent.

Python 2.5.2 installation by refering Ponta's blog. This blog is very helpfull for me to use OpenGL on Python first time.
http://ponta027.blog35.fc2.com/blog-date-200709.html

Environment:
Hardware: Sony VAIO notebook PC, VGN-SZ74B
CPU: Intel Core2 Duo T7300 2GHz
RAM: 3GB
OS: Windows Vista Home Premium

1. Download Python 2.5.2 Windows installer python-2.5.2.msi from http://www.python.jp/Zope/download/pythoncore

2. Double crick python-2.5.2.msi to start installation. You installed Python in C:\phyton25

3. Download glut, glut-3.7.6-bin.zip. Unzip and copy glut32.dll to both C:\WINDOWS\system and C:\WINDOWS\system32.

4. Doenload PyOpenGL, PyOpenGL-3.0.0b1.win32.exe. Double crick the file to install PyOpenGL.

5. Invoke MSDOS window in C:\phyton25. Make a sample program sample1.py by copying the following code. Then, type "python sample1.py" in MSDOS window. You can see a teapot diaplayed in a new window.

### sample1.py
### are totally ignored in HTML. I used   in the sample. Please replace   to real tab using text editor. Python is a tab or indent base language. It doen't run without right number of tabs.

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

init_flag = 0

def display():
 global init_flag
 if not init_flag:
  glEnable( GL_LIGHTING )
  glEnable( GL_LIGHT0 )
  glEnable( GL_DEPTH_TEST )
 init_flag = 1

 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
 glPushMatrix()
 gluLookAt( 0,3,-10, 0,0,0, 0,1,0 )
 glutSolidTeapot( 2 )
 glPopMatrix()
 glFlush()

def reshape(w,h):
 glViewport( 0, 0, w, h )
 glMatrixMode( GL_PROJECTION )
 glLoadIdentity()
 gluPerspective( 45.0, 1.0*w/h, 0.1, 100.0 )
 glMatrixMode( GL_MODELVIEW )
 glLoadIdentity()

def keyboard(key,x,y):
 if key==chr(27): sys.exit(0)

glutInit( sys.argv )
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowSize( 256, 256 )
glutCreateWindow( 'teapot' )
glutReshapeFunc( reshape )
glutKeyboardFunc( keyboard )
glutDisplayFunc( display )
glutMainLoop()

OpenGL ES, Let's start

I'm starting learning OpenGL ES today. Let's enjoy OpenGL ES programing together.