canvas - 炫酷的3D星空

1.国际惯例,先上效果

(⊙o⊙)… 效果图看上去效果并不很炫酷啊,直接戳 这里 看效果吧!

2代码部分

html:

<canvas id="canvas" width="1920" height="1080"></canvas>

css:

*{margin: 0;padding: 0;}
/*没啥必须的css*/

js:(这个博主也是够了,那么多的js代码,一点注释都没有,差评!)公子莫慌,由于代码比较多,注释部分就不在这写啦,直接移步 效果展示 查看效果及代码注释。

var Starry = function (canvasId, starCont) {
    this.renderLoop = null;
    this.framerate = 42;
    this.starfield = null;
    this.rings_y = 0;
    this.altitude = 0;
    this.preset = {
        radius : 600,
        fov : 260,
        cruise : 0.01,
        angle : 0.006,
        vert : -0.001,
        rings : 0.2
    };
    this.state = {
        width : document.documentElement.clientWidth,
        height : document.documentElement.clientHeight,
        altitude : 0,
        settings : this.preset,
        framerate : 50
    };
    var S = this
    if (!canvasId) return false
    S.canvas = document.getElementById(canvasId);
    S.canvas.width = document.documentElement.clientWidth;
    S.canvas.height = document.documentElement.clientHeight;
    S.ctx = S.canvas.getContext(‘2d‘);
    this.starfield = this.generateStarfield();
}
Starry.prototype = {
    reset: function(){
        clearTimeout(this.renderLoop)
        this.state.width = this.canvas.width = document.documentElement.clientWidth;
        this.state.height = this.canvas.height = document.documentElement.clientHeight;
        this.init()
    },
    generateStarfield : function() {
        var radius = this.state.settings.radius;
        var star_count = Math.min( 1000, Math.round( this.canvas.offsetWidth / 2 ) );
        var stars = new Array( star_count );
        for (var i = 0; i < stars.length; i++) {
            stars[i] = {
                x: ( Math.random() * ( radius * 2 ) ) - ( radius ),
                y: ( Math.random() * ( radius * 2 ) ) - ( radius ),
                z: ( Math.random() * ( radius * 2 ) ) - ( radius )
            }
        };
        return stars;
    },
    move : function ( stars ) {
        var angle = this.state.settings.angle;
        var vert = this.state.settings.vert;
        var fov = this.state.settings.fov;
        var cruise = this.state.settings.cruise;
        var radius = this.state.settings.radius;
        var cosRX = Math.cos(angle);
        var sinRX = Math.sin(angle);
        var cosRY = Math.cos(vert);
        var sinRY = Math.sin(vert);
        return stars.map( function(star){
          var tempx = star.x;
          var tempy = star.y;
          var tempz = star.z + fov;

          var x = ( tempx * cosRX ) + ( tempz * sinRX );
          var y = ( tempy * cosRY ) + ( tempz * sinRY );

          // Depth based on X
          // var z = ( tempx * -sinRX ) + ( tempz * cosRX );

          // Depth based on Y
          var z = ( tempy * -sinRY ) + ( tempz * cosRY ) - cruise;

          var limit = radius;

          // x
          if ( x < -limit ) x = limit;
          else if ( x > limit ) x = -limit;

          // y
          if ( y < -limit ) y = limit;
          else if ( y > limit ) y = - limit;

          // z
          if ( z < -limit ) z = limit;
          else if ( z > limit ) z = -limit;

          return { x:x, y:y, z: z - fov };
        });
    },
    run: function () {
        var S = this;
        var width = this.state.width
        var height = this.state.height
        var fov = this.state.settings.fov
        var rings = this.state.settings.rings

        S.ctx.clearRect(0, 0, width, height);
        S.starfield.forEach(function(item, index){

          var scale = ( fov / 2 ) / ( fov + item.z );
          var x2d = ( item.x * scale ) + ( width / 2 );
          var y2d = ( item.y * scale ) + ( height / 2 );
          var opacity = Math.min( Math.max( Math.abs( scale ), 0.1 ), 1 );

          S.ctx.beginPath();
          S.ctx.arc(x2d, y2d, Math.min( Math.abs( scale ), 3 ) , 0, 360);
          S.ctx.fillStyle = ‘rgba(167,180,224,‘+opacity+‘)‘;
          S.ctx.fill();
        })

        var ring_radius = height * 1.6;
        var ring_center = { x: width / 4, y: height * 2 };

        S.ctx.beginPath();
        S.ctx.arc( ring_center.x, ring_center.y + this.rings_y, ring_radius, 0, 360);
        S.ctx.lineWidth = 1;
        S.ctx.strokeStyle = ‘rgba(167,180,224,0.15)‘;
        S.ctx.stroke();
        S.ctx.beginPath();
        S.ctx.arc( ring_center.x + 60, ring_center.y + 60 + ( this.rings_y * 0.8 ), ring_radius, 0, 360);
        S.ctx.lineWidth = 1;
        S.ctx.strokeStyle = ‘rgba(167,180,224,0.05)‘;
        S.ctx.stroke();
        this.rings_y += rings;
        if( this.rings_y > ( width / 2 ) ) {
            this.rings_y = -( width/ 2 )
        };

        S.starfield = S.move( S.starfield )
        var _this = this;
        this.renderLoop = setTimeout(function (){_this.run()}, _this.state.framerate)
    },
    init: function () {
        this.run();
    },
    pause: function () {
        var _this = this;
        clearTimeout(_this.renderLoop)
    }
}

var starbg = new Starry (‘canvas‘, 100);
window.onload = function () {
    starbg.init();
}
window.onresize = function () {
    starbg.reset();
}

(未完)

