3
0

EntityLookAt.lua 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. --
  2. --
  3. -- Copyright (c) Contributors to the Open 3D Engine Project.
  4. -- For complete copyright and license terms please see the LICENSE at the root of this distribution.
  5. --
  6. -- SPDX-License-Identifier: Apache-2.0 OR MIT
  7. --
  8. --
  9. local EntityLookAt =
  10. {
  11. Properties =
  12. {
  13. EntityTargetToFace = {default=EntityId()},
  14. Advanced = {default="Edit this script to face a different axis towards the target"},
  15. },
  16. Handlers =
  17. {
  18. MyTransform = {},
  19. TargetTransform = {},
  20. }
  21. }
  22. function EntityLookAt:OnActivate()
  23. if self.Properties.EntityTargetToFace:IsValid() then
  24. -- cache properties
  25. local myTM = TransformBus.Event.GetWorldTM(self.entityId)
  26. self.myPos = myTM:GetPosition()
  27. self.targetPos = TransformBus.Event.GetWorldTranslation(self.Properties.EntityTargetToFace)
  28. self.myScale = myTM:RetrieveScale()
  29. self.readyForRotation = true
  30. --attach handlers
  31. self.myTransform = TransformNotificationBus.Connect(self.Handlers.MyTransform, self.entityId)
  32. self.targetTransform = TransformNotificationBus.Connect(self.Handlers.TargetTransform, self.Properties.EntityTargetToFace)
  33. self.Handlers.MyTransform.parent = self
  34. self.Handlers.TargetTransform.parent = self
  35. self:UpdateFacing()
  36. end
  37. end
  38. function EntityLookAt.Handlers.TargetTransform:OnTransformChanged(localTM, worldTM)
  39. local distance = self.parent.targetPos - worldTM:GetPosition()
  40. -- if our target has moved, Update our facing
  41. if not distance:IsZero(0.0001) then
  42. self.parent.targetPos = worldTM:GetPosition()
  43. self.parent:UpdateFacing()
  44. end
  45. end
  46. function EntityLookAt.Handlers.MyTransform:OnTransformChanged(localTM, worldTM)
  47. -- cache the scale
  48. self.parent.myScale = worldTM:RetrieveScale()
  49. local distance = self.parent.myPos - worldTM:GetPosition()
  50. -- if we've moved then update our facing
  51. if self.parent.readyForRotation then
  52. self.parent.myPos = worldTM:GetPosition()
  53. self.parent:UpdateFacing()
  54. end
  55. end
  56. function EntityLookAt:UpdateFacing()
  57. self.readyForRotation = false
  58. -- you can use Model Space relative AxisType's of
  59. -- YPositive : face directly at targetPos,
  60. -- YNegative : face directly away from targetPos,
  61. -- XPositive : "right shoulder" faces targetPos,
  62. -- XNegative : "left shoulder" faces targetPos,
  63. -- ZPositive : top faces targetPos
  64. -- ZNegative : bottom faces targetPos
  65. self.axisToFaceAtTarget = AxisType.YPositive
  66. local tm = MathUtils.CreateLookAt(self.myPos, self.targetPos, self.axisToFaceAtTarget)
  67. tm:MultiplyByScale(self.myScale)
  68. TransformBus.Event.SetWorldTM(self.entityId, tm)
  69. self.readyForRotation = true
  70. end
  71. function EntityLookAt:OnDeactivate()
  72. self.Handlers.MyTransform = {}
  73. self.Handlers.TargetTransform = {}
  74. self.myTransform = nil
  75. self.targetTransform = nil
  76. end
  77. return EntityLookAt