www-content/pages/tutorial/effects/ecore_animator/3d_rotation.txt

76 lines
2.5 KiB
Plaintext

~~Title: 3D Rotation Effect - Ecore Animator~~
//**__previous page__: **//[[/tutorial/effects/ecore_animator/zoom|Creating a zoom effect]]
==== Creating a 3D Rotation Effect ====
The last animation is a 3D rotation. For this one, we are going to rotate the
Evas object on all three axes (X, Y, Z).
{{ :ecore_animator_3D.gif }}
First, create the button and its callback function:
<code c>
// Button 3 : 3D Rotation Effect
bt3 = elm_button_add(win);
elm_object_text_set(bt3, "3D");
evas_object_size_hint_weight_set(bt3, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_move(bt3, 170, 0);
evas_object_resize(bt3, 90, 70);
evas_object_smart_callback_add(bt3, "clicked", _btn_3d_cb, target);
evas_object_show(bt3);
static void _btn_3d_cb(void *data, Evas_Object *btn, void *ev)
{
Evas_Object *target = data;
ecore_animator_timeline_add(1, _do_3d, target);
}
</code>
Next, we create the ''_do_3d()'' animation callback function, which is very
similar to the rotate and zoom callback functions. To create the animation, we
use the ''evas_map_util_3d_rotate()'' function, which allows you to rotate any
Evas object on all three axes.
<code c>
static Eina_Bool
_do_3d(void *data, double pos)
{
Evas_Object *obj = data;
Evas_Map *m;
int x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
m = evas_map_new(4);
evas_map_util_points_populate_from_object(m, obj);
evas_map_util_3d_rotate(m, pos * 360, pos * 360, pos * 360, x + (w / 3), y + 60, 0);
evas_object_map_set(obj, m);
evas_object_map_enable_set(obj, EINA_TRUE);
evas_map_free(m);
return EINA_TRUE;
}
</code>
The ''evas_map_util_3d_rotate()'' function takes the following arguments:
* The map to change
* The angle (0-360°) to rotate around the X axis
* The angle (0-360°) to rotate around the Y axis
* The angle (0-360°) to rotate around the Z axis
* The X coordinate of the rotation center
* The Y coordinate of the rotation center
* The Z coordinate of the rotation center
Here, we rotate 360 degrees around each axis. The horizontal (X) rotation
center is the X position of the target plus its width divided by 2. The
vertical (Y) rotation center is the Y position of the target plus 60. The Z
rotation center is 0.
As with the rotation and zoom animations, we multiply the angles by the
timeline position to gently rotate the target on each call to the ''_do_3d()''
callback function along the timeline.
\\
//**__next page__: **//[[/tutorial/effects/ecore_animator/drop_bounce|Creating drop and bounce effects]]