From: Jonathan B. <jbr...@ea...> - 2004-03-14 22:15:55
|
On Sun, 2004-03-14 at 17:13, Jonathan Brandmeyer wrote: > On Sun, 2004-03-14 at 15:52, Axawire wrote: > > hi > > > > i have created a few frame objects and moved them about in the scene and > > rotated them. if i select an object in a frame how do i get its pos in world > > co-ordinates (co-ordinates of the whole scene)? > > > > thanks > > > > Simple case: the orientation of the frame has not changed (ie, up points > along +y and axis points along +x) simply add the object's pos to the > frame's pos. > > Harder case: the orientation of the frame is different. In this case > you will need to calculate the unit vectors representing the axes of the > frames local coordinate system, and calculate the object's displacement > along those unit vectors. > > # Requirements: > # frame has the following attributes: vector pos, vector axis, vector up > # (met by all primitive objects in Visual). > # local has the following attributes: double x, double y, double z. > # (met by vectors and primitive objects in Visual). > # frame.axis and frame.up are not colinear. (undefined coordinate > # system) > 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 = cross(z_axis, x_axis)) > return frame.pos + local.x*x_axis + local.y*y_axis + local.z*z_axis > Let me amend that routine. You also have to normalize the y_axis vector (smacks self on head). 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 -Jonathan Brandmeyer |