frame を使った組み合わせオブジェクト

組み合わせオブジェクトを作ることによる、複数のオブジェクトを一体の物として動かしたり回転させたりできます。frame を基準にオブジェクトを生成し配置します。

f = frame()

cylinder(frame=f, pos=(0,0,0), radius=0.1, length=1, color=color.cyan)

sphere(frame=f, pos=(1,0,0), radius=0.2, color=color.red)

f.axis = (0,1,0)

f.pos = (-1,0,0)

デフォルトで frame は (0,0,0) の位置であり、その直行座標系軸は x 軸方向 (1,0,0) 方向を向きます。cylinder と sphere は frame を基準に生成されています。frame の属性 (pos, x, y, z axis, or up) が変わるとともに組み合わせオブジェクトも向き位置を変えます。

他の frame 属性は、現在 frame に含まれて見えている objectsです。 (frame 属性のリストには、見れないオブジェクトを含みません)もし frame に含まれるお全てのオブジェクトの色を赤にしたいときは下のようにします。(f が frame を保持する変数だとします)

for obj in f.objects:
obj.color = color.red

もし、このような方法(訳注: 上のコードで obj.color = color.red を obj.visible = 0 に置き換えたコード)で全てのオブジェクトを見えなくしたら、f.objects リストは空になります。全てのオブジェクトを frame のリストに含ませたまま、見えたり見えなくしたりするためにはあなた自身が、オブジェクトのリストを保守しなければなりません。(訳注:frame を継承して自分でリスト要素を管理せよの意味)

ball が frame の中のオブジェクトならば、ball.pos は frame を基準とした位置に配置されます。世界空間での位置ではありません。下に、このような ball.pos の世界空間における位置のベクトルを計算するルーチンを示します。

def world_space_pos(frame, local):
"""Returns the position of local in world space."""
x_axis = norm(frame.axis)
z_axis = norm(cross(frame.axis, frame.up))
y_axis = norm(cross(z_axis, x_axis))
return frame.pos+local.x*x_axis+local.y*y_axis+local.z*z_axis