3d效果之由近及远

了解代码需要一定的3d基础,读者可先阅读之前的基础文章。效果并不完善,但主要内容已具备。

效果图:这里写图片描述

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/three.js/r83/three.js"></script>
    <script src="js/tween.min.js"></script>
    <script src="js/css3drenderer.js"></script>
</head>
<body>
    <div id="container"></div>
    <script>
        var camera,scene,render;
        var oss = [];
        var targets = {grid: [] };
        var table = [
            '1.jpg',
            '2.jpg',
            '3.jpg',
            '4.jpg',
            '5.jpg',
            '6.jpg',
            '7.jpg',
            '8.jpg',
            '9.jpg',
            '10.jpg',
            '11.jpg',
            '12.jpg',
        ]
        function init() {
            camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 100000);
            camera.position.z = 2800;
            scene = new THREE.Scene();
            for( var i = 0,len = table.length;i<len;i++){
                var element = document.createElement('div');
                element.className = 'element';
                var img = document.createElement('img');
                img.src = './images/'+table[i];
                if( i==12 || i==37 || i==62 || i==87 || i==112){
                    img.style.width = img.style.height = '300px';
                }
                element.appendChild( img );

                var ott = new THREE.CSS3DObject( element );
                ott.position.x = ((i % 5) * 600) - 1200;
                ott.position.y = (-(Math.floor(i / 5) % 5) * 400) + 800;
                ott.position.z = 200-i*60*1.5;

                scene.add(ott);
                oss.push(ott);
            }
            var vector = new THREE.Vector3();

            for(var i=0,l = oss.length;i<l;i++){
                var ott = new THREE.Object3D();
                ott.position.x = ((i % 5) * 600) - 1200;
                ott.position.y = (-(Math.floor(i / 5) % 5) * 400) + 800;
                ott.position.z = 200-i*60*1.5;

                vector.x = ott.position.x;
                vector.y = ott.position.y;
                vector.z = ott.position.z;

                ott.lookAt(vector);

                targets.grid.push(ott)
            }
            renderer = new THREE.CSS3DRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight);
            renderer.domElement.style.position = 'absolute';
            renderer.domElement.className = 'abc';
            document.getElementById('container').appendChild(renderer.domElement);
            window.addEventListener('resize', onWindowResize, false)
        }
        function transform(shape,duration,style,time) {
            TWEEN.removeAll();
            scene_init();
            for(var i=0;i<oss.length;i++){
                var ott = oss[i];
                var target = shape[i];

                new TWEEN.Tween(ott.position)
                    .to({x:target.position.x, y:target.position.y, z:target.position.z},duration)
                    .easing(TWEEN.Easing.Exponential.InOut)
                    .start();
                new TWEEN.Tween(ott.position)
                    .to({x:target.position.x, y:target.position.y, z:target.position.z},1000)
                    .delay(195000)
                    .start();
            }
            new TWEEN.Tween(this)
                .to({},1000000)
                .onUpdate(function () {
                    render(style)
                })
                .start();
        }
        function onWindowResize() {
            camera.aspect  = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth,window.innerHeight);
            render();
        }
        function animate() {
            window.requestAnimationFrame(animate)
            TWEEN.update();
        }
        function scene_init() {
            scene.position.x = 0;
            scene.position.y = 0;
            scene.position.z = 0;
        }
        function update() {
            for(var i =0;i<oss.length;i++){
                var ott= oss[i];
                ott.position.z +=60;
                if(ott.position.z > 800){
                    ott.position.z = 200-(oss.length-1)*60*1.5;
                }
            }
        }
        function render(style) {
            if(style == 'grid'){
                update();
            }
            renderer.render(scene,camera)
        }
        init(); 
        animate(); 
        transform(targets.grid,1000, 'grid', 100);
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值