forked from bartvdbraak/blender
9fa628f35b
Added conversion to and from exponential map representation. This representation is useful for interpolation of > 2 quaternions, or in PD controllers. Implementation in C functions quat_to_expmap, quat_normalized_to_expmap, and expmap_to_quat with Python API, unit tests and documentation. Added Quaternion.to_exponential_map() and Quaternion(3-vector) to Python API. Reviewers: campbellbarton Projects: #bf_blender Differential Revision: https://developer.blender.org/D1049
33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
import mathutils
|
|
import math
|
|
|
|
# a new rotation 90 degrees about the Y axis
|
|
quat_a = mathutils.Quaternion((0.7071068, 0.0, 0.7071068, 0.0))
|
|
|
|
# passing values to Quaternion's directly can be confusing so axis, angle
|
|
# is supported for initializing too
|
|
quat_b = mathutils.Quaternion((0.0, 1.0, 0.0), math.radians(90.0))
|
|
|
|
print("Check quaternions match", quat_a == quat_b)
|
|
|
|
# like matrices, quaternions can be multiplied to accumulate rotational values
|
|
quat_a = mathutils.Quaternion((0.0, 1.0, 0.0), math.radians(90.0))
|
|
quat_b = mathutils.Quaternion((0.0, 0.0, 1.0), math.radians(45.0))
|
|
quat_out = quat_a * quat_b
|
|
|
|
# print the quat, euler degrees for mear mortals and (axis, angle)
|
|
print("Final Rotation:")
|
|
print(quat_out)
|
|
print("%.2f, %.2f, %.2f" % tuple(math.degrees(a) for a in quat_out.to_euler()))
|
|
print("(%.2f, %.2f, %.2f), %.2f" % (quat_out.axis[:] +
|
|
(math.degrees(quat_out.angle), )))
|
|
|
|
# multiple rotations can be interpolated using the exponential map
|
|
quat_c = mathutils.Quaternion((1.0, 0.0, 0.0), math.radians(15.0))
|
|
exp_avg = (quat_a.to_exponential_map() +
|
|
quat_b.to_exponential_map() +
|
|
quat_c.to_exponential_map()) / 3.0
|
|
quat_avg = mathutils.Quaternion(exp_avg)
|
|
print("Average rotation:")
|
|
print(quat_avg)
|