dayzplayercameravehicles.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // *************************************************************************************
  2. // ! DayZPlayerCamera1stPersonVehicle - first person in vehicle
  3. // *************************************************************************************
  4. class DayZPlayerCamera1stPersonVehicle extends DayZPlayerCamera1stPerson
  5. {
  6. override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
  7. {
  8. super.OnUpdate(pDt, pOutResult);
  9. pOutResult.m_fUseHeading = 0.0;
  10. pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
  11. }
  12. }
  13. // *************************************************************************************
  14. // ! DayZPlayerCamera3rdPersonVehicle - 3rd person in vehicle (generic)
  15. // *************************************************************************************
  16. class DayZPlayerCamera3rdPersonVehicle extends DayZPlayerCameraBase
  17. {
  18. static const float CONST_UD_MIN = -85.0; //!< down limit
  19. static const float CONST_UD_MAX = 85.0; //!< up limit
  20. const float UP_ANGLE_CAP = 10; // max up angle, doesnt require gamecode sync
  21. static const float CONST_LR_MIN = -160.0; //!< down limit
  22. static const float CONST_LR_MAX = 160.0; //!< up limit
  23. const float CONST_LINEAR_VELOCITY_STRENGTH = 0.025;
  24. const float CONST_ANGULAR_VELOCITY_STRENGTH = 0.025;
  25. const float CONST_ANGULAR_LAG_YAW_STRENGTH = 10.0;
  26. const float CONST_ANGULAR_LAG_PITCH_STRENGTH = 50.0;
  27. const float CONST_ANGULAR_LAG_ROLL_STRENGTH = 0.0;
  28. void DayZPlayerCamera3rdPersonVehicle( DayZPlayer pPlayer, HumanInputController pInput )
  29. {
  30. //Print("new camera: DayZPlayerCamera3rdPersonVehicle");
  31. m_fDistance = 4.0;
  32. m_CameraOffsetMS = "0.0 1.3 0.0";
  33. HumanCommandVehicle vehicleCommand = pPlayer.GetCommand_Vehicle();
  34. if ( vehicleCommand )
  35. {
  36. Transport transport = vehicleCommand.GetTransport();
  37. if ( transport )
  38. {
  39. m_Transport = transport;
  40. m_fDistance = transport.GetTransportCameraDistance();
  41. m_CameraOffsetMS = transport.GetTransportCameraOffset();
  42. }
  43. }
  44. }
  45. override void OnActivate( DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult )
  46. {
  47. if (pPrevCamera)
  48. {
  49. vector baseAngles = pPrevCamera.GetBaseAngles();
  50. m_fUpDownAngle = baseAngles[0];
  51. m_fLeftRightAngle = baseAngles[1];
  52. vector addAngles = pPrevCamera.GetAdditiveAngles();
  53. m_fUpDownAngleAdd = addAngles[0];
  54. m_fLeftRightAngleAdd = addAngles[1];
  55. }
  56. m_LagOffsetPosition = vector.Zero;
  57. m_fLagOffsetVelocityX[0] = 0;
  58. m_fLagOffsetVelocityY[0] = 0;
  59. m_fLagOffsetVelocityZ[0] = 0;
  60. }
  61. override void OnUpdate( float pDt, out DayZPlayerCameraResult pOutResult )
  62. {
  63. //! get player transform
  64. vector playerTransformWS[4];
  65. m_pPlayer.GetTransform(playerTransformWS);
  66. //! get vehicle and set it as ignore entity for camera collision solver
  67. IEntity vehicle = m_Transport;
  68. pOutResult.m_CollisionIgnoreEntity = vehicle;
  69. //! update camera offset
  70. vector cameraPosition = vector.Zero;
  71. if ( vehicle )
  72. {
  73. vector vehiclePositionWS = vehicle.GetOrigin();
  74. vector vehiclePositionMS = vehiclePositionWS.InvMultiply4(playerTransformWS);
  75. cameraPosition = vehiclePositionMS + m_CameraOffsetMS;
  76. }
  77. //! orientation LS
  78. m_CurrentCameraYaw = UpdateLRAngleUnlocked(m_fLeftRightAngle, m_fLeftRightAngleAdd, CONST_LR_MIN, CONST_LR_MAX, pDt);
  79. m_CurrentCameraPitch = UpdateUDAngleUnlocked(m_fUpDownAngle, m_fUpDownAngleAdd, CONST_UD_MIN, CONST_UD_MAX, pDt);
  80. m_CurrentCameraRoll = 0;
  81. //! create LS lag from vehicle velocities
  82. vector posDiffLS = vector.Zero;
  83. vector rotDiffLS = vector.Zero;
  84. vector orientVeh = vector.Zero;
  85. if (vehicle)
  86. {
  87. vector posDiffWS = GetVelocity(vehicle) * CONST_LINEAR_VELOCITY_STRENGTH;
  88. posDiffLS = posDiffWS.InvMultiply3(playerTransformWS);
  89. vector rotDiffWS = dBodyGetAngularVelocity(vehicle) * Math.RAD2DEG * CONST_ANGULAR_VELOCITY_STRENGTH;
  90. rotDiffLS = rotDiffWS.InvMultiply3(playerTransformWS);
  91. orientVeh = m_Transport.GetOrientation() * Math.DEG2RAD;
  92. }
  93. //! smooth it!
  94. m_LagOffsetPosition[0] = Math.SmoothCD(m_LagOffsetPosition[0], posDiffLS[0], m_fLagOffsetVelocityX, 0.3, 1000, pDt);
  95. m_LagOffsetPosition[1] = Math.SmoothCD(m_LagOffsetPosition[1], posDiffLS[1], m_fLagOffsetVelocityY, 0.3, 1000, pDt);
  96. m_LagOffsetPosition[2] = Math.SmoothCD(m_LagOffsetPosition[2], posDiffLS[2], m_fLagOffsetVelocityZ, 0.3, 1000, pDt);
  97. m_LagOffsetOrientation[0] = Math.SmoothCD(m_LagOffsetOrientation[0], rotDiffLS[1], m_fLagOffsetVelocityYaw, 0.3, 1000, pDt);
  98. m_LagOffsetOrientation[1] = Math.SmoothCDPI2PI(m_LagOffsetOrientation[1], orientVeh[1], m_fLagOffsetVelocityPitch, 0.3, 1000, pDt);
  99. m_LagOffsetOrientation[2] = Math.SmoothCD(m_LagOffsetOrientation[2], rotDiffLS[0], m_fLagOffsetVelocityRoll, 0.3, 1000, pDt);
  100. //! setup orientation
  101. vector rot;
  102. rot[0] = m_LagOffsetOrientation[0] * CONST_ANGULAR_LAG_YAW_STRENGTH;
  103. rot[1] = m_LagOffsetOrientation[1] * CONST_ANGULAR_LAG_PITCH_STRENGTH;
  104. rot[2] = m_LagOffsetOrientation[2] * CONST_ANGULAR_LAG_ROLL_STRENGTH;
  105. float distance = m_fDistance;
  106. if (m_CurrentCameraPitch > UP_ANGLE_CAP) // restrict moving camera below surface level
  107. {
  108. vector clamped = GetCurrentOrientation() + rot;
  109. clamped[1] = UP_ANGLE_CAP;
  110. Math3D.YawPitchRollMatrix(clamped, pOutResult.m_CameraTM);
  111. distance = m_fDistance - (2 * Math.InverseLerp(UP_ANGLE_CAP, CONST_UD_MAX, m_CurrentCameraPitch));
  112. }
  113. else
  114. Math3D.YawPitchRollMatrix(GetCurrentOrientation() + rot, pOutResult.m_CameraTM);
  115. //! setup position
  116. pOutResult.m_CameraTM[3] = cameraPosition - m_LagOffsetPosition;
  117. //! setup rest
  118. pOutResult.m_fDistance = distance;
  119. pOutResult.m_fUseHeading = 0.0;
  120. pOutResult.m_fInsideCamera = 0.0;
  121. pOutResult.m_fIgnoreParentRoll = 1.0;
  122. pOutResult.m_fIgnoreParentPitch = 1.0;
  123. pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
  124. StdFovUpdate(pDt, pOutResult);
  125. super.OnUpdate(pDt, pOutResult);
  126. }
  127. override vector GetBaseAngles()
  128. {
  129. vector a;
  130. a[0] = m_fUpDownAngle;
  131. a[1] = m_fLeftRightAngle;
  132. a[2] = 0;
  133. return a;
  134. }
  135. override vector GetAdditiveAngles()
  136. {
  137. vector a;
  138. a[0] = m_fUpDownAngleAdd;
  139. a[1] = m_fLeftRightAngleAdd;
  140. a[2] = 0;
  141. return a;
  142. }
  143. //! runtime config
  144. protected vector m_CameraOffsetMS; //!< model space offset
  145. protected float m_fDistance; //!< distance from start
  146. //! runtime values
  147. protected float m_fUpDownAngle; //!< up down angle in rad
  148. protected float m_fUpDownAngleAdd; //!< up down angle in rad
  149. protected float m_fLeftRightAngle; //!< left right angle in rad
  150. protected float m_fLeftRightAngleAdd; //!< left right angle in rad
  151. //! lag offsets
  152. protected vector m_LagOffsetPosition;
  153. protected vector m_LagOffsetOrientation;
  154. protected float m_fLagOffsetVelocityX[1];
  155. protected float m_fLagOffsetVelocityY[1];
  156. protected float m_fLagOffsetVelocityZ[1];
  157. protected float m_fLagOffsetVelocityYaw[1];
  158. protected float m_fLagOffsetVelocityPitch[1];
  159. protected float m_fLagOffsetVelocityRoll[1];
  160. //! cache
  161. protected Transport m_Transport;
  162. }