ThreeJS旋转动画

时间:2012-02-01 11:25:41

标签: javascript three.js

我在ThreeJS中有一个立方体,每次按下按钮时我都想顺时​​针旋转90度。我想我有它的基本要点:创建一个Three.Animation实例,将它绑定到立方体,然后每次按下正确的按钮时都会开始动画。但是,我很难理解ThreeJS的API,因为它似乎没有包含其方法的任何示例。

这是THREE.js的动画构造函数:( root,data,interpolationType,JITCompile)我不明白这些字段是什么。我猜根将是我放置立方体的地方,但剩下的呢?

我也可以随时调用animation.play()来制作动画吗? animationHandler是如何工作的?

1 个答案:

答案 0 :(得分:11)

我认为对于顺时针旋转物体90度,使用TWEEN类会做。我认为动画类对于较重的东西(比如骨骼/皮肤变形等)非常方便。

要使用补间类,有3个基本步骤:

  1. 在您的文件中包含该类(<script src="js/Tween.js"></script>
  2. 为您需要的活动添加补间(new TWEEN.Tween( cube.rotation ).to( { y:Math.random()}, 1000 ).easing( TWEEN.Easing.Quadratic.EaseOut).start();
  3. 更新渲染循环中的补间(TWEEN.update();
  4. 您可以查看cubes tween example作为开始。

    我已经修改了默认的多维数据集示例,以便将补间放在:

    three.js cube tween

    <!doctype html>
    <html lang="en">
        <head>
            <title>three.js canvas - geometry - cube</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
            <style>
                body {
                    font-family: Monospace;
                    background-color: #f0f0f0;
                    margin: 0px;
                    overflow: hidden;
                }
            </style>
        </head>
        <body>
    
            <script src="../build/Three.js"></script>
            <script src="js/Tween.js"></script>
            <script src="js/RequestAnimationFrame.js"></script>
            <script src="js/Stats.js"></script>
    
            <script>
    
                var container, stats;
    
                var camera, scene, renderer;
    
                var cube, plane;
    
                var windowHalfX = window.innerWidth / 2;
                var windowHalfY = window.innerHeight / 2;
    
                var rad90 = Math.PI * .5;
    
                init();
                animate();
    
                function init() {
    
                    container = document.createElement( 'div' );
                    document.body.appendChild( container );
    
                    var info = document.createElement( 'div' );
                    info.style.position = 'absolute';
                    info.style.top = '10px';
                    info.style.width = '100%';
                    info.style.textAlign = 'center';
                    info.innerHTML = 'click to tween';
                    container.appendChild( info );
    
                    camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
                    camera.position.y = 150;
                    camera.position.z = 500;
    
                    scene = new THREE.Scene();
    
                    // Cube
    
                    var materials = [];
    
                    for ( var i = 0; i < 6; i ++ ) {
    
                        materials.push( [ new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } ) ] );
    
                    }
    
                    cube = new THREE.Mesh( new THREE.CubeGeometry( 200, 200, 200, 1, 1, 1, materials ), new THREE.MeshFaceMaterial() );
                    cube.position.y = 150;
                    cube.overdraw = true;
                    scene.add( cube );
    
                    // Plane
    
                    plane = new THREE.Mesh( new THREE.PlaneGeometry( 200, 200 ), new THREE.MeshBasicMaterial( { color: 0xe0e0e0 } ) );
                    plane.rotation.x = - 90 * ( Math.PI / 180 );
                    plane.overdraw = true;
                    scene.add( plane );
    
                    renderer = new THREE.CanvasRenderer();
                    renderer.setSize( window.innerWidth, window.innerHeight );
    
                    container.appendChild( renderer.domElement );
    
                    stats = new Stats();
                    stats.domElement.style.position = 'absolute';
                    stats.domElement.style.top = '0px';
                    container.appendChild( stats.domElement );
    
                    document.addEventListener( 'mousedown', onDocumentMouseDown, false );
                }
    
                //
    
                function onDocumentMouseDown( event ) {
    
                    event.preventDefault();
                    new TWEEN.Tween( cube.rotation ).to( {  y:  cube.rotation.y + rad90}, 1000 ).easing( TWEEN.Easing.Quadratic.EaseOut).start();
                    new TWEEN.Tween( plane.rotation ).to( { z:  plane.rotation.z + rad90}, 1000 ).easing( TWEEN.Easing.Quadratic.EaseOut).start();
    
                    console.log("click");
                }
    
                //
    
                function animate() {
    
                    requestAnimationFrame( animate );
    
                    render();
                    stats.update();
    
                }
    
                function render() {
                    TWEEN.update();
                    renderer.render( scene, camera );
    
                }
    
            </script>
    
        </body>
    </html>