2009年6月24日 星期三

Tutorial 03a: Camera 與 Screen Resize

在Sandy3D裡Camera有一屬性, fov (vertical field of view angle),代表了垂直視野的視角與視點高度的關係,如下圖所示:

focal length的計算公式為:
var fl:Numer = (viewport.height / 2) / Math.tan (camera.fov / 2 * (Math.PI / 180));
任何位於 wz = fl 的 plane 後面的物體,看起來都會比實際上小,而位於前面的,就會看起來比較大。

  1. package
  2. {
  3. import flash.display.Bitmap;
  4. import flash.display.BitmapData;
  5. import flash.display.Sprite;
  6. import flash.display.StageScaleMode;
  7. import flash.display.StageAlign;
  8. import flash.events.Event;
  9. import sandy.core.scenegraph.Camera3D;
  10. import sandy.core.scenegraph.Group;
  11. import sandy.materials.Appearance;
  12. import sandy.materials.BitmapMaterial;
  13. import sandy.primitive.Plane3D;
  14. import sandy.core.Scene3D;

  15. public class Example003a extends Sprite
  16. {
  17. [Embed(source = 'images/Ume.png')]
  18. private var texture:Class;
  19. private var scene:Scene3D;
  20. private var plane:Plane3D;
  21. public function Example003a()
  22. {
  23. var text:Bitmap = new texture;
  24. var tex:BitmapData = text.bitmapData;
  25. stage.scaleMode = StageScaleMode.NO_SCALE;
  26. stage.align = StageAlign.TOP_LEFT;
  27. scene = new Scene3D("myScene", this, new Camera3D(100, 100),
  28. new Group("myRoot"));
  29. // 產生一 Plane3D 物件,並設定其參數, 分別為:
  30. // 識別名稱,寬與高
  31. plane = new Plane3D("myPlane", tex.height, tex.width);
  32. // 設定 plane 之外觀
  33. plane.appearance = new Appearance(new BitmapMaterial(tex));
  34. scene.root.addChild(plane);
  35. scene.render();
  36. stage.addEventListener(Event.RESIZE, onResize);
  37. onResize(null);
  38. }
  39. private function onResize(evt:Event):void
  40. {
  41. // 取得舞台的寬及高
  42. var w:Number = stage.stageWidth;
  43. var h:Number = stage.stageHeight;
  44. // 更新攝影機的視點
  45. scene.camera.viewport.width = w;
  46. scene.camera.viewport.height = h;
  47. // 取得 plane 與攝影機的距離
  48. var d:Number = plane.getPosition("camera").getNorm();
  49. // 將攝影機的焦點置於 wz = d 並維持1:1大小
  50. scene.camera.fov = 2 * Math.atan2(h / 2, d) * (180 / Math.PI);
  51. // 刷新場景
  52. scene.render();
  53. }
  54. }
  55. }



程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03a

2009年6月22日 星期一

GRUB

