Three.JS提升学习6:创建动画和移动摄像机

*本文学习资源来自《Three.js开发指南 WebGL的JavaScript 3D库》

基础动画

基础渲染函数

render();
function render(){
   renderer.render(scene, camera);
   requestAnimationFrame(render);
}

简单动画

我们可以通过改变物体的旋转、缩放、位置、材质、顶点、面以及其它很多方式来实现动画。

通过改变摄像机来实现动画

        renderScene();

        function renderScene() {
            group.rotation.x += 0.02;
            requestAnimationFrame(renderScene);
            renderer.render(scene, camera);
        }

改变物体位置等属性实现动画

        render();

        function render() {
            stats.update();
            // rotate the cube around its axes
            cube.rotation.x += controls.rotationSpeed;
            cube.rotation.y += controls.rotationSpeed;
            cube.rotation.z += controls.rotationSpeed;

            // bounce the sphere up and down
            step += controls.bouncingSpeed;
            sphere.position.x = 20 + ( 10 * (Math.cos(step)));
            sphere.position.y = 2 + ( 10 * Math.abs(Math.sin(step)));

            // render using requestAnimationFrame
            requestAnimationFrame(render);
            renderer.render(scene, camera);
        }

选择对象

        document.addEventListener('mousedown', onDocumentMouseDown, false);
        document.addEventListener('mousemove', onDocumentMouseMove, false);

        var projector = new THREE.Projector();
        var tube;

        function onDocumentMouseDown(event) {
            // 屏幕坐标转为三维场景中的坐标
            var vector = new THREE.Vector3(( event.clientX / window.innerWidth ) * 2 - 1, -( event.clientY / window.innerHeight ) * 2 + 1, 0.5);
            vector = vector.unproject(camera);
            //创建raycaster向场景中发射光线
            var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
            //哪些被光线照到
            var intersects = raycaster.intersectObjects([sphere, cylinder, cube]);

            if (intersects.length > 0) {
                //照到的修改属性
                console.log(intersects[0]);

                intersects[0].object.material.transparent = true;
                intersects[0].object.material.opacity = 0.1;
            }
        }

Tween.js

实现动画

       // create a tween
        // http://sole.github.io/tween.js/examples/03_graphs.html
        var posSrc = {pos: 1};
        var tween = new TWEEN.Tween(posSrc).to({pos: 0}, 5000);
        tween.easing(TWEEN.Easing.Sinusoidal.InOut);

        var tweenBack = new TWEEN.Tween(posSrc).to({pos: 1}, 5000);
        tweenBack.easing(TWEEN.Easing.Sinusoidal.InOut);

        tween.chain(tweenBack);
        tweenBack.chain(tween);


        var onUpdate = function () {
            var count = 0;
            var pos = this.pos;

            loadedGeometry.vertices.forEach(function (e) {
                var newY = ((e.y + 3.22544) * pos) - 3.22544;
                pointCloud.geometry.vertices[count++].set(e.x, newY, e.z);
            });

            pointCloud.sortParticles = true;
        };

        tween.onUpdate(onUpdate);
        tweenBack.onUpdate(onUpdate);

加载模型及启动tween

      var loader = new THREE.PLYLoader();

        loader.load("../assets/models/test.ply", function (geometry) {
            loadedGeometry = geometry.clone();

            var material = new THREE.PointCloudMaterial({
                color: 0xffffff,
                size: 0.4,
                opacity: 0.6,
                transparent: true,
                blending: THREE.AdditiveBlending,
                map: generateSprite()
            });

            pointCloud = new THREE.PointCloud(geometry, material);
            pointCloud.sortParticles = true;

            tween.start();
            scene.add(pointCloud);
        });


        render();

运行效果:
这里写图片描述

使用摄像机

Three.js 提供了一些摄像机控件,使用这些控件可以控制场景中的摄像机。这些控件在Three.js发布包中,可以在examples/js/controls目录中找到它们。

名称英文描述
第一视角控件器FirstPersonControls类似第一视角射击游戏中的摄像机,使用键盘移动、鼠标转动
飞行控制器FlyControls飞行模拟控制器,用键盘和鼠标控制摄像机的移动
翻滚控制器RollControls飞行控制器的简化版,允许绕着z轴旋转
轨迹球控制器TrackBallControls最常用的控制器,可以使用鼠标(或控制球)来轻松移动、平移或缩放场景
轨道控制器OrbitControls该控件可以在特定的场景中模拟轨道中的卫星,可以使用鼠标和键盘在场景中游走

其它控件:
设备朝向控制器:DeviceOrientationControls
编辑控制器:EditorControls
眼睛控制器:OculusControls
正交轨迹球控制器:OrthographicTrackball Controls
鼠标锁定控制器:PointerLockControls
变换控制器:TransformCOntrols
VR控制器:VRControls

除了控制器,还可以通过修改position属性来移动摄像机,通过lookAt()方法来改变摄像机的朝向。

轨迹球控制器使用示例

    <script type="text/javascript" src="../libs/TrackballControls.js"></script>
    <script>
        var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
        /// 把控制器绑定到摄像机上
        var trackballControls = new THREE.TrackballControls(camera);

        trackballControls.rotateSpeed = 1.0;   //摄像机的旋转速度
        trackballControls.zoomSpeed = 1.0;
        trackballControls.noZoom = false;      //允许缩放
        trackballControls.panSpeed = 1.0;
        trackballControls.staticMoving = true;
   </script>

在render里更新摄像机的位置

        function render() {
            //用来精确计算出此次调用距离上次调用的时间间隔
            var delta = clock.getDelta();
            //更新摄像机的位置
            trackballControls.update(delta);
            requestAnimationFrame(render);
            webGLRenderer.render(scene, camera)
        }

变形动画与骨骼动画

略……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值