tiny.linear.Quat
Defined in tiny.linear.
API (22)
Actions
Public operations.
addconjugate: The inverse rotation of a unit quaternion.dot: The four-lane dot product, summed from w.fromArray: Lanes in storage order: w, x, y, z.fromAxisAngle: The rotation byangleradians about the unit vectoraxis.initlengthmul: The Hamilton product: rotating byb, then bya.negate: The same rotation with every lane negated.normalized: The unit quaternion alongq, or null when its length is at mostmin_lengthor is NaN.rotate:vrotated by the unit quaternionq, asv + (2w (u × v) + 2 u × (u × v))withuthe imaginary part.scaleslerp: Spherical interpolation between unit quaternions along the shorter arc:aatt = 0, andbor-batt = 1.subtoArray: Lanes in storage order: w, x, y, z.vector: The imaginary part(x, y, z).
Types and contracts
Public types and contracts.
identityslerp_linear_cosine: Above this cosine between endpoints,slerpinterpolates linearly and renormalizes, because the arc is too short for a stable sine ratio.
Fields and members
Public fields and members.
Source
Source: lib/linear/src/quaternion.zig:11
zig
pub const Quat = extern struct { w: f32 = 1, x: f32 = 0, y: f32 = 0, z: f32 = 0, pub const identity: Quat = .{}; /// Above this cosine between endpoints, `slerp` interpolates linearly and /// renormalizes, because the arc is too short for a stable sine ratio. pub const slerp_linear_cosine: f32 = 0.9995; pub fn init(w: f32, x: f32, y: f32, z: f32) Quat { return .{ .w = w, .x = x, .y = y, .z = z }; } /// Lanes in storage order: w, x, y, z. pub fn fromArray(lanes: [4]f32) Quat { return .{ .w = lanes[0], .x = lanes[1], .y = lanes[2], .z = lanes[3] }; } /// Lanes in storage order: w, x, y, z. pub fn toArray(q: Quat) [4]f32 { return .{ q.w, q.x, q.y, q.z }; } /// The rotation by `angle` radians about the unit vector `axis`. pub fn fromAxisAngle(axis: Vec3, angle: f32) Quat { const half = angle * 0.5; const sin_half = @sin(half); return .{ .w = @cos(half), .x = axis.x * sin_half, .y = axis.y * sin_half, .z = axis.z * sin_half, }; } /// The imaginary part `(x, y, z)`. pub fn vector(q: Quat) Vec3 { return .{ .x = q.x, .y = q.y, .z = q.z }; } pub fn add(a: Quat, b: Quat) Quat { return .{ .w = a.w + b.w, .x = a.x + b.x, .y = a.y + b.y, .z = a.z + b.z }; } pub fn sub(a: Quat, b: Quat) Quat { return .{ .w = a.w - b.w, .x = a.x - b.x, .y = a.y - b.y, .z = a.z - b.z }; } pub fn scale(q: Quat, s: f32) Quat { return .{ .w = q.w * s, .x = q.x * s, .y = q.y * s, .z = q.z * s }; } /// The same rotation with every lane negated. pub fn negate(q: Quat) Quat { return .{ .w = -q.w, .x = -q.x, .y = -q.y, .z = -q.z }; } /// The inverse rotation of a unit quaternion. pub fn conjugate(q: Quat) Quat { return .{ .w = q.w, .x = -q.x, .y = -q.y, .z = -q.z }; } /// The four-lane dot product, summed from w. pub fn dot(a: Quat, b: Quat) f32 { return a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; } pub fn length(q: Quat) f32 { return @sqrt(q.dot(q)); } /// The unit quaternion along `q`, or null when its length is at most /// `min_length` or is NaN. pub fn normalized(q: Quat, min_length: f32) ?Quat { assert(min_length >= 0); const len = q.length(); if (!(len > min_length)) return null; return q.scale(1 / len); } /// The Hamilton product: rotating by `b`, then by `a`. pub fn mul(a: Quat, b: Quat) Quat { return .{ .w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z, .x = a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, .y = a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, .z = a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, }; } /// `v` rotated by the unit quaternion `q`, as /// `v + (2w (u × v) + 2 u × (u × v))` with `u` the imaginary part. pub fn rotate(q: Quat, v: Vec3) Vec3 { const u = q.vector(); const uv = u.cross(v); const uuv = u.cross(uv); return v.add(uv.scale(2 * q.w).add(uuv.scale(2))); } /// Spherical interpolation between unit quaternions along the shorter /// arc: `a` at `t = 0`, and `b` or `-b` at `t = 1`. pub fn slerp(a: Quat, b: Quat, t: f32) Quat { var end = b; var cosine = a.dot(b); if (cosine < 0) { end = b.negate(); cosine = -cosine; } if (cosine > slerp_linear_cosine) { return a.add(end.sub(a).scale(t)).normalized(0).?; } const theta = std.math.acos(@min(cosine, 1)); const sin_theta = @sin(theta); const weight_a = @sin((1 - t) * theta) / sin_theta; const weight_b = @sin(t * theta) / sin_theta; return a.scale(weight_a).add(end.scale(weight_b)); }};Source: lib/linear/src/root.zig:11
zig
pub const Quat = quaternion.Quat;Complete caller list for Quat.fromArray
7 direct callers.
fun.sdfii.src.engine.abi.physics.sdfii_quat_integrate[function] — private; no exact target atfun/sdfii/src/engine/abi/physics.zig:96in nearest public ownerfun.sdfii.src.engine.abi.physicsfun.sdfii.src.engine.abi.physics.sdfii_quat_multiply[function] — private; no exact target atfun/sdfii/src/engine/abi/physics.zig:59in nearest public ownerfun.sdfii.src.engine.abi.physicsfun.sdfii.src.engine.abi.physics.sdfii_quat_slerp[function] — private; no exact target atfun/sdfii/src/engine/abi/physics.zig:67in nearest public ownerfun.sdfii.src.engine.abi.physicsfun.sdfii.src.engine.abi.physics.sdfii_quat_to_matrix[function] — private; no exact target atfun/sdfii/src/engine/abi/physics.zig:84in nearest public ownerfun.sdfii.src.engine.abi.physicsfun.sdfii.src.properties.physics.quaternion_matrix_is_rotation[function] — private; no exact target atfun/sdfii/src/properties/physics.zig:71in nearest public ownerfun.sdfii.src.properties.physicsfun.sdfii.src.properties.physics.quaternion_normalize_is_unit[function] — private; no exact target atfun/sdfii/src/properties/physics.zig:42in nearest public ownerfun.sdfii.src.properties.physicslib.linear.src.quaternion.test_normalized_sums_the_norm_from_w_and_returns_null_for_zero[function] — test source atlib/linear/src/quaternion.zig:181in nearest public ownerlib.linear.src.quaternion
Complete caller list for Quat.fromAxisAngle
12 direct callers.
tiny.rig.quatFromAxisAngle[function] atfun/rig/src/transform.zig:69lib.linear.src.affine.test_product_composes_right_to_left[function] — test source atlib/linear/src/affine.zig:107in nearest public ownerlib.linear.src.affinelib.linear.src.affine.test_scale_applies_before_rotation_and_translation[function] — test source atlib/linear/src/affine.zig:98in nearest public ownerlib.linear.src.affinelib.linear.src.matrix.test_matrix_product_composes_right_to_left[function] — test source atlib/linear/src/matrix.zig:336in nearest public ownerlib.linear.src.matrixlib.linear.src.matrix.test_quaternion_matrix_agrees_with_quaternion_rotation[function] — test source atlib/linear/src/matrix.zig:344in nearest public ownerlib.linear.src.matrixlib.linear.src.quaternion.test_axis-angle_rotation_turns_x_toward_y_about_z[function] — test source atlib/linear/src/quaternion.zig:160in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_conjugate_undoes_a_unit_rotation[function] — test source atlib/linear/src/quaternion.zig:174in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_product_applies_the_right_operand_first[function] — test source atlib/linear/src/quaternion.zig:166in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_slerp_interpolates_nearly_equal_rotations_linearly[function] — test source atlib/linear/src/quaternion.zig:204in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_slerp_reaches_its_endpoints_and_bisects_the_arc[function] — test source atlib/linear/src/quaternion.zig:188in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_slerp_takes_the_shorter_arc[function] — test source atlib/linear/src/quaternion.zig:197in nearest public ownerlib.linear.src.quaternionlib.linear.src.test.drawRotation[function] — private source atlib/linear/src/test.zig:115in nearest public ownerlib.linear.src.test
Complete caller list for Quat.init
17 direct callers.
fun.sdfii.src.engine.system.physics.body.test_90_degrees_about_Y_axis[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:86in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_PhysicsBody_defaults_match_Python[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:206in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_axis-angle_zero_angle_returns_identity[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:81in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_identity_quaternion_to_axis-angle[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:107in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_normalize_general_quaternion[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:76in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_normalize_identity_quaternion[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:61in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_normalize_non-unit_quaternion[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:71in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.body.test_normalize_zero_quaternion_returns_identity[function] — test; no exact target atfun/sdfii/src/engine/system/physics/body.zig:66in nearest public ownerfun.sdfii.src.engine.system.physics.bodyfun.sdfii.src.engine.system.physics.integrator.jsonQuat[function] — private; no exact target atfun/sdfii/src/engine/system/physics/integrator.zig:78in nearest public ownerfun.sdfii.src.engine.system.physics.integratorfun.sdfii.src.physics.body.quaternionFromAxisAngle[function] — private; no exact target atfun/sdfii/src/physics/body.zig:60in nearest public ownerfun.sdfii.src.physics.bodyfun.sdfii.src.physics.body.quaternionNormalize[function] — private; no exact target atfun/sdfii/src/physics/body.zig:54in nearest public ownerfun.sdfii.src.physics.bodyfun.sdfii.src.physics.body.test_zero_quaternion_normalizes_to_identity[function] — test; no exact target atfun/sdfii/src/physics/body.zig:172in nearest public ownerfun.sdfii.src.physics.bodyfun.sdfii.src.physics.quat.slerp[function] — private; no exact target atfun/sdfii/src/physics/quat.zig:7in nearest public ownerfun.sdfii.src.physics.quatlib.linear.src.quaternion.test_identity_leaves_vectors_unchanged[function] — test source atlib/linear/src/quaternion.zig:154in nearest public ownerlib.linear.src.quaternionlib.linear.src.quaternion.test_normalized_sums_the_norm_from_w_and_returns_null_for_zero[function] — test source atlib/linear/src/quaternion.zig:181in nearest public ownerlib.linear.src.quaternionlib.linear.src.test.arithmeticDigest[function] — private source atlib/linear/src/test.zig:38in nearest public ownerlib.linear.src.testlib.linear.src.test.test_dot_rounds_(1_+_2^-12)^2_to_1_+_2^-11_before_the_sum_where_a_fused_multiply-add_keeps_2^-24[function] — test source atlib/linear/src/test.zig:24in nearest public ownerlib.linear.src.test
Audit
| Definitions | 19 |
|---|---|
| Public names | 19 |
| Members | 4 |
| Version | 26.7.0 |
| Revision | daab053ee433 |