Flash基礎理論課 第十六章 3D線條與填充Ⅰ

來源:互聯網
上載者:User

返回“Flash基礎理論課 - 目錄”

第十五章我們介紹了3D,但只是將物體置於3D空間中,設定大小與位置。物體實際上還是2D的。這就像老的3D遊戲中,我們可以繞著某個物體或人物走,這些對象會轉過來面對我們。這些物體或人物並不是真正的會轉過來 —— 只是看上去是這樣的,因為它們都是2D 物體,那是我們看到它唯一的一個視角。

本章,我們將真正地在 Flash中建立3D 模型。具體說來有建立並使用3D 點,線條,填充以及立體圖形。學習完本章,大家就可以任意在三維空間中建立各種形狀,並對它們執行移動和旋轉。

建立點和線條

如果只在 3D中建立點而不建立線條的話是沒有任何意義的。因為理論上講,一個點是沒有維度並且不可見的。開始時,我們還將使用Ball3D 類,給一個非常小的半徑,只要能看到點在哪就夠了。這樣,只需要再建立幾條線將這些小球連起來就行了。相當簡單。我們前面做過這樣的例子,不過這次要在小球上添加透視,將它們放入3D空間。

可以將點的執行個體設為黑色,10 像素寬。建立一些點的執行個體,根據滑鼠的位置對它們進行旋轉(如前一章最後所講的一樣),然後在點間繪製一些線條。代碼與上一章的RotateXY.as檔案幾乎相同。主要的區別在 onEnterFrame的最後一塊兒,從第一個點迴圈繪製線條到剩下所有的點。同時,我還刪除了sortZ 方法,因為在這裡有沒有都一樣。以下是Lines3D1.as的全部代碼。運行結果如圖 16-1 所示。

package {
 import flash.display.Sprite;
 import flash.events.Event;
 public class Lines3D1 extends Sprite {
  private var balls:Array;
  private var numBalls:uint = 50;
  private var fl:Number = 250;
  private var vpX:Number = stage.stageWidth / 2;
  private var vpY:Number = stage.stageHeight / 2;
  public function Lines3D1() {
   init();
  }
  private function init():void {
   balls = new Array();
   for (var i:uint = 0; i < numBalls; i++) {
    var ball:Ball3D = new Ball3D(5, 0);
    balls.push(ball);
    ball.xpos = Math.random() * 200 - 100;
    ball.ypos = Math.random() * 200 - 100;
    ball.zpos = Math.random() * 200 - 100;
    addChild(ball);
   }
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  private function onEnterFrame(event:Event):void {
   var angleX:Number = (mouseY - vpY) * .001;
   var angleY:Number = (mouseX - vpX) * .001;
   for (var i:uint = 0; i < numBalls; i++) {
    var ball:Ball3D = balls[i];
    rotateX(ball, angleX);
    rotateY(ball, angleY);
    doPerspective(ball);
   }
   graphics.clear();
   graphics.lineStyle(0);
   graphics.moveTo(balls[0].x, balls[0].y);
   for (i = 1; i < numBalls; i++) {
    graphics.lineTo(balls[i].x, balls[i].y);
   }
  }
  private function rotateX(ball:Ball3D, angleX:Number):void {
   var cosX:Number = Math.cos(angleX);
   var sinX:Number = Math.sin(angleX);
   var y1:Number = ball.ypos * cosX - ball.zpos * sinX;
   var z1:Number = ball.zpos * cosX + ball.ypos * sinX;
   ball.ypos = y1;
   ball.zpos = z1;
  }
  private function rotateY(ball:Ball3D, angleY:Number):void {
   var cosY:Number = Math.cos(angleY);
   var sinY:Number = Math.sin(angleY);
   var x1:Number = ball.xpos * cosY - ball.zpos * sinY;
   var z1:Number = ball.zpos * cosY + ball.xpos * sinY;
   ball.xpos = x1;
   ball.zpos = z1;
  }
  private function doPerspective(ball:Ball3D):void {
   if (ball.zpos > -fl) {
    var scale:Number = fl / (fl + ball.zpos);
    ball.scaleX = ball.scaleY = scale;
    ball.x = vpX + ball.xpos * scale;
    ball.y = vpY + ball.ypos * scale;
    ball.visible = true;
   } else {
    ball.visible = false;
   }
  }
 }
}

圖16-1 3D 點與線

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.