查看: 2745|回复: 3
打印 上一主题 下一主题

[Papervision3D] 图片墙的制作

[复制链接]

4

主题

0

听众

70

积分

设计初学者

Rank: 1

纳金币
10
精华
0

活跃会员 灌水之王

跳转到指定楼层
楼主
发表于 2013-11-4 09:56:32 |只看该作者 |倒序浏览

使用pv3d 类库真的可以创作出不错的效果演示,这种效果已经见得很多了,实际做法也不是很难。

基本原理是通过圆形的方式对图片进行分布,然后通过rotationY 偏转每一张图片角度,促使向中心点连线垂直。

讲到分布,圆形分布是其中一种比较常用的手法。通过对图片进行平均的分布位置,围绕圆来进行。

制作过程:

     1. 准备papervision3d 的类库

     2. 准备补间引擎类库TweenMax 或者其他

     3 .准备两套图片,一大一小对应起来。

     4. 对图片实现交互效果,弹出和缩放,通过TweenMax 进行

     5.采取一次加载的办法,当点击加载之后通过保存方式对其进行显示。



初步示意图如图,每一张图片都会与中心向注册点连线垂直。这一点当我们求出出来就能实现到如上面的效果。

偏移角度计算:通过平行线互补角为180的关系 求出,(180-i*perAngle)+90=-i*perAngle+270;这个方式可以求出偏移的角度。

下面的类写在一个里面,但是建议将其分开处理。使主类尽量减少不必要的代码开支。看起来更加简洁一些。

  Main.as

  plane2d.as

  还可以再细分起来。

