05-10 00:00
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[WebGL] Tween Animation 본문

Programming/WebGL(ThreeJS)

[WebGL] Tween Animation

cinema4dr12 2015. 8. 7. 18:46

이번 예제에서는 Tween JS를 이용한 오브젝트의 두  상태(state) 간 보간 애니메이션에 관한 것입니다.

Download Project

08-01-tween.zip


Click here to view with full screen mode


Operations

Mouse Left Button Click & Drag: Camera Rotating

Mouse Wheel: Camera Zoom In & Out

Mouse Right Button Click & Drag: Camera Panning

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// MAIN
 
// standard global variables
var container, scene, camera, renderer, controls, stats;
var keyboard = new THREEx.KeyboardState();
var clock = new THREE.Clock();
 
// custom global variables
var mesh;
 
init();
animate();
 
// FUNCTIONS         
function init() 
{
    // SCENE
    scene = new THREE.Scene();
 
    // CAMERA
    var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
    var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
    camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
    scene.add(camera);
    camera.position.set(0,150,400);
    camera.lookAt(scene.position);
 
    // RENDERER
    if ( Detector.webgl )
        renderer = new THREE.WebGLRenderer( {antialias:true} );
    else
        renderer = new THREE.CanvasRenderer(); 
    renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    container = document.getElementById'ThreeJS' );
    container.appendChild( renderer.domElement );
 
    // EVENTS
    THREEx.WindowResize(renderer, camera);
    THREEx.FullScreen.bindKey({ charCode : 'f'.charCodeAt(0) });
 
    // CONTROLS
    controls = new THREE.OrbitControls( camera, renderer.domElement );
 
    // STATS
    stats = new Stats();
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.bottom = '0px';
    stats.domElement.style.zIndex = 100;
    //container.appendChild( stats.domElement );
 
    // LIGHT
    var light = new THREE.PointLight(0xffffff);
    light.position.set(100,250,100);
    scene.add(light);
 
    // SKYBOX
    var skyBoxGeometry = new THREE.CubeGeometry( 100001000010000 );
    var skyBoxMaterial = new THREE.MeshBasicMaterial( { color: 0x9999ff, side: THREE.BackSide } );
    var skyBox = new THREE.Mesh( skyBoxGeometry, skyBoxMaterial );
    scene.add(skyBox);
    
    ////////////
    // CUSTOM //
    ////////////
    // ADD A CUBE GEOMETRY
    var cubeGeometry = new THREE.CubeGeometry( 303232 ); // width, height, depth, widthSegments, heightSegments, depthSegments
    var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x7dc9b6 } );
    cubeMesh = new THREE.Mesh( cubeGeometry, cubeMaterial );
    cubeMesh.position.set( -80,40,0 );
    cubeMesh.rotation.set( 000 );
    cubeMesh.scale.set( 111 );
    scene.add(cubeMesh);
 
    // target
    var posTarget = new THREE.Vector3( 100400 );
    var rotTarget = new THREE.Vector3( 0, Math.PI, 0 );
    var sclTarget = new THREE.Vector3( 333 );
 
    transform( cubeMesh, posTarget, rotTarget, sclTarget, 4000 );
 
    // Event Listener
    /*
    var button = document.getElementById( 'myButton' );
    button.addEventListener( 'click', function ( event ) {
        transform( cubeMesh, posTarget, rotTarget, sclTarget, 4000 );
    }, false );
    */
}
 
function transform( object, posTarget, rotTarget, sclTarget, duration ) {
    TWEEN.removeAll();
 
    // Position transform
    new TWEEN.Tween( object.position )
        .to( { x: posTarget.x, y: posTarget.y, z: posTarget.z }, duration )
        .easing( TWEEN.Easing.Elastic.InOut )
        .start();
 
    // Rotation transform
    new TWEEN.Tween( object.rotation )
        .to( { x: rotTarget.x, y: rotTarget.y, z: rotTarget.z }, duration )
        .easing( TWEEN.Easing.Exponential.InOut )
        .start();
 
    // Rotation transform
    new TWEEN.Tween( object.scale )
        .to( { x: sclTarget.x, y: sclTarget.y, z: sclTarget.z }, duration )
        .easing( TWEEN.Easing.Exponential.InOut )
        .start();
 
    new TWEEN.Tween( this )
        .to( {}, duration * 2 )
        .onUpdate( render )
        .start();
}
 
function animate() 
{
    requestAnimationFrame( animate );
    TWEEN.update();
    render();        
    update();
}
 
function update()
{
    controls.update();
    stats.update();
}
 
function render() 
{
    renderer.render( scene, camera );
}
cs


'Programming > WebGL(ThreeJS)' 카테고리의 다른 글

[WebGL] Viewport 4분할  (0) 2015.08.07
[WebGL] Model Animation Control  (0) 2015.08.07
[WebGL] Blender Animation Scene 로딩하기  (0) 2015.08.07
[WebGL] Blender Scene 불러오기  (0) 2015.08.07
[WebGL] Geometry Collada Loader  (0) 2015.08.07
Comments