VTKPython

VPython

日経ソフトフェアで紹介されていた、VTKPythonを使ってみました。
 
インストールの方法はこちらがとっても詳しいです。
http://www.cubelab.com/ymasuda/python/vtkpython/installation.html
 
VTKPythonっていうのは、簡単に3Dグラフィックを表示するライブラリのVTKを
Pythonに移植したものです。
 
3Dグラフィックの簡易な実行環境が欲しかったので、
ちょうど良かったです♪(´▽`)
 
Direct3Dで、簡単な実験をするのはちょっと大袈裟なんですよね。
 
どれぐらい簡単なのかというと、、、
(実行サンプルに入っているソースです)

import vtk
import time

# 円錐オブジェクトを作る!
cone = vtk.vtkConeSource()
cone.SetHeight( 3.0 ) # 高さ
cone.SetRadius( 1.0 ) # 半径
cone.SetResolution( 10 ) # 面の数

# Polygonをパイプラインに設定?
coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInput(cone.GetOutput())

# レンダリングフィルタに設定?
coneActor = vtk.vtkActor()
coneActor.SetMapper( coneMapper )

# レンダラに設定
ren1= vtk.vtkRenderer()
ren1.AddActor(coneActor)
ren1.SetBackground(0.0, 0.0, 1.0) # 消去色

# 窓に登録
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(300, 300) # サイズ

for i in range(0,360):
    time.sleep(0.03) # タイマー

    renWin.Render() # 描画
    ren1.GetActiveCamera().Azimuth(1) # カメラを1°回転

(コメントは、私の勝手な解釈です...(´Д`;
なんとこれだけで、
円錐オブジェクトがグルグルまわるアニメーションができてしまいます!
素晴らしや…。
 
 
さらに、

# コールバック関数を定義
def myCallback(object, event):
    object.GetActiveCamera().Zoom(1.005)
・
・
・
ren1.AddObserver("StartEvent", myCallback) # コールバック関数を登録

Observerパターンで、renderの処理を定義していますね。
なるほど。
 
どうやら他の部分もゴリゴリのオブジェクト指向で設計されていて、面白いみたいです。
 
で、コールバック関数なのですが、
引数のobjectは、レンダラーオブジェクトです。
 
1.005倍でどんどんズームしちゃってますw
う〜む、面白い。

VPython

VTKPythonで、3D物理シミュレーションっぽいことをやってみたかったのですが、
それはどうも違うみたいでした。
 
調べてみたら、それをやるならVTKPythonよりもVPythonの方がいいみたいですね。
http://www.vpython.org/index.html
ということで、インストール。
 

from visual import *

greenball = sphere(pos=vector(0, 0, 0), radius=2, color=color.green)

これだけで、ボールが表示されます。
 
あああ、こっちの方が簡単だ…、、、(´Д`;
 

from visual import *

# ボールオブジェクト作成
ball = sphere(pos=(0, 10, 1), color=color.red)
ball.velocity = vector(0, -1, 0) # 初速度

dt = 0.01
while True:
    rate(100) # 描画更新割合
    ball.pos += ball.velocity*dt # 距離+速さ
    if ball.y < 0:
        ball.velocity.y = -ball.velocity.y # 反射
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt # 重力加速

こうすると、ボールが画面の中央で、ぼーんぼーんと跳ねます。
うーむ、面白い。
 
さらに、

from visual import *

# 外枠
def wirecube(s):
    c = curve (color=color.white, radius=0.1)
    pts = [(-s, -s, -s),(-s, -s, s),  (-s, s, s),
           (-s, s, -s), (-s, -s, -s), (s, -s, -s),
           (s, s, -s),  (-s, s, -s),  (s, s, -s),
           (s, s, s),   (-s, s, s),   (s, s, s),
           (s, -s, s),  (-s, -s, s),  (s, -s, s),(s, -s, -s)]
    for pt in pts:
        c.append(pos=pt)

side = 4.0 # 移動可能範囲(-size〜size)
wirecube(side) # 外枠オブジェクト作成

# ボールオブジェクト
ball = sphere(color=color.green)
ball.radius = 0.4 # 半径
ball.mass   = 1.0 # 質量
ball.p      = vector(-0.15, -0.23, +0.27) # 移動量

dt = 0.3
while 1:
  rate(100)
  ball.pos = ball.pos + (ball.p/ball.mass)*dt # 加速
  if not (-side < ball.x < side):
    ball.p.x = -ball.p.x # X壁反射
  if not (-side < ball.y < side):
    ball.p.y = -ball.p.y # Y壁反射
  if not (-side < ball.z < side):
    ball.p.z = -ball.p.z # Z壁反射

こうすると、ボールが3Dの枠の中でガンガン移動しまくります。
しかも、枠にぶつかると、枠が揺れる!

タブインデント禁止

今更ネタですが…。
http://www.python.jp/Zope/ (2005/04/01)より。

Guido van Rossum 氏は Python プログラマのさらなる飛躍のため、
新たな「型」の導入を決心したようです。
それはホワイトスペースの使い方を構文レベルで強制することです。
次のような案が出ています。

  • タブによるインデントは廃止。
  • インデントにはスペースを使う。
  • return(1) のように冗長なカッコの利用は認めない。必ず return 1 のように書く。
  • ( x > y ) のようにカッコの前後に余計なスペースを入れてはいけない。(x > y) と書く。
  • 行末にセミコロンを入れるのは禁止。
  • 代入や比較演算子の前後には必ずスペースを入れる。
  • コロンの前にスペースを入れてはいけない。
  • 辞書の場合 {'foo': 'bar'} のようにコロンの後ろに必ずスペースを入れる。
  • if x: y のような書き方は廃止。必ず2行に分け、インデントしなければならない。

これらは Python 2.5 でオプションとして、2.6 から正式の構文として導入される予定です。

タブインデント禁止ですか!!!
厳しいなぁ…。
 
しかし、他の制約はもっと厳しいですね(笑)
過去のソースが実行できなくなっちゃいますよね、、。

大学5年間で学んでよかった・学ぶべきだった情報技術

http://d.hatena.ne.jp/ryoko_komachi/20050707/1120754284
 
これ、全部できれば、引く手あまたですね(´∀`)
とりあえず、この中の2〜3つ極めれば、職に困ることはなくなりそうです。
 
個人的にピックアップしたいのが、

ですね。
 
DirectXって、ユーティリティ関数が多くて、数学の知識がなくても、
そこそこの3Dゲームが作れてしまいます。
 
うちの先生曰く、
DirectXばかり使っていると馬鹿になる」
ということです。
 
私もそう思います。
 
 
OpenGLだと、そういったものをネットで探したり、自作しなければならないので、
とても勉強になると思います。
 
あと、PS3OpenGLを採用したってこともありますね。
 
…まあ、正直、将来的には、DirectXXbox360が日本市場を独占すると思っています。
http://blog.livedoor.jp/shi3z/archives/22120017.html
 
が、当面はPS3で開発することも要求されると思うので、
OpenGLもやっておいた方がいいですね。(たぶん)

キーワード編集

デザインパターン関連のキーワードを編集。

  1. Iterator
  2. Adapter
  3. TemplateMethod
  4. FactoryMethod
  5. Singleton
  6. Prototype
  7. Builder
  8. AbstractFactory
  9. Bridge
  10. Strategy
  11. Composite
  12. Decorator
  13. Visitor
  14. ChainOfResponsibility
  15. Facade
  16. Mediator
  17. Observer
  18. Memento
  19. State
  20. Flyweight
  21. Proxy
  22. Command
  23. Interpreter

BuilderとかAbstractFactoryとかBridgeあたりが
まだよく理解できてないですね…。
 
コンピューターの新着キーワードデザインパターンで埋まってて、
楽しいなーw
http://d.hatena.ne.jp/keywordlist?cname=elec