GRUB(GRand Unified Bootloader)是GNU下的FSF組織所推行的一套多重開機管理軟體,其主要特點如下:
  • 支授多樣化的格式
  • 支授不可多重開機的作業系統
  • 可載入多重模組
  • 設定檔較人性化
  • 選單介面
  • 彈性化的指令介面
  • 支援多種檔案系統種類
  • 支授自動解壓縮
  • 可從任何已安裝的設備中讀取檔案
  • 磁碟轉換的獨立性
  • 偵測現有記憶體
  • 支授LBA模式
  • 可透過網路下載作業系統映像檔
  • 支授無磁碟系統
  • 支授遠端終端機模式

  • GRUB開機時區分為三個階段:Stage 1、Stage 1.5 和 Stage 2。對照在 Linux 的 /boot/grub 目錄下,可以看到三個由系統所建立的檔案:stage1、e2fs_stage_1_5 及 stage2。

    Stage 1
    stage1 步驟在 GRUB 中是不可或缺的,主要負責當 BIOS 交接給 GRUB 時,載入存在於各分割區中的開機檔,也就是所謂的開機管理程式,stage1 檔案其實就是 MBR 中的在 bootloader 的備份檔,但仍有些些微的差異。建議若要備份 MBR,仍是使用 “dd” 將 MBR 備分出來比較安全。stage1 在 /boot/brub 中的檔案大小為512Bytes。

    Stage 1.5
    其作用就像是連接 stage1 到 stage2 的一個通道,裡面唯一存放著的是該系統檔案的格式。當載入到 stage1.5 之後,像是e2fs_stage1_5 (ext2 的檔案系統),就可以認識到 ext 2檔案的系統格式。當 stage1 載入 stage1.5之後,stage1 就可以認識 ext2 並將 stage2 載入。這一連串過程的順序讓 GRUB 在安裝完成後,stage2 可以在被搬移後的情況下,就算不在原本的目錄或檔案系統中,依然可以被安全的找到。

    Stage 2
    這檔案是 GRUB 的核心程式,能讓使用者以選單方式將作業系統載入、新增參數、修改選項。對 GRUB 來說,stage2 除了不能自己啟動外,剩下的事情幾乎都被 stage2 全包了。Stage2 檔案是放在各分割區的 Boot sector,主要功能如下:
  • 提供選單
  • 讀取設定檔
  • 連接下一個 boot sector

  • 下圖為GRUB與開機順序的關係圖:

    A:將系統分割區指向第一顆硬碟的第三個分割區。
    B:準備安裝 GRUB 至 MBR。
    C:將 stage1 部份資料安裝至 MBR 的 bootloader 空間。
    D:將 stage1.5 的檔案寫入 MBR 後的15個磁區,磁區數目會因檔案系統格式的不同而有差異,因為所對應的 stage1.5 之檔案不同。
    E:告知 bootloader,當需要載入 stage2 時,其位置在第一顆硬碟的第三個 partition 的 /boot/grub 目錄下。
    F:將 grub.conf 設定檔的位置拉接告知 stage2。

    1:BIOS 將控制權交給硬碟的第零軌,MBR。
    2:MBR 中的 bootloader 透過原本內建的位址載入 stage1.5。
    3:bootloader 透過 stage1.5 內容,將分割區中的 stage2 載入。
    4:stage2 此時就可以在檔案系統中將 grub.conf 設定檔載入,讓使用者可以看到選單畫面。

    參考書目:邱世華.《Linux 作業系統之奧義》.稅知文化

    2009年6月19日 星期五

    重要公式 - 坐標旋轉及角度反彈

    坐標旋轉:
    x1 = Math.cos(angle) * x - Math.sin(angle) * y;
    y2 = Math.cos(angle) * y + Math.sin(angle) * x;


    反坐標旋轉:
    x1 = Math.cos(angle) * x + Math.sin(angle) * y;
    y1 = Math.cos(angle) * y - Math.sin(angle) * x;




    參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

    2009年6月17日 星期三

    Tutorial 03: 使用Camera3D

    重點API
    sandy.core.scenegraph.Camera3D
    sandy.core.data.Point3D
    sandy.primitive.Line3D
    sandy.primitive.Torus
    1. package
    2. {
    3. import flash.display.InteractiveObject;
    4. import flash.display.Sprite;
    5. import flash.events.Event;
    6. import flash.events.KeyboardEvent;
    7. import flash.ui.Keyboard;
    8. import sandy.core.data.Point3D;
    9. import sandy.core.Scene3D;
    10. import sandy.core.scenegraph.Camera3D;
    11. import sandy.core.scenegraph.Group;
    12. import sandy.materials.Appearance;
    13. import sandy.materials.attributes.LightAttributes;
    14. import sandy.materials.attributes.LineAttributes;
    15. import sandy.materials.attributes.MaterialAttributes;
    16. import sandy.materials.ColorMaterial;
    17. import sandy.materials.Material;
    18. import sandy.primitive.Line3D;
    19. import sandy.primitive.Torus;
    20. public class Example003 extends Sprite
    21. {
    22. private var scene:Scene3D;
    23. private var camera:Camera3D;
    24. public function Example003()
    25. {
    26. camera = new Camera3D(300, 300);
    27. //camera.x = 100;
    28. //camera.y = 100;
    29. camera.z = -400;
    30. // 使得 camera 物件朝某點拍攝
    31. //camera.lookAt(0, 0, 0);
    32. var root:Group = createScene();
    33. scene = new Scene3D("scene", this, camera, root);
    34. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    35. // 為整個舞台添加鍵盤的 Key Down 事件聆聽器
    36. stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    37. }
    38. private function createScene():Group
    39. {
    40. var g:Group = new Group();
    41. // 產生 3DLine 物件, 並設定其參數,分別為:
    42. // 識別名稱,及 Point3D 物件以定議線條的折點
    43. var myXLine:Line3D = new Line3D("x-coord", new Point3D( -50, 0, 0),
    44. new Point3D(50, 0, 0));
    45. var myYLine:Line3D = new Line3D("y-coord", new Point3D(0, -50, 0),
    46. new Point3D(0, 50, 0));
    47. var myZLine:Line3D = new Line3D("z-coord", new Point3D(0, 0, -50),
    48. new Point3D(0, 0, 50));
    49. // 產生 Torus 物件,並設定其參數,分別為:
    50. // 識別名稱、大半徑及小半徑
    51. var torus:Torus = new Torus("theTorus", 120, 20);
    52. var materialAttr:MaterialAttributes = new MaterialAttributes(
    53. new LineAttributes(0.5, 0x2111BB, 0.4),
    54. new LightAttributes(true, 0.1)
    55. );
    56. var material:Material = new ColorMaterial(0xFFCC33, 1, materialAttr);
    57. material.lightingEnable = true;
    58. var app:Appearance = new Appearance(material);
    59. // 將外觀物件套用到顯示物件 tours
    60. torus.appearance = app;
    61. torus.rotateX = 30;
    62. torus.rotateY = 30;
    63. // 將顯示物件加入舞台顯示群組中
    64. g.addChild(myXLine);
    65. g.addChild(myYLine);
    66. g.addChild(myZLine);
    67. g.addChild(torus);
    68. return g;
    69. }
    70. private function enterFrameHandler(evt:Event):void
    71. {
    72. scene.render();
    73. }
    74. private function keyPressed(evt:KeyboardEvent):void
    75. {
    76. // 依據使用者所按下的鍵,做不用的處理
    77. switch(evt.keyCode) {
    78. case Keyboard.UP:
    79. // 調整 camera 傾斜的幅度
    80. camera.tilt += 2;
    81. break;
    82. case Keyboard.DOWN:
    83. camera.tilt -= 2;
    84. break;
    85. case Keyboard.RIGHT:
    86. // 調整 camera 沿Y軸轉向的幅度
    87. camera.pan -= 2;
    88. break;
    89. case Keyboard.LEFT:
    90. camera.pan += 2;
    91. break;
    92. case Keyboard.CONTROL:
    93. // 調整 camera 沿Z軸卷動的幅度
    94. camera.roll += 2;
    95. break;
    96. case Keyboard.PAGE_DOWN:
    97. // 調整 camera 鏡頭的遠近幅度
    98. camera.z -= 5;
    99. break;
    100. case Keyboard.PAGE_UP:
    101. camera.z += 5;
    102. break;
    103. }
    104. }
    105. }
    106. }

    產出:



    程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03

    2009年6月15日 星期一

    BIOS

    BIOS全名為基本輸入輸出系統(Basic Input Output System:BIOS),被歸類在韌體(Firmware)這一類,但若以任務導向來區分,BIOS比較偏向作業系統。

    BIOS的作用主要有四點:
  • 自動檢查及進行初始化
  • 記錄系統設定值
  • 中斷處理
  • 載入作業系統


  • 下圖為BIOS與各元件的關係圖:

    南北橋為主機板最重要的晶片組,北橋主要控制著CPU、記憶體;南橋負責PCI、PCI-E、USB、VGA等所有週邊相關設備。而在南橋裡有一個特殊區塊,負慣儲存CMOS的空白域,讓BIOS儲存使用者設定。

    當BIOS啟動時會先去確認CMOS中的資料是否正確,若正確,便會將之前使用者存在CMOS的資料,加上已存在或找到的硬體資訊,整合成為一個表格存入到憶體中,也就是所謂的SMBIOS。

    下圖為BIOS的啟動流程圖:

    在PowerOn階段,BIOS的主要工作是檢查主機上某些硬體的狀態以及存在於CMOS的設定。當BIOS讀取完CMOS中使用者之前已經設定好的設定值之後,接下來將會有一連串的硬體檢測動作,檢測記憶體的大小,此階段稱之為開機自我測試(Power On Self Test: POST)。當POST完成後,會將所有臨時使用的硬體其相關資訊儲存在記憶體的SMBIOS表格中,以供使用者或作業系統來對應使用。

    當一切都完成,BIOS要退居幕後時,會將載入作業系統的主控權交棒給硬碟內的主啟動磁區(Master Boot Record:MBR),也就是硬碟的第零軌,讓藏身於MBR中的開機管理程式可以將指標帶到系統核心的地方。進入Linux後的第一件事,就是將kernel載入到記憶體中,再將一支initrd也跟著丟進記憶體,取接著就可以進入使用者真正在使用的Linux作業系統。


    參考書目:邱世華.《Linux 作業系統之奧義》.稅知文化

    2009年6月11日 星期四

    Tutorial 02: 上色

    重點API
    sandy.materials.Appearance;
    sandy.materials.attributes.LightAttributes;
    sandy.materials.attributes.LineAttributes;
    sandy.materials.attributes.MaterialAttributes;
    sandy.materials.ColorMaterial;
    sandy.materials.Material;

    1. package
    2. {
    3. import flash.display.Sprite;
    4. import flash.events.Event;
    5. import flash.filters.ColorMatrixFilter;
    6. import sandy.core.Scene3D;
    7. import sandy.core.scenegraph.Camera3D;
    8. import sandy.core.scenegraph.Group;
    9. import sandy.core.scenegraph.Sprite3D;
    10. import sandy.materials.Appearance;
    11. import sandy.materials.attributes.LightAttributes;
    12. import sandy.materials.attributes.LineAttributes;
    13. import sandy.materials.attributes.MaterialAttributes;
    14. import sandy.materials.ColorMaterial;
    15. import sandy.materials.Material;
    16. import sandy.primitive.Box;
    17. public class Example002 extends Sprite
    18. {
    19. // 宣告3D場景及攝影機
    20. private var scene:Scene3D;
    21. private var camera:Camera3D;
    22. public function Example002()
    23. {
    24. camera = new Camera3D(300, 300);
    25. camera.z = -400;
    26. var root:Group = createScene();
    27. scene = new Scene3D("scene", this, camera, root);
    28. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    29. }
    30. private function createScene():Group
    31. {
    32. var g:Group = new Group();
    33. var box:Box = new Box("box", 100, 100, 100);
    34. // 產生材質屬性 MaterialAttributes
    35. // MaterialAttributes 可以擁有多個參數
    36. // 但每個參數都必需實作IAttributes這個介面
    37. // 而在 Sandy3D中,已經有3個類別實作了這個介面:
    38. // LineAttributes - 線屬性,其參數分別為厚度、顏色及透明度
    39. // LightAttributes- 燈光屬性,其參數分別為是否套用亮度設定及亮度的大小
    40. // 其值介於`0 ~ 1
    41. var materalAttr:MaterialAttributes = new MaterialAttributes(
    42. new LineAttributes(0.5, 0x2111BB, 0.4),
    43. new LightAttributes(true, 0.1)
    44. );
    45. // 產生色彩材質,並設定其屬性
    46. // 其參數分別為顏色、透明度及材質屬性
    47. var material:Material = new ColorMaterial(0xFFCC33, 1, materalAttr);
    48. // 設定此材質是否受外來光線影響
    49. material.lightingEnable = true;
    50. // 產生顯示物件的外觀物件
    51. // 其參數為材質,但可設定正面材質與背面材質
    52. var app:Appearance = new Appearance(material);
    53. // 將外觀物件套用到顯示物件 box
    54. box.appearance = app;
    55. box.rotateX 30;
    56. box.rotateY = 30;
    57. g.addChild(box);
    58. return g;
    59. }
    60. private function enterFrameHandler(evt:Event):void
    61. {
    62. scene.render();
    63. }
    64. }
    65. }


    產出:



    程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut02

    2009年6月9日 星期二

    常用Android指令

  • Android模擬器命令列啟動模式

  • 在android-sdk-windows-1.1\tools執行emulator以執行模擬器
    加上-skin參數,指定顯示模式為HVGA-L,則可轉為橫向
    emulator - skin HVGA-L (480*320,水平顯示)
    emulator - skin HVGA-P (320*480,垂直顯示,模擬器預設模式)
    emulator - skin HVGA-L (320*240,水平顯示)
    emulator - skin HVGA-P (240*320,垂直顯示)


  • 使用mksdcard指令模擬1GB的記憶卡

  • mksdcard 1024M sacard.img

  • 模擬插入 SD 卡的模擬器

  • emulator - sdcard sdcard.img

  • 使用 adb+push 上載檔案到SD記憶卡

  • adb push 001.jpg /sdcard (複製檔案到 /sdcard 目錄下)
    adb push pictures /sdcard (複製 picture 照片目錄到 /sdcard 目錄下)
    adb push mp3 /sdcard (複製 mp3 音樂目錄到 /sdcard 目錄下)
    adb shell (Android 模擬器啟動命令列模式)
    #cd /sdcard (進入 /sdcard 目錄)
    #ls (查看 SD 記憶卡中的檔案)


  • 使用 adb+pull 從 SD 記憶卡下載檔案

  • adb pull /sdcard/001.jpg . (下載 /sdcard 目錄下的檔案)
    adb pull /sdcard/pictures . (下載 sdcard 目錄下的 pictures 目錄)


  • 刪除 SD 卡裡面的檔案

  • adb shell
    #ced /sdcard
    #rm 001.jpg (刪除 SD 記憶卡裡的檔案)
    #rm -r * (刪除 SD 記憶卡裡所有檔案與目錄)


  • Android模擬器影片播放方法

  • mksdcard 4096M video.img (製作一個影像檔的 SD 記憶卡)
    adb push video.avi /sdcard (從電腦複製影像檔到 SD 卡中)
    emulator -sdcard video.img (啟動模擬器並載入 SD 卡)

    下載免費的影片播放軟體,ex: Meridian Video Player (iiivpa.apk)
    http://sites.google.com/site/eternalsandbox/Home/meridian-video-player
    adb install iiivpa.apk (安裝Meridian Video Player)
    接下來就可以用裝上去的player播放.mp4、3gp與.wmv三種檔案格式

  • 安裝 APK 應用程式

  • adb install filename.apk (安裝filename.apk)
    adb install -r filename.apk (保留已設定資料,重新安裝filename.apk)
    adb -s emulator-5554 install filename.apk (指定安裝 APK 套件在 5554 的 Android 模擬器中)


  • 移除 APK 應用程式

  • adb uninstall package
    adb uninstall -k package (移除程式時,保留資料)

    此package名稱不是安裝APK套裝時的檔名或顯示在模擬器中的應用程式名稱
    可以先到/data/data或data/app目錄下,查詢想移除的package名稱
    adb shell
    ls /data/data 或 /data/app (查詢 Package 名稱)
    exit
    adb uninstall package (移除查詢到的 Package)


  • ADB 系統除錯與連結工具

  • $adb devices (顯示目前有多少個模擬器正在執行)
    $adb -s <serialNumber> <command> (指定模擬器來操作)
    adb -s emulator-5554 install email.apk

    $adb install apkfile (安裝 APK 應用程式套件)
    adb install email.apk
    $adb uninstall package (移除 APK 應用程式套件)
    adb uninstall com.android.email

    $adb shell (進入 Android 系統指令列模式)
    $ls
    $dmesg (查看 Android Linux Kernel 運作訊息)

    ls - 顯示檔案目錄
    cd - 進入目錄
    rm - 刪除檔案
    mv - 移動檔案
    mkdir - 產生目錄
    rmdir - 刪除目錄

    $adb push <file/dir> (複製檔案到 SD 卡)
    adb push mp3 /sdcard
    $adb pull <file/dir> . (從 Android 系統下載檔案)
    adb pull /data/app/com.android.email

    $adb logcat (監控模擬器運作紀錄,以Ctrl + c 離開監控模式)
    $adb bugreport (產生 adb 除錯報告)
    $adb get-state (獲得 adb 伺服器運作狀態)
    $adb start-server (啟動 adb 伺服器)
    $adb kill-server (關掉 adb 伺服器)

    $adb forward tcp:6100 tcp:7100 (更改模擬器網路 TCP 通訊埠)
    $adb shell ps -x (顯示 Android 上所有正在執行的行程)
    $adb version (顯示 adb 版本)
    $adb help (顯示 adb 指令參數)

  • Emulator 命令列啟動參數

  • emulator -timezone Asia/Taipei (指定時區)
    emulator -no-boo-anim (省略開機小機器人動畫畫面)
    emulator -scale auto (調整模擬器視窗大小)
    emulator - scale factor (factor: 0.1-3.0)

    emulator -dpi-device 300 (更改模擬器的解析度,default為 165dpi)
    emulator -skin <skinID> (更改模擬器顯示模式)
    emulator -help-keys (顯示鍵盤快速鍵說明)
    emulator -shell (相當於adb shell 功能)
    emulator -data data.img (使 /data 目錄使用 data.img 的檔案空間)
    emulator -sdcard sdcard.img (使 /sdcard 目錄使用 sdcard.img 的檔案空間)
    emulator -cache cache.img (瀏覽器暫存檔儲存空間)

    emulator -wipe-data (使模擬器恢復到原廠設定)
    emulator -help (顯示 emulator 指令參數)