CSSASSCSSASS

三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之

  (Three.js) 页面展现3D模型 作者:ONEBOYS    发表时间: 2012年02月24号,星期五     阅读:4,159 次  

CSS3的3d-Transform,Canvas,SVG,WebGL等等技术的出现和发展,正将网页的3D化慢慢变得简单友好,但是3D建模毕竟有其很高的专业性,所以如果拥有一个内心强大,接口简洁的库就能使我们得心应手许多。Three.js便是备受推崇的一个,尽管API的变动,简陋的文档会让我们的上手比较困难。

下面我提供一个入门Demo,及一个用Three.js展示通用的3D模型格式的Demo。(注意:确保你使用的浏览器支持了Canvas,及WebGL。拥有一个先进的浏览器,将为你带来更好的上网体验。Test

下面是入门Demo,加了注释。详细入门教程可以到这里Getting Started with Three.js

上面使用了Canvas模式渲染,因为考虑到Opera还不支持WebGL,WebGL的渲染模式要比Canvas快的要多的多。

下面是一个展示机器人MGA-411 Mangusa模型的Demo。
Three.js可以调用以Json格式存储模型信息的js文件来创建模型。模型你可以自己在3D软件上建模完成,或在网上下载。至于模型格式,你可以通过three.js提供的插件在Blender这款开源3D制作软件中将一些3D模型格式,如3ds,obj等,转换成符合three.js标准的js格式。

   

  firefox10的3D Transform 作者:ONEBOYS    发表时间: 2012年02月1号,星期三     阅读:698 次  

之前写了一篇CSS3的崛起——体验webkit的3D-Effect
随着firefox10正式版发布,firefox也支持3D Transform了,所以补充一篇,将上篇中的代码移植过来,支持firefox。

这里先穿插介绍下firefox10的新特性,firefox10除了支持3D Transform,还提供了Fullscreen API,令人兴奋吧。另外firefox10成为Mozila首个“长期支持版本”(Extended Support Release,简称“ESR”),这种当然是市场考虑啦,至于是什么用意和市场反响我们就不探讨了。

下面是演示demo,只支持firefox10。 chrome浏览器的用户可以参考上一篇。

去除一些效果

使用preserve-3d,实现全方位3D

最后说明一下firefox和webkit间使用的一点差别:
火狐10下的3D Transforms在设置perspective属性值时必须带单位px,webkit可以省略;
另外,webkit在用transition-property设置transform这个值时,可以不用前缀,而firefox需要写上-moz-transform;

   

  canvas的像素级操作——4.关注性能 作者:ONEBOYS    发表时间: 2012年01月17号,星期二     阅读:892 次  

我们开篇就提过,canvas的像素级操作相对来说是很低效的。

我们试着写一个图片切割效果。

对于这个效果,因为我们并不需要操作图像的rgba数据,而只是把图像进行分割,所以利用putImageData的后四个可见区参数进行了设置就行了。
但是,这样做的性能却非常不理想。因为我们操作的ImageData数据实在太多了,循环执行了2750遍,相当于我们对整幅图像进行了2750次的像素级复制,而其实在可见区之外的ImageData数据并不是我们所需要的。

那么,我们在对源图getImageData的时候,可以只获取我们需要的ImageData。

第二种做法虽然在循环的时候多运行了一个方法(共执行2750次的getImageData和putImageData方法),但因为操作的ImageData少了2750倍,所以在效率上比第一种方式高了很多。

但从流程上来讲,我们只需要在刚开始的时候获取一次源图的ImageData(执行getImageData),对数据进行再排列后,最后再输出一次新的ImageData(执行putImageData)就可以了。
根本不需要在循环中反复调用getImageData和putImageData。所以现在的关键点是get和put之间的如何对数据进行重排列。

ImageData.data可以看做一个矩形矩阵,我们已知,它的序列号(n)与ImageData.width(w),及x轴序列号(x),y轴序列号(y)的关系是:n = ((y * w) + x) * 4; (其中的4表示了RGBA四个数据)。我们要的新的输出ImageData,其实是x加倍,y加倍,w加倍的一个新矩阵。那么新矩阵序号与原x,y,w的关系式应该是:t = ((y * 2 * w * 2) + x * 2) * 4;

第三种方法相对于第二种方法的效率提高了十几倍。第三种方法的关键点是找出新旧矩阵之间的关系,对于我们这一例来说还比较容易,复杂一点的,算法可就没这么简单了。

——————————————
重要补充:

我们先总结下三种方法:第一种:效率低差,但理解起来最简单。第三种,算法复杂,但效率最高。第二种,折中。
然而,如果使用的是webkit,opera浏览器,我们会发现第一种方法的效率比之第三种方法居然差不了多少!
可以看出webkit,opera对putImageData做过优化。对于putImageData(imgdata, x, y, x, y, 1 ,1)方法,webkit,opera只对(x,y,1,1)这个1平方px区域内的数据进行了put操作,区域外的数据并没有进行操作,这样在效率上会有很大的提高。
可惜的是firefox(9)就没有做过优化。要加油啊,Mozila!
最新测试了下ie9,结果显示第一种方法的效率的确很低,而第二种方法比第一种方法的效率还要低一倍。看来ie9果然也没用对putImageData进行优化,而且ie9下的getImageData也没用像其他浏览器下那么优化。对于getImageData(x,y,1,1)的获取,它操作的整个图像的像素数据的,而不是那个1平方px内的数据。

目前来说,考虑到各个浏览器原生方法的效率问题,第三种方法是最优的,即不要反复调用getImageData和putmageData,因为某些浏览器下一旦调用就是操作全部imageData的,而不会看你的参数。不过在未来,各个浏览器肯定会对原生方法进行优化的,在考虑第一种方法的时候就不用有所顾忌了!

   

  canvas的像素级操作——3.使用卷积矩阵 作者:ONEBOYS    发表时间: 2012年01月12号,星期四     阅读:789 次  

利用卷积矩阵(Convolution Matrix)操作像素,我们可以很方便的得到诸如模糊、边缘检测、锐化、浮雕和斜角这样的效果。

常用的矩阵类型是 3 x 3 矩阵,另外还有5 x 5的矩阵。

工作原理:http://flex4jiaocheng.com/blog/280

点阵图中的每一个像素被称为“初步像素”,用与卷积矩阵同样面积的“初步像素”从左到右从上到下与卷积矩阵中相应位置的值相乘,再将得到的9个或25个中间值相加,就得到了“初步像素”矩阵中央的一个值的结果值再与Divisor(因子)相除,与Offset(偏移量)相加,最后得到终值。如下图所示:

应用卷积矩阵实现特效:

上面demo中卷积的实现函数来自于在HTML 5 的 Canvas 中应用卷积矩阵对图像处理

推荐一篇有趣的文章:卷积的物理意义

   

  canvas的像素级操作——2.RGBA通道调色 作者:ONEBOYS    发表时间: 2012年01月12号,星期四     阅读:627 次  

在前文里我们已经提到了ImageData,它包含了三条数据{width,height,CanvasPixelArray},而其中CanvasPixelArray存储了所有像素点的RGBA数据,第一个像素的red,green,blue,alpha通道值对应的就是CanvasPixelArray[0]-CanvasPixelArray[3],如此按从左往右,由上往下依次存储。

我们通过修改像素点的rgb值就能改变像素的色相,修改alpha值就能改变像素的不透明度。

上面的demo中,我们创建了一个50*50像素点的ImageData,那么ImageData.data包含的数据应该是有 50 x 50 x 4 条。
每12条一循环(即每隔两个像素),像素点的rgba值,没有经过设置的像素点,它们的缺省值是:[255,255,255,255]。

上例是,创建新的ImageData,相当于所有ImageData的初始值都是255。
下面针对图像的ImageData进行计算设值,以此改变图像的色相。这是一个RGB彩色转gray的效果。(效果同ie的滤镜:filter:gray();已经最新出现的webkit滤镜:-webkit-filter: grayscale(1);)

上面没有对ImageData.data做一次循环,而是对ImageData.width,ImageData.height做了两次循环。
两种循环其实是一样的。可以看下关系:ImageData.data.length = ImageData.width x ImageData.heigh x 4;
data的序号 n = ( (y * ImageData.width) + x) x 4 ;

而关于RGB转gray运算算法的知识,还可以参见这两篇文章:彩色转灰度算法RGB向灰度转换的原理

在上例中,出现了一个canvas对象的新方法toDataURL,这个方法会将canvas对象转换成data_URIs,一个base64 strings。这样就能出现在image标签下中的src中了。

canvas提供像素级数据,为很多算法的应用提供了平台,实现photoshop中的众多神奇图像效果在前端都已成为可能。
甚至于我们还能实现电影的蓝幕效果——针对video的帧,通过drawImage绘进canvas,再做rgba处理,将规定颜色的像素的alpha值设为0,就能使特定部分变成透明,进而实现视频合成。查看演示

   
1 / 2712345»...尾页 »