7 static const float CONST_UD_MIN = -89.0;
8 static const float CONST_UD_MAX = 89.0;
10 static const float CONST_LR_MIN = -160.0;
11 static const float CONST_LR_MAX = 160.0;
14 void CharacterCamera3rdPersonBase(CameraHandlerComponent pCameraHandler)
20 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
22 super.OnActivate(pPrevCamera, pPrevCameraResult);
26 m_fShoulderLRPrefered = GetShoulderLastActive();
28 m_fFOVFilter = pPrevCameraResult.m_fFOV;
32 override void OnUpdate(
float pDt, out ScriptedCameraItemResult pOutResult)
34 pOutResult.m_fUseHeading = 1.0;
35 pOutResult.m_vBaseAngles = GetBaseAngles();
38 m_fFOV = GetBaseFOV();
41 vector lookAngles = m_CharacterHeadAimingComponent.GetLookAngles();
43 if (m_CharacterAnimationComponent.PhysicsIsLinked() && !m_CmdHandler.GetCommandLadder())
45 pOutResult.m_fUseHeading = 0.0;
47 if (!m_ControllerComponent.IsFreeLookEnabled())
49 lookAngles[0] = m_OwnerCharacter.GetAimRotationModel()[0] * Math.RAD2DEG;
53 if (!m_bIgnoreCharacterPitch)
54 lookAngles[1] = lookAngles[1] + m_OwnerCharacter.GetLocalYawPitchRoll()[1];
57 Math3D.AnglesToMatrix(lookAngles, pOutResult.m_CameraTM);
60 if (m_iBoneIndex != -1)
63 m_OwnerCharacter.GetAnimation().GetBoneMatrix(m_iBoneIndex, boneMatrix);
64 pOutResult.m_CameraTM[3] = boneMatrix[3];
68 pOutResult.m_CameraTM[3] =
"0 0 0";
72 float leaning = m_ControllerComponent.GetLeaning();
74 m_fShoulderLRPrefered = -1;
75 else if( leaning > 0.1 )
76 m_fShoulderLRPrefered = 1;
78 m_fShoulderLROffset = Math.SmoothCD(m_fShoulderLROffset, m_fShoulderLRPrefered, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
80 m_fLeaningOffset = m_ControllerComponent.GetCurrentLeanAmount();
81 float shoulderDist = GetShoulderDistance();
84 vector msOffset = m_CameraOffsetMS;
85 vector lsOffset = m_CameraOffsetLS;
88 lsOffset[0] = lsOffset[0] + shoulderDist;
92 msOffset[0] = msOffset[0] + shoulderDist;
96 m_CharacterAnimationComponent.PhysicsGetTransformLS(charMat);
99 vector velocity = m_CharacterAnimationComponent.PhysicsGetLocalVelocityXZ();
100 velocity = velocity.InvMultiply3(charMat);
101 for (
int i = 0; i < 3; i++)
103 velocity[i] = Math.Clamp(velocity[i], -m_vMaxVelocity[i], m_vMaxVelocity[i]);
105 m_v3rd_VelocityAdd += (velocity - m_v3rd_VelocityAdd) * pDt * 2;
107 msOffset = msOffset + m_v3rd_VelocityAdd * -0.05;
110 pOutResult.m_CameraTM[3] = pOutResult.m_CameraTM[3] + pOutResult.m_CameraTM[0] * lsOffset[0] + pOutResult.m_CameraTM[1] * lsOffset[1] + pOutResult.m_CameraTM[2] * lsOffset[2] + msOffset;
112 float currY = pOutResult.m_CameraTM[3][1];
113 if (m_fYoffsetPrevFrame == 0)
115 m_fYoffsetPrevFrame = currY;
117 m_fYoffsetPrevFrame = Math.Lerp(m_fYoffsetPrevFrame, currY, 0.01);
119 if (m_fYoffsetPrevFrame != 0)
121 yDelta = Math.Pow(currY/m_fYoffsetPrevFrame, 2);
124 pOutResult.m_CameraTM[3][1] = m_fYoffsetPrevFrame * yDelta;
126 m_fBobScale = m_CharacterCameraHandler.AddViewBobToTransform(pOutResult.m_CameraTM, 1,
true);
128 if(m_OwnerCharacter.GetAnimationComponent().IsRagdollActive())
131 pOutResult.m_iDirectBone = m_OwnerCharacter.GetAnimation().GetBoneIndex(
"Hips");
137 pOutResult.m_fShoulderDist = GetShoulderDistance();
138 pOutResult.m_fNearPlane = 0.04;
139 pOutResult.m_fPositionModelSpace = 1.0;
140 pOutResult.m_pWSAttachmentReference = null;
141 pOutResult.m_pOwner = m_OwnerCharacter;
143 m_fFOVFilter = Math.SmoothCD(m_fFOVFilter, pOutResult.m_fFOV, m_fFOVFilterVel, 0.2, 1000, pDt);
144 pOutResult.m_fFOV = m_fFOVFilter;
148 override float GetBaseFOV()
150 CameraManager cameraManager =
GetGame().GetCameraManager();
154 return cameraManager.GetThirdPersonFOV();
160 int GetActiveShoulder()
162 return m_fShoulderLRPrefered;
166 override float GetShoulderDistance()
168 return m_fShoulderLROffset * m_fShoulderWidth + m_fLeanDistance * m_fLeaningOffset;
ArmaReforgerScripted GetGame()
override void OnActivate()
vector m_v3rd_VelocityAdd
float m_fDistance
distance from start
vector m_CameraOffsetMS
model space offset
int m_iBoneIndex
runtime config
float m_fShoulderWidth
shoulder camera widths
float m_fYoffsetPrevFrame
LS Y offset of the camera in the past.
vector m_CameraOffsetLS
local space offset
float m_fLeaningOffsetVel
int m_fShoulderLRPrefered
bool m_bShoulderInLS
true - shoulder is in local space
float m_fCameraLRShoulderVel
float m_fShoulderLROffset