/src/away3d/controllers/LookAtController.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 136 lines · 95 code · 21 blank · 20 comment · 16 complexity · 9586a43b460595d9fb19185df685ca9c MD5 · raw file

  1. package away3d.controllers
  2. {
  3. import away3d.containers.*;
  4. import away3d.core.math.Matrix3DUtils;
  5. import away3d.entities.*;
  6. import away3d.events.*;
  7. import flash.geom.Matrix3D;
  8. import flash.geom.Vector3D;
  9. /**
  10. * Extended camera used to automatically look at a specified target object.
  11. *
  12. * @see away3d.containers.View3D
  13. */
  14. public class LookAtController extends ControllerBase
  15. {
  16. protected var _lookAtPosition:Vector3D;
  17. protected var _lookAtObject:ObjectContainer3D;
  18. protected var _origin:Vector3D = new Vector3D(0.0, 0.0, 0.0);
  19. protected var _upAxis:Vector3D = Vector3D.Y_AXIS;
  20. private var _pos:Vector3D = new Vector3D();
  21. /**
  22. * Creates a new <code>LookAtController</code> object.
  23. */
  24. public function LookAtController(targetObject:Entity = null, lookAtObject:ObjectContainer3D = null)
  25. {
  26. super(targetObject);
  27. if (lookAtObject)
  28. this.lookAtObject = lookAtObject;
  29. else
  30. this.lookAtPosition = new Vector3D();
  31. }
  32. /**
  33. * The vector representing the up direction of the target object.
  34. */
  35. public function get upAxis():Vector3D
  36. {
  37. return _upAxis;
  38. }
  39. public function set upAxis(upAxis:Vector3D):void
  40. {
  41. _upAxis = upAxis;
  42. notifyUpdate();
  43. }
  44. /**
  45. * The Vector3D object that the target looks at.
  46. */
  47. public function get lookAtPosition():Vector3D
  48. {
  49. return _lookAtPosition;
  50. }
  51. public function set lookAtPosition(val:Vector3D):void
  52. {
  53. if (_lookAtObject) {
  54. _lookAtObject.removeEventListener(Object3DEvent.SCENETRANSFORM_CHANGED, onLookAtObjectChanged);
  55. _lookAtObject = null;
  56. }
  57. _lookAtPosition = val;
  58. notifyUpdate();
  59. }
  60. /**
  61. * The 3d object that the target looks at.
  62. */
  63. public function get lookAtObject():ObjectContainer3D
  64. {
  65. return _lookAtObject;
  66. }
  67. public function set lookAtObject(val:ObjectContainer3D):void
  68. {
  69. if (_lookAtPosition)
  70. _lookAtPosition = null;
  71. if (_lookAtObject == val)
  72. return;
  73. if (_lookAtObject)
  74. _lookAtObject.removeEventListener(Object3DEvent.SCENETRANSFORM_CHANGED, onLookAtObjectChanged);
  75. _lookAtObject = val;
  76. if (_lookAtObject)
  77. _lookAtObject.addEventListener(Object3DEvent.SCENETRANSFORM_CHANGED, onLookAtObjectChanged);
  78. notifyUpdate();
  79. }
  80. /**
  81. * @inheritDoc
  82. */
  83. public override function update(interpolate:Boolean = true):void
  84. {
  85. interpolate = interpolate; // prevents unused warning
  86. if (_targetObject) {
  87. if (_lookAtPosition) {
  88. _targetObject.lookAt(_lookAtPosition, _upAxis);
  89. } else if (_lookAtObject) {
  90. if(_targetObject.parent && _lookAtObject.parent) {
  91. if(_targetObject.parent != _lookAtObject.parent) {// different spaces
  92. _pos.x = _lookAtObject.scenePosition.x;
  93. _pos.y = _lookAtObject.scenePosition.y;
  94. _pos.z = _lookAtObject.scenePosition.z;
  95. Matrix3DUtils.transformVector(_targetObject.parent.inverseSceneTransform, _pos, _pos);
  96. }else{//one parent
  97. Matrix3DUtils.getTranslation(_lookAtObject.transform, _pos);
  98. }
  99. }else if(_lookAtObject.scene){
  100. _pos.x = _lookAtObject.scenePosition.x;
  101. _pos.y = _lookAtObject.scenePosition.y;
  102. _pos.z = _lookAtObject.scenePosition.z;
  103. }else{
  104. Matrix3DUtils.getTranslation(_lookAtObject.transform, _pos);
  105. }
  106. _targetObject.lookAt(_pos, _upAxis);
  107. }
  108. }
  109. }
  110. private function onLookAtObjectChanged(event:Object3DEvent):void
  111. {
  112. notifyUpdate();
  113. }
  114. }
  115. }