- Widen bare mathutils type params (Vector, Euler, etc.) to also accept Sequence[float], matching Blender's mathutils_array_parse C behavior - Fix getset_descriptor readonly detection by probing __set__ on the descriptor instead of checking fset (which doesn't exist on C descriptors) - Accept int | slice keys in __getitem__/__setitem__/__delitem__ - Accept Sequence[element_type] values in __setitem__ for slice assignment - Add mathutils overrides for Matrix.Translation and Matrix.Scale - Extend apply_overrides to support ClassName.method_name keys - Add conformance test files from Blender docs examples - Disable reportUnusedExpression in conformance checks Remaining known conformance issues: - draw_handler_add missing from SpaceView3D - Vector not nominally Sequence[float] (buffer protocol, swizzle setters) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1.3 KiB
Python
41 lines
1.3 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 quaternion, euler degrees for mere mortals and (axis, angle).
|
|
print("Final Rotation:")
|
|
print(quat_out)
|
|
print("{:.2f}, {:.2f}, {:.2f}".format(*(math.degrees(a) for a in quat_out.to_euler())))
|
|
print(
|
|
"({:.2f}, {:.2f}, {:.2f}), {:.2f}".format(
|
|
*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)
|
|
|
|
# Direct buffer access is supported.
|
|
print(memoryview(quat_avg).tobytes())
|