原文地址:https://www.cnblogs.com/hanguozhi/p/8387118.html

时间: 2024-08-02 07:35:31

canvas - 炫酷的3D星空的相关文章

24、Cocos2dx 3.0游戏开发找小三之网格动作:高炫酷的3D动作

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/37596763 网格动作类似于动作特效,可以实现翻转.震荡.抖动.水的波纹等效果. 网格的基类: GridBase* Grid 获取或设置该节点的网格特效状态.网格应用于绘图平面上,可以实现水纹等 3D 特效: 基类定义:cocos2d/2d/CCGrid.h中: 基于这个基类有两个子类: Grid3D TiledGrid3D 这两个子类的共同点是:网格

初级开发者也能码出专业炫酷的3D地图吗?

好看的3D地图搭建出来,一定是要能为开发者所用与业务系统开发中才能真正地体现价值.基因于此,CityBuilder建立了与ThingJS的通道——直转ThingJS代码,支持将配置完成的3D地图一键转为代码,不仅减少开发者的工作量,还能作为非GISer开发者的地图教学工具,使一般开发者也能码出专业.炫酷的3D地图. 上节说到如何使用GeoJSON.QGIS编辑地图数据,使用CItyBuilder搭建一键城市模型,并且转入到ThingJS开发,以免大家遗忘,我将步骤再次贴出来,然后告诉大家如何使用

HTML5 canvas炫酷棱镜效果的幻灯片特效

这是一款效果非常炫酷华丽的HTML5 canvas带棱镜效果的幻灯片特效.这个特效在每一个幻灯片的前面放置一个图形,并将图形制作为三棱镜效果,它底下的幻灯片图片会被"折射"到棱镜上面,形成一种棱镜折射效果. 所有的现代浏览器都支持这个幻灯片特效,包括IE9. 效果演示:http://www.htmleaf.com/Demo/201504011607.html 下载地址:http://www.htmleaf.com/html5/html5-canvas/201504011606.html

HTML5 Canvas炫酷宇宙黑洞引力特效

black-hole.js是一款效果非常炫酷的模拟宇宙黑洞引力特效的js插件.该插件基于HTML5 canvas,使用WebGL. glfx.js和 numeric.js 共同制作完成.其效果是在鼠标滑过图片时鼠标区域形成黑洞效果,使它周围的空间坍缩. 注意:由于HTML5的安全限制,插件中的图片必须是同源的图片.在本地浏览器这个插件时,Chrome浏览器会看不到效果,你可以使用Firefox浏览器在本地查看这个demo. 效果演示:http://www.htmleaf.com/Demo/201

wooyoo游戏-炫酷大刀3D模型展现(一)

这是在3Dmax中制作好的大刀模型,很炫吧.现在我要做的是把它上传到wooyoo在线游戏开发平台(http://www.wooyoogame.com/)的资源库中.当然,需要做适当的调整. 首先,看一下尺寸和坐标位置 这里模型的尺寸过大了,在wooyoo游戏平台中,由于在浏览器中展示,尺寸不宜过大.一个通用单位1可以表示一米,我们需要在单位设置中选择通用单位. 现在我把大刀模型尺寸调小了,模型坐标也调整为(0,0,0),这样可以确保模型在浏览器场景中的居中位置. 现在,模型就基本调整好了,导出为

【pano2vr】网页Flash中简单实现炫酷的3D模型制作

花了两天时间学习如何能够高效的实现3D模型效果,毕竟是从0开始学习,感觉pano2vr这款软件挺容易上手,并且可以很容易实现简单的热点交互,可以根据交互需求设置皮肤,故将这一款软件推荐给大家: 1.简介.http://ggnome.com/pano2vr.用户可以自行下载. 2.简单教程. 3.皮肤编辑.用户可以根据提供的系统皮肤或者自制皮肤或网上资源实现,皮肤可以说是一个默认的播放器. 4.应用.用户可以将其应用于Flash以及网页中,根据官方提供的信息进行摸索制作. Flash API:ht

python老司机带你玩玩炫酷的3D渲染,酷毙了!

自从学会了turtle模块后,画了不少简笔画.像小猪佩奇.哆啦A梦等等,但是这些依然不能让身边人感受到python的强大,依然是每次装逼必被打脸.就像你用turtle画了这个 别人拿出了这个 怎么办?面对函数库如此丰富的python,一库不行,我们还有另一库.那就是pyray库. pyray库介绍 pyray库创建于2018年1月,虽然目前渲染3D场景的最佳工具仍然是POV ray.但是为什么我们不能在Python中使用这种功能(渲染2D.3D和更高维的对象和场景),这是一种可能已经被广泛使用的

8个经典炫酷的HTML5 Canvas动画欣赏

HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮助. 1.HTML5 Canvas可拖动的弹性大树摇摆动画 今天让我们继续来分享一个炫酷的HTML5动画,它是一款基于HTML5 Canvas的大树摇摆动画,这款HTML5动画的特点是我们可以拖拽树枝,从而让整棵树摇摆起来,这样就真实地模拟了大树从摇摆到静止的整个过程,相当逼真. 在线演示     

13种酷炫的html5 3D图片切换代码

jQuery 3D图片叠加css3翻转图片切换特效 html5图片3d切换幻灯片轮播特效代码 jquery 3d响应式幻灯片带左右按钮的图片滑动切换效果 jquery.slicebox酷炫的html5 3d图片轮播幻灯片切换效果 html5 css3 3D动画制作手机界面3D叠加突出动画效果 html5 3D图片网格布局点击图片3D动画弹出大图文字信息 css3 transform属性制作鼠标点击3D图片叠加动画效果 modernizr html5 jquery.windy图片类似纸被风吹走3D