注意:由于方便一点编译所以将整个类写出来,但是为了分类减少主类的大小和复杂的逻辑,还是可以将部分功能抽出来。
  1. package
  2. {
  3.        
  4.         import org.papervision3d.core.utils.Mouse3D;
  5.         import org.papervision3d.events.InteractiveScene3DEvent;
  6.         import org.papervision3d.objects.DisplayObject3D;
  7.         import org.papervision3d.view.BasicView;
  8.         import org.papervision3d.objects.primitives.Plane;
  9.         import org.papervision3d.materials.ColorMaterial;
  10.         import org.papervision3d.scenes.Scene3D;
  11.         import org.papervision3d.cameras.Camera3D;
  12.         import org.papervision3d.render.BasicRenderEngine;
  13.     import org.papervision3d.materials.*;   
  14.         import org.papervision3d.view.Viewport3D;
  15.     import org.papervision3d.core.effects.view.ReflectionView;
  16.         import org.papervision3d.core.render.filter.BasicRenderFilter;
  17.         import org.papervision3d.core.utils.virtualmouse.*;
  18.        
  19.         import flash.filters.*;
  20.         import flash.events.*;
  21.         import flash.display.Sprite;
  22.         import flash.utils.Dictionary;
  23.         import flash.display.Bitmap;
  24.         import flash.display.Loader;
  25.         import flash.net.URLRequest;
  26.        
  27.         import com.greensock.TweenMax;
  28.        
  29.         [SWF(width="640", height="480", frameRate="30", backgroundColor="0x000000")]
  30.         public class Main extends Sprite
  31.         {
  32.                 private var pc:Plane = new  Plane();
  33.                 private var camera:Camera3D=new Camera3D();//摄影
  34.                 private var scene:Scene3D=new Scene3D();//场景
  35.                 private var engine:BasicRenderEngine=new BasicRenderEngine();//渲染引擎
  36.                 private var  view:ReflectionView=new ReflectionView(640,480,true,true);
  37.                 private var angle:Number = 0;
  38.             private var vMouse:VirtualMouse;
  39.         private var mouse3D:Mouse3D;
  40.                 private var data:Dictionary = new Dictionary(true);//保存已经加载的图片
  41.                 private var tempURL:String;
  42.          
  43.                 public function Main()
  44.                 {
  45.                         init3D();
  46.                 }

  47.                 //初始化图片位置和设置
  48.                 private function init3D():void
  49.                 {
  50.                
  51.                         var contain:DisplayObject3D = new DisplayObject3D();
  52.        
  53.                         var perAngle:Number = 2 * Math.PI / 20;
  54.                         for (var i:int=0; i<20; i++)
  55.                         {
  56.                                 var cm:BitmapFileMaterial = new BitmapFileMaterial("wallimages/thumbs/"+(i+1)+".jpg");   
  57.                                 var p:Plane2D = new Plane2D(cm, 100, 100);
  58.                                 cm.interactive = true;
  59.                                
  60.                                 p.x = Math.cos(i * perAngle) *350;
  61.                             p.z = Math.sin(i * perAngle) * 350;
  62.                                 p.url = "wallimages/" + (i + 1) + ".jpg";//大图片路径
  63.                                 p.rotationY = ( -i * perAngle) * (180 / Math.PI) + 270;//计算的偏移值
  64.                                 p.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onMouseOverHandler);
  65.                 p.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onMouseOutHandler);
  66.                 p.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onMouseClickHandler);
  67.                                 contain.addChild(p);                       
  68.                         }
  69.                        
  70.                         view.scene.addChild(contain);
  71.                         view.camera .z = -600;
  72.                         view.camera.target = pc;
  73.                  
  74.                         //设置反射
  75.                         view.surfaceHeight =-100;
  76.             view.viewportReflection.alpha = 0.5;
  77.             view.viewportReflection.filters = [new BlurFilter(3, 3, 1)];
  78.                
  79.                         //vMouse = view.viewport.interactiveSceneManager.virtualMouse;
  80.            // mouse3D = view.viewport.interactiveSceneManager.mouse3D;
  81.            // Mouse3D.enabled = true;
  82.                        
  83.                         addChild(view);
  84.                         addEventListener(Event.ENTER_FRAME,render);
  85.                 }

  86.                
  87.                 private function onMouseOverHandler(event:InteractiveScene3DEvent):void
  88.                 {
  89.                   
  90.                        
  91.                        
  92.                 }
  93.                
  94.                 private function onMouseOutHandler(event:InteractiveScene3DEvent):void
  95.                 {
  96.                        
  97.                        
  98.                 }
  99.                
  100.                 private function onMouseClickHandler(event:InteractiveScene3DEvent):void
  101.                 {
  102.                         //判断这张图片是否第一次加载
  103.                        
  104.                    if(getImage(event.currentTarget.url)==null)       
  105.                    {
  106.                          loadImage(event.currentTarget.url);       
  107.                    }
  108.                    else
  109.                    {
  110.                           showImage(event.currentTarget.url);                         
  111.                    }
  112.                   
  113.                 }
  114.                
  115.                 //绘制底图背景
  116.                 private   function  drawBase(bitmap:*, w:Number, h:Number, color:uint = 0xffffff):Sprite               
  117.                 {
  118.                         var filter:DropshadowFilter=new DropShadowFilter();
  119.                         filter.strength=0.3;
  120.                         var shape:Sprite = new Sprite();               
  121.                         shape.addChild(bitmap);
  122.                         shape.graphics.lineStyle(0,0,0);
  123.                         shape.graphics.beginFill(color);
  124.                         shape.graphics.drawRect(bitmap.x-w/60,bitmap.y-h/60,w+w/30,h+h/30);
  125.                         shape.graphics.endFill();
  126.                         shape.filters = [filter];
  127.                        
  128.                         return shape;
  129.                 }
  130.                
  131.                 //添加图片
  132.                 private function addImage(id:String,obj:*):void
  133.                 {
  134.                         data[id] = obj;       
  135.                 }
  136.                
  137.                 //获取图片
  138.                 private function getImage(id:String):*
  139.                 {               
  140.                         return data[id];
  141.                 }
  142.                
  143.                 //加载图片
  144.                 private function loadImage(url:String):void
  145.                 {
  146.                         var loader:Loader = new Loader();
  147.                         tempURL = url;
  148.                         loader.load(new URLRequest(url))
  149.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadImageComplete);
  150.                 }
  151.                
  152.                 //显示图片
  153.                 private function showImage(url:String):void
  154.                 {                         
  155.                     var contain:Sprite = getImage(url);
  156.                         addChild(contain);
  157.                         contain.x = stage.stageWidth / 2;
  158.                         contain.y = stage.stageHeight / 2;
  159.             contain.scaleX = contain.scaleY = 0;
  160.                         contain.alpha = 0;
  161.                         TweenMax.to(contain, 0.5, { scaleX:1, scaleY:1,alpha:1 });                               
  162.                 }
  163.                
  164.                 //加载图片-- 删除监听
  165.                 private function onLoadImageComplete(event:Event):void
  166.                 {
  167.                         event.currentTarget.removeEventListener(Event.COMPLETE, onLoadImageComplete);
  168.                         var bmp:Bitmap = Bitmap(event.currentTarget.content);
  169.                         bmp.x = -bmp.width / 2;
  170.                         bmp.y = -bmp.height / 2;
  171.                         var contain:Sprite = drawBase(bmp, bmp.width, bmp.height);
  172.                         contain.addEventListener(MouseEvent.CLICK, onBackHandler);
  173.                         contain.addChild(bmp);
  174.                        
  175.                         addChild(contain);
  176.                         contain.x = stage.stageWidth / 2;
  177.                         contain.y = stage.stageHeight / 2;
  178.             contain.scaleX = contain.scaleY = 0;
  179.                         contain.alpha = 0;
  180.                         TweenMax.to(contain, 0.5, { scaleX:1, scaleY:1, alpha:1 } );
  181.                        
  182.                         addImage(tempURL, contain);
  183.                 }
  184.                
  185.                 private function onBackHandler(event:MouseEvent):void
  186.                 {
  187.                   var mc:*=        event.currentTarget;
  188.                   TweenMax.to(mc, 0.5, { scaleX:0, scaleY:0, alpha:0, onComplete:removeContain } );       
  189.                   function removeContain():void
  190.                   {
  191.                          removeChild(mc);                 
  192.                   }
  193.                 }
  194.                                
  195.                 private function render(event:Event):void
  196.                 {               
  197.            //距离检测
  198.                    var dist:Number = ((stage.mouseX) - stage.stageWidth * 0.5) * 0.005;  
  199.                    var dist2:Number = ((stage.mouseY) - stage.height * 0.5) *0.01;
  200.                   
  201.            angle += dist;
  202.                
  203.                   //旋转镜头
  204.                    view.camera.x =600*Math.cos(angle*Math.PI/180);
  205.                    view.camera.z =600*Math.sin(angle*Math.PI/180);
  206.                    view.camera.fov += dist2;
  207.                        
  208.                         if (view.camera.fov>90)
  209.                         {
  210.                            view.camera.fov = 90;
  211.                         }
  212.                    else if( view.camera.fov<50)
  213.                    {
  214.                              view.camera.fov = 50;
  215.                    }
  216.                   
  217.                    view.singleRender();//渲染
  218.                 }

  219.         }

  220. }
  221. import org.papervision3d.objects.primitives.Plane;
  222. import org.papervision3d.core.proto.MaterialObject3D;
  223. class Plane2D extends Plane
  224. {
  225.          //继承plane类,增加一个url 属性
  226.         public var url:String;
  227.         public function Plane2D( material:MaterialObject3D=null, width:Number=0, height:Number=0, segmentsW:Number=0, segmentsH:Number=0 )
  228.         {
  229.           super(material, width, height, segmentsW, segmentsH);               
  230.         }       
  231. }
复制代码
点击之后交互效果。



分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

0

主题

1

听众

236

积分

设计实习生

Rank: 2

纳金币
6
精华
0

最佳新人

沙发
发表于 2013-11-9 16:02:29 |只看该作者
非常感谢分享
回复

使用道具 举报

0

主题

1

听众

62

积分

设计初学者

Rank: 1

纳金币
3
精华
0

活跃会员 灌水之王

板凳
发表于 2013-11-23 18:50:09 |只看该作者
非常感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-1-27 20:47 , Processed in 0.077731 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部