/** * graphene_quaternion_init_from_angles: * @q: a #graphene_quaternion_t * @deg_x: rotation angle on the X axis (yaw), in degrees * @deg_y: rotation angle on the Y axis (pitch), in degrees * @deg_z: rotation angle on the Z axis (roll), in degrees * * Initializes a #graphene_quaternion_t using the values of * the [Euler angles](http://en.wikipedia.org/wiki/Euler_angles) * on each axis. * * Returns: (transfer none): the initialized quaternion * * Since: 1.0 */ graphene_quaternion_t * graphene_quaternion_init_from_angles (graphene_quaternion_t *q, float deg_x, float deg_y, float deg_z) { float rad_x, rad_y, rad_z; float sin_x, sin_y, sin_z; float cos_x, cos_y, cos_z; rad_x = GRAPHENE_DEG_TO_RAD (deg_x); rad_y = GRAPHENE_DEG_TO_RAD (deg_y); rad_z = GRAPHENE_DEG_TO_RAD (deg_z); sin_x = sinf (rad_x * .5f); sin_y = sinf (rad_y * .5f); sin_z = sinf (rad_z * .5f); cos_x = cosf (rad_x * .5f); cos_y = cosf (rad_y * .5f); cos_z = cosf (rad_z * .5f); q->x = sin_x * cos_y * cos_z + cos_x * sin_y * sin_z; q->y = cos_x * sin_y * cos_z - sin_x * cos_y * sin_z; q->z = cos_x * cos_y * sin_z + sin_x * sin_y * cos_z; q->w = cos_x * cos_y * cos_z - sin_x * sin_y * sin_z; return q; }
/** * graphene_euler_init: * @e: the #graphene_euler_t to initialize * @x: rotation angle on the X axis, in degrees * @y: rotation angle on the Y axis, in degrees * @z: rotation angle on the Z axis, in degrees * * Initializes a #graphene_euler_t using the given angles. * * The order of the rotations is %GRAPHENE_EULER_ORDER_DEFAULT. * * Returns: (transfer none): the initialized #graphene_euler_t * * Since: 1.2 */ graphene_euler_t * graphene_euler_init (graphene_euler_t *e, float x, float y, float z) { return graphene_euler_init_internal (e, GRAPHENE_DEG_TO_RAD (x), GRAPHENE_DEG_TO_RAD (y), GRAPHENE_DEG_TO_RAD (z), GRAPHENE_EULER_ORDER_DEFAULT); }
/** * graphene_euler_init_with_order: * @e: the #graphene_euler_t to initialize * @x: rotation angle on the X axis, in degrees * @y: rotation angle on the Y axis, in degrees * @z: rotation angle on the Z axis, in degrees * @order: the order used to apply the rotations * * Initializes a #graphene_euler_t with the given angles and @order. * * Returns: (transfer none): the initialized #graphene_euler_t * * Since: 1.2 */ graphene_euler_t * graphene_euler_init_with_order (graphene_euler_t *e, float x, float y, float z, graphene_euler_order_t order) { return graphene_euler_init_internal (e, GRAPHENE_DEG_TO_RAD (x), GRAPHENE_DEG_TO_RAD (y), GRAPHENE_DEG_TO_RAD (z), order); }
/** * graphene_quaternion_init_from_angle_vec3: * @q: a #graphene_quaternion_t * @angle: the rotation on a given axis, in degrees * @axis: the axis of rotation, expressed as a vector * * Initializes a #graphene_quaternion_t using an @angle on a * specific @axis. * * Returns: (transfer none): the initialized quaternion * * Since: 1.0 */ graphene_quaternion_t * graphene_quaternion_init_from_angle_vec3 (graphene_quaternion_t *q, float angle, const graphene_vec3_t *axis) { float rad, sin_a, cos_a; graphene_simd4f_t axis_n; rad = GRAPHENE_DEG_TO_RAD (angle); sin_a = sinf (rad / 2.f); cos_a = cosf (rad / 2.f); axis_n = graphene_simd4f_mul (graphene_simd4f_normalize3 (axis->value), graphene_simd4f_splat (sin_a)); q->x = graphene_simd4f_get_x (axis_n); q->y = graphene_simd4f_get_y (axis_n); q->z = graphene_simd4f_get_z (axis_n); q->w = cos_a; return q; }