VPython を使った簡単な 3D プログラミング

I. VPython: the Python/ Visual / IDLE 環境

"IDLE."と呼ばれる対話型開発環境が使われています。

表示ウィンドウ

VPython の表示ウィンドウを使ってオブジェクトを 3D 表示できます。

(0,0,0) は表示ウィンドウの中心です。 x 軸 の値を増やすと右に移ります。y 軸の値を増やすと上に動きます。z 軸の値を増やすと前方向に動きます。z 軸はスクリーンから飛び出す方向を指しています。

x,y,z にはどんな大な数値でも使えます。表示するとき自動的にスケールを合わせるからです。(例えば原子核を表すために半径 1E-15 m の球を生成できます。惑星を表すために半径 1E6 m の球を使うこともできます。両方を同時に一つの画面に表示することは無意味ですけれど。)

出力ウィンドウ

プログラムの中で -print- 命令文を使えます。打ち出された文字列はスクロール可能なテキスト出力ウィンドウに表示されます。このウィンドウを変数値/リスト/メッセージなどの打ち出しに使えます。テキスト出力ウィンドウをメッセージを見たいところに置いてください。(訳注:MS Windows では VPython スクリプトを起動したコンソール画面がテキスト出力ウィンドウになります)

コード・ウィンドウ

IDLE のコード・ウィンドウに下の簡単なプログラムを打ち込んで走らせてください。(F5 を押すか Run メニューを使ってください)下にある図画が表示されます。

from visual import *

redbox=box(pos=vector(4,2,3), size=(8.,4.,6.),color=color.red)

greenball=sphere(pos=vector(4,7,3), radius=2, color=color.green)

Visual は 3D Python 言語で使われるグラフィック・モジュールの名前です。VPython は Python プログラミング言語と Visual モジュールと開発環境の組み合わせの名前です。

シーンの見方

表示ウィンドウ内でマウスの右ボタンをクリックしてドラッグしてください(マッキントッシュではシフト・キーも押します)。左右にドラッグするとシーンの周りを回って見られます。図形が回転します。水平軸の周りを回って見るためにはマウスの右釦を上下にドラッグします。シーンを近づけたり遠ざけたりするためにはマウスのセンター釦をクリック・ドラッグします。(2 釦マウスでは右釦と左釦を一緒に押します。1 釦マウスではコントロール・キーを押します。)

II. Visual の構成要素

オブジェクト、名前、属性

sphere, box, curve といった生成されるグラフィック要素はプログラム実行中に存在し続けます。Visual 3D グラフィック・モジュールもグラフィック要素が存在する限り それらを表示し続けます。プログラムの中でグラフィック要素を生成後に参照するためには、上の例でのように redbox or greenball といった名前をつけねばなりません。全てのオブジェクトは属性:すなちわち greenball.pos (sphere の位置を意味します) , greenball.color, radius のようなプロパティを持ちます。オブジェクトの位置や色といった属性を変更すると Visual は自動的に新しい位置や色でオブジェクトを表示しなおします。

属性の値はコンストラクタ(オブジェクトを生成するコードです)で設定できます。後で属性を変更することもできます。

greenball.radius = 2.2

組み込み属性を追加して新しい属性を作り上げることもできます。たとえば moon; と名付けた新しい sphere を作り質量 (moon.mass) や運動量 (moon.momentum)を追加できます。

ベクトル

Visual の全ての要素が見えるオブジェクトとは限りません。Visual は 3D のベクトル量を扱えます。ベクトル演算もできます。a, という名前のベクトル量を作れば、その要素を a.x, a.y, and a.zのように参照できます。二つのベクトル a bを足し合わせるのに、要素ごとに足し算させる必要はありません。Visual はベクトルの足し算を扱えます。

a = vector(1.,2.,3.)

b = vector(4.,5.,6.)

c=a+b

c をプリントさせれば これが (5,7,9) のベクトル要素からなることが分かります。

スカラー積

d = 3.*a # d は (3., 6., 9.) 要素のベクトルです

ベクトルの大きさ

d = mag(c) # d はスカラー値です

z = mag(c)**2 # ベクトルの二乗ではありません。大きさです。

ベクトルの積

f = cross(a,b) # 外積

g = dot(a,b) # 内積

h = norm(a) # 単位ベクトル(訳注:距離ではありません)

Visual のオブジェクトに速度や運動量といったベクトル属性を持たせられます。

III. 単純な Python プログラム

3D Visual グラフィック・モジュールのインポート

プログラムは下の行で始まります。

from visual import *

コメント

Python プログラムのコメントは "#" で始まります。

