def create_group_action(self, objs, transformations, times): # TODO: how to start multiple animations at once if len(transformations) != len(times): raise ValueError("Pass equal amount of transformations and times") x, y, z, w = objs[0].quaternion Tinit = Rotation.from_quaternion([w, x, y, z]) * Translation( objs[0].position) positions = [] quaternions = [] for M in transformations: Sc, Sh, R, T, P = (M * Tinit).decomposed() positions.append(list(T.translation)) quaternions.append(R.quaternion.xyzw) position_track = p3js.VectorKeyframeTrack(name='.position', times=times, values=list( flatten(positions))) rotation_track = p3js.QuaternionKeyframeTrack( name='.quaternion', times=times, values=list(flatten(quaternions))) animation_group = p3js.AnimationObjectGroup() animation_group.exec_three_obj_method('add', objs[0]) # this is not working obj_clip = p3js.AnimationClip(tracks=[position_track, rotation_track]) mixer = p3js.AnimationMixer(animation_group) obj_action = p3js.AnimationAction(mixer, obj_clip, animation_group) return obj_action
def transform(self, transformation): R = Rotation.from_quaternion(self.quaternion) R = transformation * R # Due to a bug on COMPAS 0.10.0 # (Fixed on https://github.com/compas-dev/compas/pull/378 but not released atm) # we work around the retrival of the rotation component of R and instead decompose and get it _, _, r, _, _ = R.decomposed() self.quaternion = r.quaternion
def transform(self, transformation): """Transform the volume using a :class:`compas.geometry.Transformation`. Parameters ---------- transformation : :class:`compas.geometry.Transformation` """ R = Rotation.from_quaternion(self.quaternion) R = transformation * R self.quaternion = R.rotation.quaternion
def create_action(self, obj, transformations, times): if len(transformations) != len(times): raise ValueError("Pass equal amount of transformations and times") x, y, z, w = obj.quaternion Tinit = Rotation.from_quaternion([w, x, y, z]) * Translation(obj.position) positions = [] quaternions = [] for M in transformations: Sc, Sh, R, T, P = (M * Tinit).decompose() positions.append(list(T.translation)) quaternions.append(R.quaternion.xyzw) position_track = p3js.VectorKeyframeTrack(name='.position', times=times, values=list(flatten(positions))) rotation_track = p3js.QuaternionKeyframeTrack(name='.quaternion', times=times, values=list(flatten(quaternions))) obj_clip = p3js.AnimationClip(tracks=[position_track, rotation_track]) obj_action = p3js.AnimationAction(p3js.AnimationMixer(obj), obj_clip, obj) return obj_action
def test_quaternion(): q1 = [0.945, -0.021, -0.125, 0.303] R = Rotation.from_quaternion(q1) q2 = R.quaternion assert allclose(q1, q2, tol=1e-3)
def transform(self, transformation): R = Rotation.from_quaternion(self.quaternion) R = transformation * R self.quaternion = R.rotation.quaternion
from compas.geometry import Rotation from compas.geometry import Quaternion q = Quaternion(0.918958, -0.020197, -0.151477, 0.363544) print(q.is_unit) R = Rotation.from_quaternion(q) print(R.quaternion == q)
"""There are several ways to construct a `Rotation`. """ import math from compas.geometry import Frame from compas.geometry import Rotation R = Rotation.from_axis_and_angle([1, 0, 0], math.radians(30)) R = Rotation.from_axis_and_angle([1, 0, 0], math.radians(30), point=[1, 0, 0]) R = Rotation.from_basis_vectors([0.68, 0.68, 0.27], [-0.67, 0.73, -0.15]) R = Rotation.from_frame(Frame([1, 1, 1], [0.68, 0.68, 0.27], [-0.67, 0.73, -0.15])) R = Rotation.from_axis_angle_vector([-0.043, -0.254, 0.617]) R = Rotation.from_quaternion([0.945, -0.021, -0.125, 0.303]) R = Rotation.from_euler_angles([1.4, 0.5, 2.3], static=True, axes='xyz') print(R)