在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → 3d抽奖墙 示例源码(three.js)

3d抽奖墙 示例源码(three.js)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.79M
  • 下载次数:86
  • 浏览次数:1806
  • 发布时间:2018-12-13
  • 实例类别:C#语言基础
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 抽奖 js 源码

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <title>2018新地环境抽奖现场</title>
    <style>
        html,
        body {
            height: 100%;
        }
        
        body {
            background-color: rgba(0, 0, 0, 0);
            margin: 0;
            font-family: Helvetica, sans-serif;
            overflow: hidden;
        }
        
        #container {
            height: 100%;
            width: 100%;
            background-image: url(image/stars.jpg);
            background-repeat: no-repeat;
            background-size: 100% 100%;
        }
        
        .fly-element {
            width: 12px;
            height: 7px;
            box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
            text-align: center;
            cursor: default;
            background-repeat: no-repeat;
            background-size: 100% 100%;
            transform: rotate(180deg);
        }
        
        .element,
        .wins {
            width: 120px;
            height: 160px;
            box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
            border: 1px solid rgba(127, 255, 255, 0.25);
            text-align: center;
            cursor: default;
            transform-style: preserve-3d;
        }
        
        .wins {
            opacity: 0;
            z-index: 9;
            position: absolute;
            top: calc(50% - 80px);
            left: calc(50% - 60px);
            transform: scale(1);
        }
        
        .element>.front,
        .wins>.front {
            position: absolute;
            width: 100%;
            height: 100%;
            backface-visibility: hidden;
        }
        
        .element>.back,
        .wins>.back {
            width: 100%;
            height: 100%;
            background-image: url(image/back_logo.png);
            background-size: 100% 100%;
            background-repeat: no-repeat;
            backface-visibility: hidden;
            transform: rotateY(180deg);
        }
        
        .element p,
        .wins p {
            color: #8cb513;
            font-family: '楷体';
            font-size: 35px;
            font-style: italic;
            text-align: center;
            height: 100%;
            width: 100%;
            font-weight: 900;
            writing-mode: vertical-lr;
        }
    </style>
</head>