# この行はコメントです

(訳注:日本語フォントのコメントを使うにはコードの最初に文字コード指定「# coding=shift_jis」を入れなければなりません。

変数

Python プログラムでは変数は何処でも作れます。単純に値を変数名に代入するだけです。変数の形は代入文によって決まります。

a = 3 # 整数です

b = -2. # 浮動小数点です

c = vector(0.4, 3e3, -1e1) # ベクトルです

Earth = sphere(pos=(0,0,0), radius=6.4e6) # Visual オブジェクトです

bodies = [ship, Earth, Moon] # オブジェクトのリストです

shpere(), box() といった Visual の基本オブジェクトは color などといった属性を持ちます。mass や momentum などの属性を追加して定義することもできます。vector() などの他のオブジェクトはビルトイン属性は持ちますが、属性を追加することはできません。Number, lis などの他のビルトイン・オブジェクトは一切の属性を持ちません。

割り算についての注意

整数の割り算は期待どおりとは限りません。計算結果が新しい整数に丸められるからです。下を見てください。

a = 2/3

print a # a は 0 です

この問題を避けるには全ての数値の後に小数点をつけます。こんな感じです。

b = 2./3.

print b # b は 0.6666667 です。期待どおりです

プログラムの最初に下の命令文を入れておくことを推奨します。そのときは 2/3 は 0.6666667 になります。"future" の前後には二つのアンダースコア文字が必要です。

from __future__ import division

べき演算

x**2 # x^2 と書くのではありません

はエラーとなるので 10.**-2 を使います

(訳注 python 2.2 以降では 10**-2 も使えます)

論理判定

If, elif ("else if"), else 文

if a == b: # 下の比較式を参照ください

    c = 3.5 # 条件式が真ならばインデントされたコードが実行されます if test is true

elif a < b:

    c = 0. # a < b のときだけ c はゼロになります。

else:

    c = -23.2

 

論理式

==

等しい

!=

等しくない ( <> も使えます)

<

より小さい

>

より大きい

<=

以下

>=

以上

or

論理 or

and

論理 and

in

シーケンスのメンバー

not in

シーケンスのメンバーでない

 

リスト

リストはオブジェクトを順序付けて並べたものです。オブジェクトの種類は問いません。リストは角括弧でくくられます。

moons = [Io, Europa, Ganymede, Callisto]

関数 "arange" ( "arrayrange" を短くしたものです) は数値の並びを生成します。

angles = arange (0., 2.*pi, pi/100.)

# 0. から 2.*pi-(pi/100.) までの (pi/100.) 刻みの数値です

 

numbers = arange(10) # 整数引数のときは整数ベクトル・リストになります

print numbers # [0,1,2,3,4,5,6,7,8,9]

 

ループ

Python でも一番簡単なループは "while" です。指定された論理式が真である限り、このループは回り続けます。

while x < 23:

    x = x + vx*dt

無限ループを書くためには論理式が常に真となるようにします。

while 1==1:

    ball.pos = ball.pos + (ball.momentum/ball.mass)*dt

数値 1 の論理値は真と評価されるので、下のコードは無限ループとなります

while 1:

    a = b+c

無限ループを使ってもかまいません。IDLE では Run メニューから "Stop Program" を選べばプログラムを停止させられるからです。(訳注:コンソールからのときは ctrl + C です)

もちろんループ回数をシーケンスの数だけにすることもできます。

moons = [Io, Europa, Ganymede, Callisto]

for a in moons:

    r = a.pos - Jupiter.pos

 

for x in arange(10):

# 上の "lists" を参照ください

...

 

for theta in arange(0., 2.*pi, pi/100.):

# 上の "lists" を参照ください

ループを途中で戻したり抜け出させたり出来ます

if a == b: continue # ループの開始位置に戻ります

if a > b: break # ループを抜け出します

 

結果の出力

数値、ベクトル、リストなどを出力するには "print" 命令を使います

print Europa.momentum

テキストをメッセージとして出力するには引用符で囲みます。

print "We have just crashed on the Moon with speed", v, "m/s."

Python についてのより詳しい説明

Visual の全てを詳しく説明してある Visual モジュール VPython を参照ください

Python プログラム言語の非常に小さな一部分だけに限って纏めてみました。広範なPython Documentation が ここにあります。 Python website からも更なる情報が得られます。しかし これらの情報を理解するには多くの他言語におけるプログラミング経験が必要です。Python について より深く勉強したい方には「初めての Python」 著者: Mark Lutz & David Ascher, 1999, O'Reilly. を薦めます