<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
    上一課主要學習基本3D交互場景事件的用法,這一課記錄高級用法~!

        我以旋轉的立方體為例,3D場景中有一個立方體,立方體的6個面每一個面都有一幅圖(貼圖),當鼠標點擊其中的任一面時,緩動放大,再點擊時緩動縮小恢復原狀繼續旋轉。效果圖如下:

    鼠標未點擊時不斷旋轉的立方體效果

    鼠標點擊時緩動放大效果

       效果代碼如下:

     

     package 
    {
     
       
        import flash.display.DisplayObject;
        import org.papervision3d.materials.BitmapFileMaterial;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.events.InteractiveScene3DEvent;
        import org.papervision3d.objects.primitives.Cube;
       
        public class MainAdvancedInteractiveScene3dEvent extends PaperBase
     {
           //---------------------------------------------------------------6個面對應的material
           private var frontMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/concretetex02.jpg");
           private var backMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/concretetex03.jpg");
           private var leftMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/bashi.jpg");
        private var rightMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/pic12.jpg");
           private var topMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/pic37.jpg");
           private var bottomMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/pic43.jpg");
          
        //---------------------------------------------------------------目標旋轉初始值
           private var targetrotationX:Number = 0;
           private var targetrotationY:Number = 0;
           private var targetrotationZ:Number = 0;
          
        //---------------------------------------------------------------判斷是否緩動
           private var tweening:Boolean = false;
          
           private var cube:Cube;
          
           public function MainAdvancedInteractiveScene3dEvent()
        {
             init(550, 400);
           }
          
           override protected function init3d():void
        {
             frontMaterial.interactive = true;
             frontMaterial.name = "front";
      
             backMaterial.interactive = true;
             backMaterial.name = "back";
      
             leftMaterial.interactive = true;
             leftMaterial.name = "left";
      
             rightMaterial.interactive = true;
             rightMaterial.name = "right";
      
             topMaterial.interactive = true;
             topMaterial.name = "top";
      
             bottomMaterial.interactive = true;
             bottomMaterial.name = "bottom";        
       //------------------------------------------------------------Cube
             cube = new Cube(new MaterialsList(
       {
                  front: frontMaterial,
                  back: backMaterial,
                  left: leftMaterial,
                  right: rightMaterial,
                  top: topMaterial,
                  bottom: bottomMaterial
                } ), 500, 500, 500, 3, 3, 3);
             cube.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onPress);
             default_scene.addChild(cube);
      }
          
           private function onPress( e:InteractiveScene3DEvent ):void
        {
             if (tweening)
       {
                  tweening = false;
             }
       else
       {
                  switch(e.face3d.material.name)
         {
                      case "front":
                         targetrotationX = 0;
                         targetrotationY = 180;
                         targetrotationZ = 0;
                         tweening = true;
                      break;
                      case "back":
                         targetrotationX = 0;
                         targetrotationY = 0;
                         targetrotationZ = 0;
                         tweening = true;
                      break;
                      case "left":
                         targetrotationX = 0;
                         targetrotationY = -90;
                         targetrotationZ = 0;
                         tweening = true;
                      break;
                      case "right":
                         targetrotationX = 0;
                         targetrotationY = 90;
                         targetrotationZ = 0;
                         tweening = true;
                      break;
                      case "top":
                         targetrotationX = 90;
                         targetrotationY = 0;
                         targetrotationZ = 0;
                         tweening = true;
                      break;
                      case "bottom":
                         targetrotationX = -90;
                         targetrotationY = 0;
                         targetrotationZ = 180;
                         tweening = true;
                      break;
        }
       }
      }
          
           override protected function processFrame():void
        {
             if (tweening)
       {
                  if (default_camera.zoom < 6.8)
         {
                      default_camera.zoom += Math.sqrt(6.8-default_camera.zoom)/5;
                  }
                 
                  //X
                  if (cube.rotationX < targetrotationX)
         {
                      cube.rotationX += Math.sqrt(targetrotationX-cube.rotationX);
                      cube.rotationX = Math.round(cube.rotationX);
                  }else if (cube.rotationX > targetrotationX)
         {
                      cube.rotationX -= Math.sqrt(cube.rotationX-targetrotationX);
                      cube.rotationX = Math.round(cube.rotationX);
                  }
         //Y
                  if (cube.rotationY < targetrotationY)
         {
                      cube.rotationY += Math.sqrt(targetrotationY-cube.rotationY);
                      cube.rotationY = Math.round(cube.rotationY);
                  }else if (cube.rotationY > targetrotationY)
         {
                      cube.rotationY -= Math.sqrt(cube.rotationY-targetrotationY);
                      cube.rotationY = Math.round(cube.rotationY);
                  }
         //Z
                  if (cube.rotationZ < targetrotationZ)
         {
                      cube.rotationZ += Math.sqrt(targetrotationZ-cube.rotationZ);
                      cube.rotationZ = Math.round(cube.rotationZ);
                  }else if (cube.rotationZ > targetrotationZ)
         {
                      cube.rotationZ -= Math.sqrt(cube.rotationZ-targetrotationZ);
                      cube.rotationZ = Math.round(cube.rotationZ);
                  }
       }
       //
       else
       {
                  if (default_camera.zoom > 2)
         {
                      default_camera.zoom -= Math.sqrt(default_camera.zoom-2)/5;
                  }
                 
                  cube.rotationX += 2;
                  cube.rotationY += 2;
                 
                  if (cube.rotationX>= 360) cube.rotationX = 0;
                  if (cube.rotationY>= 360) cube.rotationY = 0;
             }
           }
        }
    }

     

        代碼比較長,關鍵處已加以說明~!

        這段代碼依然是有關InteractiveScene3DEvent類的用法,由于立方體有6個面,為了顯示每個面的不同,采用了6張圖片做貼圖;為了能讓立方體的每個面都能實現鼠標交互,在init3d()函數中設置6個面的交互屬性為true:

             frontMaterial.interactive = true;
             frontMaterial.name = "front";   
             backMaterial.interactive = true;
             backMaterial.name = "back";   
             leftMaterial.interactive = true;
             leftMaterial.name = "left";   
             rightMaterial.interactive = true;
             rightMaterial.name = "right";   
             topMaterial.interactive = true;
             topMaterial.name = "top";   
             bottomMaterial.interactive = true;
             bottomMaterial.name = "bottom"; 

     

        由于要求有緩動效果,所以在幀頻處理函數中通過默認相機的放大:

     

     default_camera.zoom += Math.sqrt(6.8-default_camera.zoom)/5;

     

        縮小:

     

     default_camera.zoom -= Math.sqrt(default_camera.zoom-2)/5;

     

    來達到效果。接著通過判斷立方體的X、Y、Z三個方向的旋轉進一步設定緩動放大縮小過程效果,從而達到高級3D場景交互事件效果的運用目的。

        總結:本節主要是關于高級3D場景交互事件用法,特別是在一些緩動算法上有一定的難度,通過平方根函數求兩點之間的距離達到緩動放大、縮小的效果(這個我習慣稱為逼近“定點距離緩動”)。

        本教程可自由轉載,請注明轉載出處,謝謝~!

    posted on 2008-11-19 14:52 seal 閱讀(696) 評論(0)  編輯  收藏 所屬分類: Flex+ActionScript
    主站蜘蛛池模板: 女人18毛片特级一级免费视频| 亚洲线精品一区二区三区| 国产精品亚洲综合一区在线观看 | 99re6在线精品免费观看| 久久精品国产亚洲77777| 宅男666在线永久免费观看| a毛片久久免费观看| 亚洲精品二三区伊人久久| 亚洲国产精品嫩草影院久久| 精品国产污污免费网站aⅴ| 特级毛片A级毛片免费播放| 久久亚洲精品成人AV| 日本中文一区二区三区亚洲| 最近免费中文字幕高清大全| 日本一区二区三区在线视频观看免费 | 久久精品国产亚洲av品善| 亚洲国产精品乱码一区二区 | 男人和女人高潮免费网站| 久久久久久亚洲精品成人| 国产免费观看青青草原网站| 98精品全国免费观看视频| 尤物视频在线免费观看 | 色欲国产麻豆一精品一AV一免费| 亚洲av无码专区首页| 亚洲精品美女久久久久| 亚洲男人第一无码aⅴ网站| 欧洲精品成人免费视频在线观看 | 永久免费看mv网站入口| 日韩av无码久久精品免费| 免费无遮挡无码视频在线观看| 亚洲国产成人久久三区| 国产亚洲精品自在久久| 免费人成在线观看播放国产| 97在线线免费观看视频在线观看 | 久久亚洲精品无码观看不卡| 日韩免费三级电影| 久久午夜免费视频| 免费人成在线观看网站品爱网| 一级免费黄色毛片| 美美女高清毛片视频黄的一免费 | 亚洲国产精品久久久天堂|