dayzplayercameravehicles.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 = 4.0;
  26. const float CONST_ANGULAR_LAG_PITCH_STRENGTH = 1.5;
  27. const float CONST_ANGULAR_LAG_ROLL_STRENGTH = 0.5;
  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. m_fLagOffsetVelocityYaw[0] = 0;
  61. m_fLagOffsetVelocityPitch[0] = 0;
  62. m_fLagOffsetVelocityRoll[0] = 0;
  63. m_LagOffsetOrientation[0] = 0;
  64. m_LagOffsetOrientation[1] = 0;
  65. m_LagOffsetOrientation[2] = 0;
  66. if (m_pPlayer)
  67. {
  68. vector rotDiffLS = m_pPlayer.GetOrientation() * Math.DEG2RAD;
  69. m_LagOffsetOrientation[0] = rotDiffLS[0];
  70. m_LagOffsetOrientation[1] = rotDiffLS[1];
  71. m_LagOffsetOrientation[2] = rotDiffLS[2];
  72. }
  73. }
  74. override void OnUpdate( float pDt, out DayZPlayerCameraResult pOutResult )
  75. {
  76. //! get player transform
  77. vector playerTransformWS[4];
  78. m_pPlayer.GetTransform(playerTransformWS);
  79. //! get vehicle and set it as ignore entity for camera collision solver
  80. IEntity vehicle = m_Transport;
  81. pOutResult.m_CollisionIgnoreEntity = vehicle;
  82. //! update camera offset
  83. vector cameraPosition = vector.Zero;
  84. if ( vehicle )
  85. {
  86. vector vehiclePositionWS = vehicle.GetOrigin();
  87. vector vehiclePositionMS = vehiclePositionWS.InvMultiply4(playerTransformWS);
  88. cameraPosition = vehiclePositionMS + m_CameraOffsetMS;
  89. }
  90. //! orientation LS
  91. m_CurrentCameraYaw = UpdateLRAngleUnlocked(m_fLeftRightAngle, m_fLeftRightAngleAdd, CONST_LR_MIN, CONST_LR_MAX, pDt);
  92. m_CurrentCameraPitch = UpdateUDAngleUnlocked(m_fUpDownAngle, m_fUpDownAngleAdd, CONST_UD_MIN, CONST_UD_MAX, pDt);
  93. m_CurrentCameraRoll = 0;
  94. //! create LS lag from vehicle velocities
  95. vector posDiffLS = vector.Zero;
  96. vector rotDiffLS = vector.Zero;
  97. vector rotWS = m_pPlayer.GetOrientation();
  98. float maxRoll = 10;
  99. rotWS[2] = Math.Clamp(rotWS[2], -maxRoll, maxRoll) / maxRoll;
  100. rotWS[2] = rotWS[2] * rotWS[2] * rotWS[2];
  101. rotWS[2] = rotWS[2] * maxRoll;
  102. rotWS[2] = 0;
  103. rotWS = rotWS * Math.DEG2RAD;
  104. vector velocity = GetVelocity(vehicle);
  105. if (vehicle)
  106. {
  107. vector posDiffWS = velocity * CONST_LINEAR_VELOCITY_STRENGTH;
  108. posDiffLS = posDiffLS + posDiffWS.InvMultiply3(playerTransformWS);
  109. vector rotDiffWS = dBodyGetAngularVelocity(vehicle) * CONST_ANGULAR_VELOCITY_STRENGTH;
  110. rotDiffLS = rotDiffLS + rotDiffWS.InvMultiply3(playerTransformWS);
  111. vector tempRot1 = rotDiffLS;
  112. rotDiffLS[0] = tempRot1[1];
  113. rotDiffLS[1] = tempRot1[2];
  114. rotDiffLS[2] = tempRot1[0];
  115. rotWS[0] = rotWS[0] + rotDiffLS[0];
  116. rotWS[1] = rotWS[1] + rotDiffLS[1];
  117. rotWS[2] = rotWS[2] + rotDiffLS[2];
  118. }
  119. //! smooth it!
  120. m_LagOffsetPosition[0] = Math.SmoothCD(m_LagOffsetPosition[0], posDiffLS[0], m_fLagOffsetVelocityX, 0.3, 1000, pDt);
  121. m_LagOffsetPosition[1] = Math.SmoothCD(m_LagOffsetPosition[1], posDiffLS[1], m_fLagOffsetVelocityY, 0.3, 1000, pDt);
  122. m_LagOffsetPosition[2] = Math.SmoothCD(m_LagOffsetPosition[2], posDiffLS[2], m_fLagOffsetVelocityZ, 0.3, 1000, pDt);
  123. m_LagOffsetOrientation[0] = Math.SmoothCDPI2PI(m_LagOffsetOrientation[0], rotWS[0], m_fLagOffsetVelocityYaw, 0.3, 1000, pDt);
  124. m_LagOffsetOrientation[1] = Math.SmoothCDPI2PI(m_LagOffsetOrientation[1], rotWS[1], m_fLagOffsetVelocityPitch, 0.3, 1000, pDt);
  125. m_LagOffsetOrientation[2] = Math.SmoothCDPI2PI(m_LagOffsetOrientation[2], rotWS[2], m_fLagOffsetVelocityRoll, 0.3, 1000, pDt);
  126. //! setup orientation
  127. vector rot = m_LagOffsetOrientation * Math.RAD2DEG;
  128. if (vehicle)
  129. {
  130. vector rotTM[3];
  131. Math3D.YawPitchRollMatrix(rot, rotTM);
  132. Math3D.MatrixInvMultiply3(playerTransformWS, rotTM, rotTM);
  133. // because we don't have m_fIgnoreParentYaw set
  134. vector tempRot = Math3D.MatrixToAngles(rotTM);
  135. rot[0] = tempRot[0];
  136. }
  137. rot[0] = rot[0] * (1.0 + (Math.InverseLerp(0.0, 1.0 + CONST_ANGULAR_LAG_YAW_STRENGTH, Math.AbsFloat(rotDiffLS[0])) * CONST_ANGULAR_LAG_YAW_STRENGTH));
  138. rot[1] = rot[1] * (1.0 + (Math.InverseLerp(0.0, 1.0 + CONST_ANGULAR_LAG_PITCH_STRENGTH, Math.AbsFloat(rotDiffLS[1])) * CONST_ANGULAR_LAG_PITCH_STRENGTH));
  139. rot[2] = rot[2] * (1.0 + (Math.InverseLerp(0.0, 1.0 + CONST_ANGULAR_LAG_ROLL_STRENGTH, Math.AbsFloat(rotDiffLS[2])) * CONST_ANGULAR_LAG_ROLL_STRENGTH));
  140. rot = GetCurrentOrientation() + rot;
  141. float distance = m_fDistance;
  142. distance -= (2 * Math.Clamp(Math.InverseLerp(UP_ANGLE_CAP * 0.5, CONST_UD_MAX, rot[1]), 0, 1));
  143. if (rot[1] > UP_ANGLE_CAP)
  144. {
  145. rot[1] = UP_ANGLE_CAP;
  146. }
  147. Math3D.YawPitchRollMatrix(rot, pOutResult.m_CameraTM);
  148. //! setup position
  149. pOutResult.m_CameraTM[3] = cameraPosition - m_LagOffsetPosition;
  150. //! setup rest
  151. pOutResult.m_fDistance = distance;
  152. pOutResult.m_fUseHeading = 0.0;
  153. pOutResult.m_fInsideCamera = 0.0;
  154. pOutResult.m_fIgnoreParentRoll = 1.0;
  155. pOutResult.m_fIgnoreParentPitch = 1.0;
  156. //pOutResult.m_fIgnoreParentYaw = 1.0;
  157. pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
  158. StdFovUpdate(pDt, pOutResult);
  159. super.OnUpdate(pDt, pOutResult);
  160. }
  161. override vector GetBaseAngles()
  162. {
  163. vector a;
  164. a[0] = m_fUpDownAngle;
  165. a[1] = m_fLeftRightAngle;
  166. a[2] = 0;
  167. return a;
  168. }
  169. override vector GetAdditiveAngles()
  170. {
  171. vector a;
  172. a[0] = m_fUpDownAngleAdd;
  173. a[1] = m_fLeftRightAngleAdd;
  174. a[2] = 0;
  175. return a;
  176. }
  177. //! runtime config
  178. protected vector m_CameraOffsetMS; //!< model space offset
  179. protected float m_fDistance; //!< distance from start
  180. //! runtime values
  181. protected float m_fUpDownAngle; //!< up down angle in rad
  182. protected float m_fUpDownAngleAdd; //!< up down angle in rad
  183. protected float m_fLeftRightAngle; //!< left right angle in rad
  184. protected float m_fLeftRightAngleAdd; //!< left right angle in rad
  185. //! lag offsets
  186. protected vector m_LagOffsetPosition;
  187. protected vector m_LagOffsetOrientation;
  188. protected float m_fLagOffsetVelocityX[1];
  189. protected float m_fLagOffsetVelocityY[1];
  190. protected float m_fLagOffsetVelocityZ[1];
  191. protected float m_fLagOffsetVelocityYaw[1];
  192. protected float m_fLagOffsetVelocityPitch[1];
  193. protected float m_fLagOffsetVelocityRoll[1];
  194. //! cache
  195. protected Transport m_Transport;
  196. }