html实现3d视觉特效

<html>
<head>
<title>HTML5实现3D球效果</title>
<style type="text/css">
#box{
border:2px solid #f60; margin:0 auto;
}
</style>
<script>
            var spaceX = 30; //X方向的密度
            var spaceY = 30; //Y方向的密度
            var PI = Math.PI; //数学角度π
            var radius = 200; //球的半径
            var radian = PI / 180; //弧度
            var speedX = 0; //X方向的速度
            var speedY = 0; //Y方向的速度
            var offsetX = 300; //X方向的偏移量相当于将球的中心X坐标移之到画布中央
            var offsetY = 300; //Y方向的偏移量相当于将球的中心Y坐标移之到画布中央
            var spheres = new Array(); //存储像素点
            var canvas; //画布
            var context; //上下文
            var focalLength = 300; //控制球距离屏幕的距离
            var start = true; //是否启动
            var sx = 0; //sinx
            var cx = 0; //cosx
            var sy = 0; //siny
            var cy = 0; //cosy
            var sz = 0; //sinz
            var cz = 0; //cosz
            var innerStaColor = "GREEN"; //表示内部颜色
            var outerStaColor = "RED"; //外部颜色
            var objectRadius = 10; //绘制原点半径
            var scaleRatio = 0;

            var cameraView = {
                x: 0,
                y: 0,
                z: 0,
                rotX: 0,
                rotY: 0,
                rotZ: 0
            }; //视角角度
            /**
            author:qingfeilee
            date:2012-03-28
            description:初始化系统画布信息
        **/
            function initCanvas() {
                try{
                    canvas = document.getElementById("sphere");
                    context = canvas.getContext("2d");
                }catch(e){
                     document.getElementById("tip_info").innerHTML = "您的浏览器不支持!";
                }
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:初始化小球实体
        **/
            function initSphere() {
                for (var i = spaceY; i < 180; i += spaceY) {
                    for (var angle = 0; angle < 360; angle += spaceX) {
                        var object = {};
                        var x = Math.sin(radian * i) * radius;

                        object.x = Math.cos(angle * radian) * x;
                        object.y = Math.cos(radian * i) * radius;
                        object.z = Math.sin(angle * radian) * x;
                        object.glow = .5; //亮度的范围
                        spheres.push(object);
                    }
                }
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:初始化系统函数
        **/
            function init() {
                initCanvas();
                initSphere();
                setInterval(this.update, 1000 / 60, this);
                setTimeout(function() {
                    start = false;
                },
                1000);
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:设置整个大球的运转速度
        **/
            function setSpeed(speedX, speedY) {
                this.speedX = speedX;
                this.speedY = speedY;
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:更新整个球的状态以实现动态效果
        **/
            function update() {
                if (start) {
                    setParam();
                }
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:设置各个小球的属性
        **/
            function setParam() {
                //根据速度大小计算出一次旋转的角度大小
                var rotYstep = speedX / 10000;
                var rotXstep = speedY / 10000;
                cameraView.rotY = rotYstep;
                cameraView.rotX = -rotXstep;
                //计算出对应的cos和sin
                sx = Math.sin(cameraView.rotX);
                cx = Math.cos(cameraView.rotX);
                sy = Math.sin(cameraView.rotY);
                cy = Math.cos(cameraView.rotY);
                sz = Math.sin(cameraView.rotZ);
                cz = Math.cos(cameraView.rotZ);

                // 设置画布的效果
                context.fillStyle = ‘rgba(0,0,0,0.1)‘;
                context.fillRect(0, 0, canvas.width, canvas.height);

                var l = spheres.length - 1;

                for (var i = l,
                obj; obj = spheres[i]; i--) {
                    render(obj);
                }
            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:渲染整个画布
        **/
            function render(object) {
                var xy, xz, yx, yz, zx, zy;

                // 计算出物体的相对于照相机的位置
                var x = object.x - cameraView.x;
                var y = object.y - cameraView.y;
                var z = object.z - cameraView.z;

                // 绕X轴旋转
                xy = cx * y - sx * z;
                xz = sx * y + cx * z;
                // 绕Y轴旋转
                yz = cy * xz - sy * x;
                yx = sy * xz + cy * x;
                // 绕Z轴旋转
                zx = cz * yx - sz * xy;
                zy = sz * yx + cz * xy;
                //给各个球重新定位
                object.x = zx;
                object.y = zy;
                object.z = yz;

                //根据z轴数据来缩放球
                scaleRatio = focalLength / (focalLength + yz);
                scale = scaleRatio;

                if (object.glow > .5) {
                    object.glow -= .02;
                }

                var sphereStyle = context.createRadialGradient(offsetX + object.x * scaleRatio, offsetY + object.y * scaleRatio,
                scaleRatio * .5, offsetX + object.x * scaleRatio, offsetY + object.y * scaleRatio, scaleRatio * objectRadius * .5);
                sphereStyle.addColorStop(0, innerStaColor);
                sphereStyle.addColorStop(object.glow, outerStaColor);
                sphereStyle.addColorStop(1, ‘rgba(0,0,0,0)‘);

                context.fillStyle = sphereStyle;
                context.fillRect(offsetX + object.x * scaleRatio - scaleRatio * objectRadius * .5,
                offsetY + object.y * scaleRatio - scaleRatio * objectRadius * .5, scaleRatio * objectRadius, scaleRatio * objectRadius);
                 document.getElementById("tip_info").innerHTML = "当前速度:"+speedX+"  "+ speedY+"   小球半径:"+objectRadius;  

            }
            /**
            author:qingfeilee
            date:2012-03-28
            description:冻结/激活真个大球状态
        **/
            function startOrPause() {
                if (start) {
                    setTimeout(function() {
                        start = false;
                    },
                    2000);
                    document.getElementById("swi").innerHTML = "激活";
                    innerStaColor = "GREEN";
                    outerStaColor = "RED";
                } else {
                    start = true;
                    document.getElementById("swi").innerHTML = "2秒后冻结";
                    innerStaColor = "RED";
                    outerStaColor = "GREEN";
                }
            }
            function changeObjectRadius(val) {
                this.objectRadius = val;
            }
            window.addEventListener("load", init, true);
        </script>
    </head>
    <body>
        <div id="box" style="width:600px; height:600px">
            <canvas id="sphere" width="600" height="600" style="background:#0066FF">
            </canvas>
            <div align="center">
                <button id="swi" onclick="startOrPause()">激活</button>
                <button onclick="setSpeed(-150,0)">向东</button>
                <button onclick="setSpeed(150,0)">向西</button>
                <button onclick="setSpeed(0,-150)">向南</button>
                <button onclick="setSpeed(0,150)">向北</button>
                小球大小:    <input type="range" min="10" max="30" value="10" step="2" onchange="changeObjectRadius(this.value)"/>
            </div>
            <div align="center">
                <a id="tip_info">
                </a>
            </div>

        </div>
    </body>
</html>
时间: 2024-10-03 14:24:38

html实现3d视觉特效的相关文章

【SIGGRAPH】用【有说服力的照片真实】技术实现最终幻想15的视觉特效

原文:西川善司 http://www.4gamer.net/games/075/G007535/20160726064/ 最终幻想15的演讲会场.相当大,听众非常多. 在本次计算机图形和交互技术大会[SIGGRAPH 2016]上,和游戏相关的CG技术解说方面上,SQUARE ENIX有很强的存在感.这个计划于2016年9月发售的[最终幻想15]的制作相关的会议,很多人都预订参加了.对于外海也有很高关注度的FFXV,有可以了解开发内幕的机会,多数的游戏开发者当然不会错过的. 这次报道的是,最终幻

2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效

 1 类图组织 2 实例 CCSprite * spr = CCSprite::create("HelloWorld.png"); spr->setPosition(ccp(winSize.width/2,winSize.height/2)); addChild(spr); //GridAction //CCFlipX3D * action = CCFlipX3D::create(2); //CCFlipY3D * action = CCFlipY3D::create(2);

3.CCFadeOutTRTiles,部落格效果,跳动的方块特效,3D瓷砖晃动特效,破碎的3D瓷砖特效,瓷砖洗牌特效,分多行消失特效,分多列消失特效

 1 TiledGrid3D //TiledGrid3D //CCFadeOutTRTiles * action = CCFadeOutTRTiles::create(2, CCSize(20,20)); //CCFadeOutBLTiles * action = CCFadeOutBLTiles::create(2, CCSize(20,20)); //CCJumpTiles3D * action = CCJumpTiles3D::create(2, CCSize(4,4),20,20);

jQuery炫酷3d旋转木马特效插件

这是一款使用TweenMax.js制作的jQuery超酷3D旋转木马特效.该旋转木马特效可以感应鼠标的位置而使旋转木马做出相应的变化,效果非常炫酷. 在线演示:http://www.htmleaf.com/Demo/201502231410.html 下载地址:http://www.htmleaf.com/jQuery/Slideshow-Scroller/201502231409.html

基于css3的文字3D翻转特效

一款基于css3的文字3D翻转特效.这款特效当鼠标经过文字的时候3D翻转显示阴影.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="component"> <ul class="grid"> <li> <div class="codrops-header"> <h1> Animated Opening Type</h1> </d

纯CSS3实现牛奶般剔透的3D按钮特效

今天我们要来看一款非常特别的纯CSS3 3D按钮,它的外观酷似纯白剔透的牛奶,点击按钮的时候还会出现一种很柔和的弹力效果.按钮按下时,按钮会轻轻的弹动一下,非常逼真.本文我们在观赏演示的同时,也将源代码分享出来一起学习. 你也可以在这里查看在线演示 接下来我们来分析一下实现这款CSS3 3D按钮的步骤及其代码,总体而言,这款CSS3 3D按钮主要由HTML代码和CSS代码组成.实现原理是用两个span来替代checkbox选中和不选中两个状态的样式. HTML代码: <div> <div

一个3D粒子特效编辑器(Particle Universe For Torchlight)

地址:https://code.csdn.net/langresser/particleuniversefortorchlight      在Bin文件夹有编译好的版本,装个vc2013的运行时库就可以直接运行了. 因为cocos2d-x没有3D粒子特效,所以主程就把OGRE和ParticleUniverse给加到项目中.我第一眼看的时候以为很牛,但是现在回过头来看,能加快开发进度和简化开发难度的才是真的牛.而PU的加入不是牛而是坑,因为特效看了一个多月,说不会用...... 于是我决定来填这

Cocos2d-x-v3中3D网格特效动画的应用

Cocos2d-x-v3中3D网格特效动画的应用 一.网格特效的使用原理 基础的动作是对节点整体进行移动,变形等操作,网格特效的原理是将节点分割成多个尺寸相同的网格,根据改变每个网格块的属性使整体节点产生3D的效果. 二.网格特效的基本用法 在cocos2d-x中,v3的版本新引入了一个类NodeGrid,专门用来包装网格的特效,示例如下:     //获取屏幕尺寸     Size visibleSize = Director::getInstance()->getVisibleSize();

html5和css3实现的3D滚动特效

今天给大家带来一款html5和css3实现的3D滚动特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="container"> <div class="cube"> <div class="side side1"> </div> <div class="side side2"> </div> <div c