DayZ 1.28
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ OnUpdate()

override void OnUpdate ( float pDt,
out DayZPlayerCameraResult pOutResult )

get player transform

get vehicle and set it as ignore entity for camera collision solver

update camera offset

orientation LS

create LS lag from vehicle velocities

smooth it!

setup orientation

setup position

setup rest

См. определение в файле DayZPlayerCameraVehicles.c строка 89

90 {
92 vector playerTransformWS[4];
93 m_pPlayer.GetTransform(playerTransformWS);
94
96 IEntity vehicle = m_Transport;
97 pOutResult.m_CollisionIgnoreEntity = vehicle;
98
100 vector cameraPosition = vector.Zero;
101 if ( vehicle )
102 {
103 vector vehiclePositionWS = vehicle.GetOrigin();
104 vector vehiclePositionMS = vehiclePositionWS.InvMultiply4(playerTransformWS);
105 cameraPosition = vehiclePositionMS + m_CameraOffsetMS;
106 }
107
112
114 vector posDiffLS = vector.Zero;
115 vector rotDiffLS = vector.Zero;
116
117 vector rotWS = m_pPlayer.GetOrientation();
118 float maxRoll = 10;
119 rotWS[2] = Math.Clamp(rotWS[2], -maxRoll, maxRoll) / maxRoll;
120 rotWS[2] = rotWS[2] * rotWS[2] * rotWS[2];
121 rotWS[2] = rotWS[2] * maxRoll;
122 rotWS[2] = 0;
123
124 rotWS = rotWS * Math.DEG2RAD;
125
126 vector velocity = GetVelocity(vehicle);
127
128 if (vehicle)
129 {
130 vector posDiffWS = velocity * CONST_LINEAR_VELOCITY_STRENGTH;
131 posDiffLS = posDiffLS + posDiffWS.InvMultiply3(playerTransformWS);
132
134 rotDiffLS = rotDiffLS + rotDiffWS.InvMultiply3(playerTransformWS);
135
136 vector tempRot1 = rotDiffLS;
137 rotDiffLS[0] = tempRot1[1];
138 rotDiffLS[1] = tempRot1[2];
139 rotDiffLS[2] = tempRot1[0];
140
141 rotWS[0] = rotWS[0] + rotDiffLS[0];
142 rotWS[1] = rotWS[1] + rotDiffLS[1];
143 rotWS[2] = rotWS[2] + rotDiffLS[2];
144 }
145
147 m_LagOffsetPosition[0] = Math.SmoothCD(m_LagOffsetPosition[0], posDiffLS[0], m_fLagOffsetVelocityX, 0.3, 1000, pDt);
148 m_LagOffsetPosition[1] = Math.SmoothCD(m_LagOffsetPosition[1], posDiffLS[1], m_fLagOffsetVelocityY, 0.3, 1000, pDt);
149 m_LagOffsetPosition[2] = Math.SmoothCD(m_LagOffsetPosition[2], posDiffLS[2], m_fLagOffsetVelocityZ, 0.3, 1000, pDt);
150
154
157 if (vehicle)
158 {
159 vector rotTM[3];
160 Math3D.YawPitchRollMatrix(rot, rotTM);
161
162 Math3D.MatrixInvMultiply3(playerTransformWS, rotTM, rotTM);
163
164 // because we don't have m_fIgnoreParentYaw set
165 vector tempRot = Math3D.MatrixToAngles(rotTM);
166 rot[0] = tempRot[0];
167 }
168
169 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));
170 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));
171 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));
172
173 rot = GetCurrentOrientation() + rot;
174
175 float distance = m_fDistance;
176 distance -= (2 * Math.Clamp(Math.InverseLerp(UP_ANGLE_CAP * 0.5, CONST_UD_MAX, rot[1]), 0, 1));
177
178 if (rot[1] > UP_ANGLE_CAP)
179 {
180 rot[1] = UP_ANGLE_CAP;
181 }
182
183 Math3D.YawPitchRollMatrix(rot, pOutResult.m_CameraTM);
184
186 pOutResult.m_CameraTM[3] = cameraPosition - m_LagOffsetPosition;
187
189 pOutResult.m_fDistance = distance;
190 pOutResult.m_fUseHeading = 0.0;
191 pOutResult.m_fInsideCamera = 0.0;
192 pOutResult.m_fIgnoreParentRoll = 1.0;
193 pOutResult.m_fIgnoreParentPitch = 1.0;
194 //pOutResult.m_fIgnoreParentYaw = 1.0;
195 pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
196
197 StdFovUpdate(pDt, pOutResult);
198
199 super.OnUpdate(pDt, pOutResult);
200 }
float m_fLeftRightAngle
left right angle in rad (in freelook only)
Определения DayZPlayerCamera1stPerson.c:194
float m_fUpDownAngle
up down angle in rad
Определения DayZPlayerCamera1stPerson.c:192
static const float CONST_UD_MAX
up limit
Определения DayZPlayerCamera1stPerson.c:106
float m_fLeftRightAngleAdd
left right angle in rad (in freelook only)
Определения DayZPlayerCamera1stPerson.c:195
float m_fUpDownAngleAdd
up down angle in rad
Определения DayZPlayerCamera1stPerson.c:193
static const float CONST_LR_MIN
down limit
Определения DayZPlayerCamera1stPerson.c:108
static const float CONST_LR_MAX
up limit
Определения DayZPlayerCamera1stPerson.c:109
static const float CONST_UD_MIN
down limit
Определения DayZPlayerCamera1stPerson.c:105
vector m_CameraOffsetMS
model space offset
Определения DayZPlayerCamera3rdPerson.c:301
float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
Определения DayZPlayerCamera_Base.c:191
float m_CurrentCameraYaw
Определения DayZPlayerCamera_Base.c:562
float m_CurrentCameraPitch
Определения DayZPlayerCamera_Base.c:563
float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
Определения DayZPlayerCamera_Base.c:130
void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
Определения DayZPlayerCamera_Base.c:316
float m_CurrentCameraRoll
Определения DayZPlayerCamera_Base.c:564
vector m_LagOffsetOrientation
Определения DayZPlayerCameraVehicles.c:232
const float CONST_ANGULAR_LAG_ROLL_STRENGTH
Определения DayZPlayerCameraVehicles.c:32
const float CONST_ANGULAR_VELOCITY_STRENGTH
Определения DayZPlayerCameraVehicles.c:28
float m_fLagOffsetVelocityYaw[1]
Определения DayZPlayerCameraVehicles.c:236
const float UP_ANGLE_CAP
Определения DayZPlayerCameraVehicles.c:22
const float CONST_ANGULAR_LAG_PITCH_STRENGTH
Определения DayZPlayerCameraVehicles.c:31
vector m_LagOffsetPosition
lag offsets
Определения DayZPlayerCameraVehicles.c:231
float m_fLagOffsetVelocityPitch[1]
Определения DayZPlayerCameraVehicles.c:237
float m_fLagOffsetVelocityY[1]
Определения DayZPlayerCameraVehicles.c:234
float m_fLagOffsetVelocityRoll[1]
Определения DayZPlayerCameraVehicles.c:238
float m_fLagOffsetVelocityX[1]
Определения DayZPlayerCameraVehicles.c:233
const float CONST_ANGULAR_LAG_YAW_STRENGTH
Определения DayZPlayerCameraVehicles.c:30
Transport m_Transport
cache
Определения DayZPlayerCameraVehicles.c:241
float m_fLagOffsetVelocityZ[1]
Определения DayZPlayerCameraVehicles.c:235
const float CONST_LINEAR_VELOCITY_STRENGTH
Определения DayZPlayerCameraVehicles.c:27
proto native bool IsPhysicsExtrapolationEnabled()
If physics extrapolation is enabled, always true on retail release builds.
Определения EnEntity.c:165
Определения EnMath3D.c:28
Определения EnMath.c:7
proto vector InvMultiply4(vector mat[4])
Invert-transforms position.
static const vector Zero
Определения EnConvert.c:110
proto vector InvMultiply3(vector mat[3])
Invert-transforms vector.
Определения EnConvert.c:106
float m_fDistance
camera distance (external cameras only)
Определения dayzplayer.c:63
DayZPlayer m_pPlayer
data
Определения dayzplayer.c:135
vector GetCurrentOrientation()
Определения dayzplayer.c:112
proto native CGame GetGame()
proto native external vector GetOrigin()
Returns origin of Entity.
static proto vector MatrixToAngles(vector mat[3])
Returns angles of rotation matrix.
static proto void YawPitchRollMatrix(vector ang, out vector mat[3])
Creates rotation matrix from angles.
static proto void MatrixInvMultiply3(vector mat0[3], vector mat1[3], out vector res[3])
Invert-transforms rotation matrix.
static float SmoothCDPI2PI(float val, float target, inout float velocity[], float smoothTime, float maxVelocity, float dt)
Определения EnMath.c:680
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float InverseLerp(float a, float b, float value)
Calculates the linear value that produces the interpolant value within the range [a,...
static const float RAD2DEG
Определения EnMath.c:16
static const float DEG2RAD
Определения EnMath.c:17
static proto float AbsFloat(float f)
Returns absolute value.
static proto float SmoothCD(float val, float target, inout float velocity[], float smoothTime, float maxVelocity, float dt)
Does the CD smoothing function - easy in | easy out / S shaped smoothing.
proto native vector GetVelocity(notnull IEntity ent)
Returns linear velocity.
proto vector dBodyGetAngularVelocity(notnull IEntity body)
Gets angular velocity for a rigidbody.

Перекрестные ссылки Math::AbsFloat(), Math::Clamp(), CONST_ANGULAR_LAG_PITCH_STRENGTH, CONST_ANGULAR_LAG_ROLL_STRENGTH, CONST_ANGULAR_LAG_YAW_STRENGTH, CONST_ANGULAR_VELOCITY_STRENGTH, CONST_LINEAR_VELOCITY_STRENGTH, CONST_LR_MAX, CONST_LR_MIN, CONST_UD_MAX, CONST_UD_MIN, dBodyGetAngularVelocity(), Math::DEG2RAD, GetCurrentOrientation(), GetGame(), IEntity::GetOrigin(), GetVelocity(), Math::InverseLerp(), vector::InvMultiply3(), vector::InvMultiply4(), CGame::IsPhysicsExtrapolationEnabled(), m_CameraOffsetMS, m_CurrentCameraPitch, m_CurrentCameraRoll, m_CurrentCameraYaw, m_fDistance, m_fLagOffsetVelocityPitch, m_fLagOffsetVelocityRoll, m_fLagOffsetVelocityX, m_fLagOffsetVelocityY, m_fLagOffsetVelocityYaw, m_fLagOffsetVelocityZ, m_fLeftRightAngle, m_fLeftRightAngleAdd, m_fUpDownAngle, m_fUpDownAngleAdd, m_LagOffsetOrientation, m_LagOffsetPosition, m_pPlayer, m_Transport, Math3D::MatrixInvMultiply3(), Math3D::MatrixToAngles(), Math::RAD2DEG, Math::SmoothCD(), Math::SmoothCDPI2PI(), StdFovUpdate(), UP_ANGLE_CAP, UpdateLRAngleUnlocked(), UpdateUDAngleUnlocked(), Math3D::YawPitchRollMatrix() и vector::Zero.