Vous pouvez grouper des objets ensemble pour créer un objet composite
qui peut être déplacé et tourné comme si c'était un unique objet. Créez une structure, et associez
des objets à cette structure:
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)
Par défaut, frame() est à la position (0,0,0) et les axes sont dans la direction
x (1,0,0). Le cylindre et la sphère sont créés dans la structure.
Lorsque n'importe lequel des attributs de la structure est modifié (pos,
x, y, z,
axis, ou up),
l'objet composite est réorienté et repositionné.
Un autre attribut de la structure est objects,
qui est une liste des objets actuellement visibles et contenus dans la structure (la
liste ne comprend pas les objets qui sont actuellement non visibles). Si vous voulez
rendre tous les objets rouges dans la structure, appliquez les instructions suivantes (on suppose
que la structure est nommée f):
for obj in f.objects:
obj.color = color.red
Si vous utilisez cette méthode pour rendre tous les objets invisibles,
la liste f.objects sera vide. Si vous avez besoin d'une liste contenant tous les objets,
aussi bien visibles que invisibles, vous devez maintenir votre propre liste d'objets.
Si ball
est un objet de la stucture, ball.pos est la position
locale à la structure, et non la position actuelle dans "l'espace monde".
Voici une routine qui calcule la position d'un vecteur tel que ball.pos
dans l'espace entier:
def world_space_pos(frame, local):
"""Retourne la position de local dans l'espace entier."""
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