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

沒有留言:

張貼留言