HTML5技术

HTML5版3D实验三:JavaScript玩转3D粒子系统

字号+ 作者:当耐特砖家 来源: 2014-11-16 21:26 我要评论( )

一.简介 这里所说的粒子系统,指得是大量的物体的聚集,我就把它叫做Particle Sytem。下面这个例子主要展示了物体的旋转运动,你应该可以看到一个大量分子(400个位置随机产生的星星

 3dps

一.简介

这里所说的粒子系统,指得是大量的物体的聚集,我就把它叫做Particle Sytem。下面这个例子主要展示了物体的旋转运动,你应该可以看到一个大量分子(400个位置随机产生的星星)组成的旋转球体。

二.球体模拟

在三维笛卡尔坐标系当中,球心在原点(0,0,0)的球方程如下:

JavaScript Code复制内容到剪贴板
  1. X2 +Y2+Z2=R2  

在模拟球体之前,我们先定义一个三维矢量,

JavaScript Code复制内容到剪贴板
  1. Vector3 = function (x, y, z) {  
  2.     this.x = x || 0;  
  3.     this.y = y || 0;  
  4.     this.z = z || 0;  
  5. };  

 

 

利用上面的球方程,我们可以随机生成半径为250的球上面的240个点的坐标

JavaScript Code复制内容到剪贴板
  1. var starPositions = [];  
  2.                 var j = -1;  
  3.                 for (var i = 0; i < 240; i++) {  
  4.                     var xTemp = getRandomNumber(-250, 250);  
  5.                     var yTemp = getRandomNumber(-250, 250);  
  6.                     j *= -1;  
  7.                     if (xTemp * xTemp + yTemp * yTemp <= r * r) {  
  8.                         var zTemp = j * Math.sqrt(Math.abs(r * r - xTemp * xTemp - yTemp * yTemp));  
  9.                         starPositions.push(new Vector3(xTemp, yTemp, zTemp));  
  10.                     }  
  11.                 }  

三.投影

要想出现3D效果,我们要进行透视投影,本篇暂时用简单粗暴的转换方式。

以后利用齐次坐标技术来描述空间各点的坐标,用4*4的矩阵来解决空间各点的变换。

JavaScript Code复制内容到剪贴板
  1. //集体投影  
  2. function PositionsProjection() {  
  3.     for (var i = 0; i < starPositions.length; i++) {  
  4.         var tempV = projection(starPositions[i]);  
  5.         starPositionsForShow.push(tempV);  
  6.     }  
  7. }  
  8. //投影  
  9. function projection(v) {  
  10.     var v1=new Vector3();  
  11.     v1.x = v.x * distance / Math.abs(cameraPosition.z - v.z);  
  12.     v1.y = v.y * distance / Math.abs(cameraPosition.z - v.z);  
  13.     v1.z = v.z;  
  14.     return v1;  
  15. }  

 

我们把投影之后的点都push进入另外一个数组用于显示。

然后我们根据这个数组,在每个点上挂上一颗星星。星星的x,y比例和透明度都根据摄像机或者点的Z坐标的位置决定。

 star (1)

这里用了easel.js,在以前已经提过。使用easel.js能够让Canvas编程更加OO,代码更加直观易懂。

JavaScript Code复制内容到剪贴板
  1. for (var i = 0; i < starPositionsForShow.length; i++) {  
  2.    
  3.                         tempStar = new Bitmap("image/star.png");  
  4.                         tempStar.x = centreOfCirclePosition.x + starPositionsForShow[i].x;  
  5.                         tempStar.y = centreOfCirclePosition.x + starPositionsForShow[i].y;  
  6.                         tempStar.scaleX = tempStar.scaleY = 0.5 * distance / Math.abs(cameraPosition.z - starPositionsForShow[i].z);  
  7.                         if (starPositionsForShow[i].z > 50) tempStar.alpha = 1;  
  8.                         if (starPositionsForShow[i].z < 50) tempStar.alpha = 0.5;  
  9.                         stage.addChild(tempStar);  
  10.                     }  

四.旋转(跟上篇一样)

JavaScript Code复制内容到剪贴板
  1. //旋转  
  2.           function rotate(angle) {  
  3.         
  4.               for (var i = 0; i < starPositions.length; i++) {  
  5.                   var tempX = starPositions[i].x;  
  6.                   var tempZ = starPositions[i].z;                     starPositions[i].x = starPositions[i].x * Math.cos(angle) - starPositions[i].z * Math.sin(angle);  
  7.                   starPositions[i].z = starPositions[i].z * Math.cos(angle) + tempX * Math.sin(angle);  
  8.               }  
  9.           }  

五.旋转动画

由于是Jscex控,所以只要是动画我都交给Jscex了。

JavaScript Code复制内容到剪贴板
  1. var roundAsync = eval(Jscex.compile("async"function () {  
  2.    
  3.                while (true) {  
  4.                    stage.removeAllChildren();  
  5.                    starPositionsForShow.length = 0;  
  6.    
  7.    
  8.                    currentAngle += 0.0005;  
  9.                    rotate(degToRad(currentAngle));  
  10.                    PositionsProjection();  
  11.    
  12.                    for (var i = 0; i < starPositionsForShow.length; i++) {  
  13.    
  14.                        tempStar = new Bitmap("image/star.png");  
  15.                        tempStar.x = centreOfCirclePosition.x + starPositionsForShow[i].x;  
  16.                        tempStar.y = centreOfCirclePosition.x + starPositionsForShow[i].y;  
  17.                        tempStar.scaleX = tempStar.scaleY = 0.5 * distance / Math.abs(cameraPosition.z - starPositionsForShow[i].z);  
  18.                        if (starPositionsForShow[i].z > 50) tempStar.alpha = 1;  
  19.                        if (starPositionsForShow[i].z < 50) tempStar.alpha = 0.5;  
  20.                        stage.addChild(tempStar);  
  21.                    }  
  22.                    stage.update();  
  23.    
  24.                    $await(Jscex.Async.sleep(50));  
  25.                }  
  26.            }))  
 

六.完整代码及演示


提示:可以修改后运行.

八.总结及预告

在3D编程的中,我们利用向量与矩阵的运算可以简化空间坐标变换的计算,比如求出某立方体绕任意轴旋转后的坐标,再比如计算旋转+缩放+切变+投影后的坐标变换,如果抛弃矩阵,将陷入大量的复杂计算当中。利用齐次坐标技术来描述空间各点的坐标,用4*4的矩阵来解决空间各点的变换,已经成了计算机图形学的一个标准。在以后,我们将利用和介绍3D编程利器----矩阵以及矩阵在计算机图形学中的应用!

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 8款超酷的HTML5 3D图片动画源码 - 帅的相对论

    8款超酷的HTML5 3D图片动画源码 - 帅的相对论

    2015-12-17 09:45

  • 9个超绚丽的HTML5 3D图片动画特效 - 帅的相对论

    9个超绚丽的HTML5 3D图片动画特效 - 帅的相对论

    2015-12-15 13:00

  • HTML5游戏开发引擎,初识CreateJS - 请叫我头头哥

    HTML5游戏开发引擎,初识CreateJS - 请叫我头头哥

    2015-11-03 08:05

  • 无插件纯Web HTML5 3D机房 终结篇(新增资产管理、动环监控等内容) - twaver

    无插件纯Web HTML5 3D机房 终结篇(新增资产管理、动环监控等内容)

    2015-10-27 11:47

网友点评