<body>
    <script src="http://www.jq22.com/jquery/jquery-2.1.1.js"></script>
    <script src="https://threejs.org/build/three.js"></script>
    <script src="js/tween.min.js"></script>
    <script src="js/TrackballControls.js"></script>
    <script src="js/CSS3DRenderer.js"></script>

    <div id="container"></div>
    <script>
        var staffs = [];
        var wins = [];

        var rs, vi, ry;

        var camera, scene, renderer, controls;
        var objects = [];
        var targets = {
            table: [],
            sphere: [],
            helix: [],
            grid: [],
            bang: [],
        };

        (function() {
            //创建相机
            camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
            camera.position.z = 3000;
            //创建场景
            scene = new THREE.Scene();
            //渲染
            renderer = new THREE.CSS3DRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.domElement.style.position = 'absolute';
            document.getElementById('container').appendChild(renderer.domElement);
            // 鼠标控制
            controls = new THREE.TrackballControls(camera, renderer.domElement);
            controls.rotateSpeed = 0.5;
            controls.minDistance = 500;
            controls.maxDistance = 6000;
            controls.addEventListener('change', render);

            startAnimate(targets.bang, true);
            animate();
        })();

        //添加键盘监听
        window.addEventListener('keydown', function(e) {
            switch (e.keyCode) {
                case 76: //l,幸运奖
                    startLottery(true);
                    break;
                case 83: //s,开始
                    startLottery(false);
                    break;
                case 32: //space,停并抽取人员
                    randomStaff();
                    lottery();
                    break;
                default:
                    break;
            }

        });

        window.addEventListener('resize', onWindowResize, false);

        function startAnimate(target, rotateYOnly) {
            init(target);
            if (rotateYOnly) {
                scene.rotation.x = 0;
                scene.rotation.z = 0;
                rotateY();
            } else {
                if (ry) cancelAnimationFrame(ry);
                rotateScene();
            }
        }

        //初始换场景
        function init(target) {
            if (objects.length) {
                transform(objects, target, 2000);
                return;
            }
            getStaff();
            // table
            for (var i = 0, l = staffs.length; i < l; i  ) {
                let element = createStaffDom('element', staffs[i].NAME, staffs[i].NUM);
                var object = new THREE.CSS3DObject(element);
                object.position.x = Math.random() * 4000 - 2000;
                object.position.y = Math.random() * 4000 - 2000;
                object.position.z = Math.random() * 4000 - 2000;
                scene.add(object);

                objects.push(object);

                // 表格需要坐标进行排序的
                var to = new THREE.Object3D();
                to.position.x = (staffs[i].p_x * 140) - 1330;
                to.position.y = -(staffs[i].p_y * 180)   990;
                targets.table.push(to);

                //big bang
                var bo = new THREE.Object3D();
                bo.position.x = object.position.x   (Math.random() * 2 - 1) * 2000;
                bo.position.y = object.position.y   (Math.random() * 2 - 1) * 1000;
                bo.position.z = object.position.z   (Math.random() * 2 - 1) * 2000;
                bo.rotation.x = (Math.random() * 2 - 1) * Math.PI;
                bo.rotation.y = (Math.random() * 2 - 1) * Math.PI;
                bo.rotation.z = (Math.random() * 2 - 1) * Math.PI;
                targets.bang.push(bo);
            }

            // sphere
            var vector = new THREE.Vector3();
            var spherical = new THREE.Spherical();
            for (var i = 0, l = objects.length; i < l; i  ) {
                var phi = Math.acos(-1   (2 * i) / l);
                var theta = Math.sqrt(l * Math.PI) * phi;
                var object = new THREE.Object3D();
                spherical.set(800, phi, theta);
                object.position.setFromSpherical(spherical);
                vector.copy(object.position).multiplyScalar(2);
                object.lookAt(vector);
                targets.sphere.push(object);
            }

            // helix
            var vector = new THREE.Vector3();
            var cylindrical = new THREE.Cylindrical();
            for (var i = 0, l = objects.length; i < l; i  ) {
                var theta = i * 0.225   Math.PI;
                var y = -(i * 8)   450;
                var object = new THREE.Object3D();
                // 参数一 圈的大小 参数二 左右间距 参数三 上下间距
                cylindrical.set(800, theta, y);
                object.position.setFromCylindrical(cylindrical);
                vector.x = object.position.x * 2;
                vector.y = object.position.y;
                vector.z = object.position.z * 2;
                object.lookAt(vector);
                targets.helix.push(object);
            }

            // grid
            for (var i = 0; i < objects.length; i  ) {
                var object = new THREE.Object3D();
                object.position.x = ((i % 5) * 400) - 800; // 400 图片的左右间距  800 x轴中心店
                object.position.y = (-(Math.floor(i / 5) % 5) * 300)   500; // 500 y轴中心店
                object.position.z = (Math.floor(i / 25)) * 200 - 800; // 300调整 片间距 800z轴中心店
                targets.grid.push(object);
            }

            transform(objects, target || targets.helix, 2000);
        }

        function startLottery(lucky) {
            if (lucky)
                startAnimate(targets.helix, lucky);
            else
                startAnimate(targets.sphere, lucky);
            $({
                s: 1
            }).animate({
                s: 0
            }, {
                duration: 600,
                step: function(n) {
                    $('.wins').css({
                        opacity: n,
                        transform: `scale(${n*2}) rotateY(${n*360*2}deg)`
                    });
                },
                complete: function() {
                    $('.wins').remove();
                }
            });
        }

        function lottery() {
            let w = window.innerWidth / 2 - 120 * 1.5;
            vibrate();
            bigBang();
            let t = setTimeout(function() {
                var element = createStaffDom('wins', wins[0].NAME, wins[0].NUM, 0.7);
                document.getElementById('container').appendChild(element);
                $({
                    s: 0
                }).animate({
                    s: 1
                }, {
                    duration: 1500,
                    easing: 'swing',
                    step: function(n) {
                        $(element).css({
                            opacity: `${n}`,
                            transform: `scale(${n*2}) rotateY(${n*360*2}deg)`
                        })
                    }
                });
                wins = [];
                clearTimeout(t);
            }, 2000)
        }

        function getStaff() {
            let w = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '魏', '何', '吕', '施', '张', '蒋', '沈', '韩', '杨', '宇文', '欧阳', '司马', '黄埔', '诸葛', '上官'];
            let d = ['大锤', '钢蛋', '铁柱', '狗蛋', '臭'];
            for (var i = 0, l = w.length; i < l; i  ) {
                for (let j = 0, m = d.length; j < m;   j) {
                    let num = i * j   j;
                    staffs.push({
                        NAME: w[i]   d[j],
                        NUM: num
                    });
                    staffs[num].p_x = (num) % 15   1;
                    staffs[num].p_y = Math.floor((num) / 15)   1;
                }
            }
        }

        function randomStaff() {
            let r = randomNum(0, staffs.length - 1);
            wins.push(staffs[r]);
            staffs.splice(r, 1);
        }

        function randomNum(a, b) {
            switch (arguments.length) {
                case 1:
                    return parseInt(Math.random() * a   1);
                case 2:
                    return parseInt(Math.random() * (b - a   1)   a);
                default:
                    return 0;
            }
        }

        function createStaffDom(className, staffName, id, opacity) {
            opacity = opacity || Math.random() * 0.5   0.25;
            var element = document.createElement('div');
            element.className = className;
            element.style.backgroundColor = 'rgba(0,127,127,'   opacity   ')';

            var front = document.createElement('div');
            front.className = 'front';
            element.appendChild(front);

            var back = document.createElement('div');
            back.className = 'back';
            element.appendChild(back);

            var p = document.createElement('p');
            p.innerText = staffName;
            front.appendChild(p);

            return element;
        }

        //图形变换
        function transform(origin, targets, duration) {
            TWEEN.removeAll();
            for (var i = 0; i < origin.length; i  ) {
                var object = origin[i];
                var target = targets[i];
                new TWEEN.Tween(object.position)
                    .to({
                        x: target.position.x,
                        y: target.position.y,
                        z: target.position.z
                    }, Math.random() * duration   duration)
                    .easing(TWEEN.Easing.Exponential.InOut)
                    .start();
                new TWEEN.Tween(object.rotation)
                    .to({
                        x: target.rotation.x,
                        y: target.rotation.y,
                        z: target.rotation.z
                    }, Math.random() * duration   duration)
                    .easing(TWEEN.Easing.Exponential.InOut)
                    .start();
                new TWEEN.Tween(object.scale).to({
                        x: target.scale.x,
                        y: target.scale.y,
                        z: target.scale.z
                    }, Math.random() * duration   duration)
                    .easing(TWEEN.Easing.Exponential.InOut)
                    .start();
            }
            new TWEEN.Tween(this)
                .to({}, duration * 2)
                .onUpdate(render)
                .start();
        }

        //监听窗体大小变化
        function onWindowResize() {
            if (!camera) return;
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
            render();
        }

        //维持球形
        function animate() {
            requestAnimationFrame(animate);
            TWEEN.update();
            controls.update();
            // 渲染循环
            render();
        }

        //rotate the scene
        function rotateScene() {
            // 让场景通过x轴或者y轴旋转  & z
            scene.rotation.x  = 0.05;
            scene.rotation.y  = 0.2;
            scene.rotation.z  = 0.01;
            rs = requestAnimationFrame(rotateScene);
            controls.update();
            // 渲染循环
            render();
        }

        //rotate the scene
        function rotateY() {
            // 让场景通过x轴或者y轴旋转  & z
            scene.rotation.y -= 0.001;
            ry = requestAnimationFrame(rotateY);
            controls.update();
            // 渲染循环
            render();
        }

        //抖动效果
        function vibrate() {
            scene.traverse(function(e) {
                e.rotation.x  = ((Math.random() * 0.1   0.1) * (Math.random() >= 0.5 ? 1 : -1));
                e.rotation.y  = ((Math.random() * 0.1   0.1) * (Math.random() >= 0.5 ? 1 : -1));
                e.rotation.z  = ((Math.random() * 0.1   0.1) * (Math.random() >= 0.5 ? 1 : -1));
            });
            vi = requestAnimationFrame(vibrate);
        }

        //球形爆炸
        function bigBang() {
            let t1 = setTimeout(function() {
                cancelAnimationFrame(vi);
                cancelAnimationFrame(rs);
                transform(objects, targets.bang, 500);
                let t2 = setTimeout(function() {
                    rotateY();
                    clearTimeout(t2);
                }, 1000)
                clearTimeout(t1);
            }, 1500)

        }

        function render() {
            renderer.render(scene, camera);
        }
    </script>

</body>

</html>

标签: 抽奖 js 源码

实例下载地址

3d抽奖墙 示例源码(three.js)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 17361061434 发表于: 2019-04-23 22:18 22
下载不了呀

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警