private void CalcuForNormal(IUserCmd cmd, PlayerEntity player, Vector3 archotRotation, CameraStateOutputNewComponent result) { DummyCameraMotorState.Convert(player.cameraStateNew, _state); DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput; _input.Generate(_context, player, cmd, archotRotation.y, archotRotation.x); for (int i = 0; i < (int)SubCameraMotorType.End; i++) { var type = (SubCameraMotorType)i; SetNextMotor(player, type, _state, _input); } CameraActionManager.OnAction(player, _state); player.cameraStateUpload.EnterActionCode = CameraActionManager.GetActionCode(CameraActionType.Enter); player.cameraStateUpload.LeaveActionCode = CameraActionManager.GetActionCode(CameraActionType.Leave); CameraActionManager.ClearActionCode(); player.cameraStateNew.CameraMotorInput = player.cameraStateNew.LastCameraMotorInput; player.cameraStateNew.LastCameraMotorInput = _input; CalcFinalOutput(player, (DummyCameraMotorInput)player.cameraStateNew.LastCameraMotorInput, result, _state); }
private void CalcFinalOutput(PlayerEntity player, DummyCameraMotorInput input, CameraStateOutputNewComponent finalOutput, DummyCameraMotorState state) { _output.Init(); _output.ArchorPosition = player.cameraArchor.ArchorPosition + player.cameraArchor.ArchorTransitionOffsetPosition; _output.ArchorEulerAngle = player.cameraArchor.ArchorEulerAngle; for (int i = 0; i < (int)SubCameraMotorType.End; i++) { var type = (SubCameraMotorType)i; _output.Append(CalcSubFinalCamera(player, input, state, _motors.GetDict(type), state.Get(type), player.time.ClientTime)); } finalOutput.ArchorPosition = _output.ArchorPosition; finalOutput.ArchorEulerAngle = _output.ArchorEulerAngle; finalOutput.ArchorOffset = _output.ArchorOffset; finalOutput.ArchorPostOffset = _output.ArchorPostOffset; finalOutput.EulerAngle = _output.EulerAngle; finalOutput.Offset = _output.Offset; finalOutput.PostOffset = _output.PostOffset; finalOutput.Fov = _output.Fov; finalOutput.Far = _output.Far; finalOutput.Near = _output.Near; finalOutput.NeedDetectDistance = !_output.ForbidDetect; SmoothFov(player, input.GetViewConfig()); }
private void CalcFinalOutput(PlayerEntity player, DummyCameraMotorInput input, CameraStateOutputNewComponent finalOutput, DummyCameraMotorState state) { player.cameraConfigNow.Config = state.GetMainConfig(); player.cameraConfigNow.PeekConfig = SingletonManager.Get <CameraConfigManager>().Config.PeekConfig; player.cameraConfigNow.DeadConfig = SingletonManager.Get <CameraConfigManager>().Config.DeadConfig; _output.Init(); _output.ArchorPosition = player.cameraArchor.ArchorPosition + player.cameraArchor.ArchorTransitionOffsetPosition; _output.ArchorEulerAngle = player.cameraArchor.ArchorEulerAngle; for (int i = 0; i < (int)SubCameraMotorType.End; i++) { var type = (SubCameraMotorType)i; _output.Append(CalcSubFinalCamera(player, input, state, _motors.GetDict(type), state.Get(type), player.time.ClientTime)); } finalOutput.ArchorPosition = _output.ArchorPosition; finalOutput.ArchorEulerAngle = _output.ArchorEulerAngle; finalOutput.ArchorOffset = _output.ArchorOffset; finalOutput.ArchorPostOffset = _output.ArchorPostOffset; finalOutput.EulerAngle = _output.EulerAngle; finalOutput.Offset = _output.Offset; finalOutput.PostOffset = _output.PostOffset; finalOutput.Fov = _output.Fov; finalOutput.Far = _output.Far; finalOutput.Near = _output.Near; SmoothFov(player); }
private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera, Vector3 punchRotation, PlayerEntity player, int curTime) { var doLag = !player.appearanceInterface.Appearance.IsFirstPerson; var realRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation); var postOffset = calsOut.ArchorPostOffset + calsOut.PostOffset; var realArchorOffset = calsOut.ArchorOffset; var realPostOffset = postOffset; var archorRotation = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0); //计算头顶位置 _archoroffsetArm.Offset = realArchorOffset / 2; var heightTestStart = calsOut.ArchorPosition + archorRotation * realArchorOffset / 2; _archoroffsetArm.Update(heightTestStart, archorRotation, curTime - LastTime, doLag, calsOut.NeedDetectDistance); realArchorOffset = _archoroffsetArm.LastLoc - calsOut.ArchorPosition; //计算锚点位置 _postOffsetArm.Offset = realPostOffset; _postOffsetArm.Update(_archoroffsetArm.LastLoc, archorRotation, curTime - LastTime, false, calsOut.NeedDetectDistance); realPostOffset = _postOffsetArm.LastLoc - _archoroffsetArm.LastLoc; var postOffsetFactor = Mathf.Max(realPostOffset.magnitude / postOffset.magnitude, 1); var startingPosition = calsOut.FinalArchorPosition = calsOut.ArchorPosition + postOffsetFactor * realArchorOffset + realPostOffset; //封闭建筑内拉近摄像机距离 // if(BuildingRestrictTest(calsOut, player)) // calsOut.Offset = calsOut.Offset.normalized * OffsetInBuilding; //相机位置计算 _offsetArm.Offset = calsOut.Offset; _offsetArm.Update(startingPosition, realRotation, curTime - LastTime, doLag, true); camera.PlayerFocusPosition = startingPosition; camera.Position = _offsetArm.LastLoc; camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation; camera.EulerAngle.x = YawPitchUtility.Normalize(camera.EulerAngle.x); camera.EulerAngle.y = YawPitchUtility.Normalize(camera.EulerAngle.y); camera.EulerAngle.z = YawPitchUtility.Normalize(camera.EulerAngle.z); camera.Fov = calsOut.Fov; camera.Far = calsOut.Far; camera.Near = calsOut.Near; #if UNITY_EDITOR var p1 = calsOut.ArchorPosition; var p2 = _archoroffsetArm.LastLoc; var p3 = startingPosition; var p4 = _offsetArm.LastLoc; Debug.DrawLine(p1, p2, Color.red); Debug.DrawLine(p2, p3, Color.green); Debug.DrawLine(p3, p4, Color.blue); #endif }
private void CalcuForObserving(IUserCmd cmd, PlayerEntity player, Vector3 archotRotation, CameraStateOutputNewComponent result) { DummyCameraMotorState.Convert(player.cameraStateNew, _dummyState); _dummyState.Dict[(int)SubCameraMotorType.View].NowMode = (byte)ECameraViewMode.ThirdPerson; _dummyState.Dict[(int)SubCameraMotorType.View].LastMode = (byte)ECameraViewMode.FirstPerson; DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput; _input.Generate(_context, player, cmd, archotRotation.y, archotRotation.x); CalcFinalOutput(player, _input, result, _dummyState); result.ArchorPosition = player.thirdPersonDataForObserving.ThirdPersonArchorPosition; }
private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera, Vector3 punchRotation, PlayerEntity player, bool doLag, int curTime) { var realRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation); var index = (player.gamePlay.JobAttribute == (int)EJobAttribute.EJob_Variant) ? 0.75f : 1f; var postOffset = calsOut.ArchorPostOffset + calsOut.PostOffset; var realArchorOffset = calsOut.ArchorOffset; var realPostOffset = postOffset; var archorRotation = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0); //计算头顶位置 _archoroffsetArm.Offset = realArchorOffset / 2 * index; var heightTestStart = calsOut.ArchorPosition + archorRotation * realArchorOffset / 2 * index; _archoroffsetArm.Update(heightTestStart, archorRotation, curTime - LastTime, doLag, calsOut.NeedDetectDistance); realArchorOffset = (_archoroffsetArm.LastLoc - calsOut.ArchorPosition); //计算锚点位置 _postOffsetArm.Offset = realPostOffset * index; _postOffsetArm.Update(_archoroffsetArm.LastLoc, archorRotation, curTime - LastTime, false, calsOut.NeedDetectDistance); realPostOffset = (_postOffsetArm.LastLoc - _archoroffsetArm.LastLoc); var postOffsetFactor = Mathf.Max(realPostOffset.magnitude / postOffset.magnitude, 1); var startingPosition = calsOut.FinalArchorPosition = calsOut.ArchorPosition + postOffsetFactor * realArchorOffset + realPostOffset; //相机位置计算 _offsetArm.Offset = calsOut.Offset * index; _offsetArm.Update(startingPosition, realRotation, curTime - LastTime, doLag, true); camera.PlayerFocusPosition = startingPosition; camera.Position = _offsetArm.LastLoc; camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation; camera.EulerAngle.x = YawPitchUtility.Normalize(camera.EulerAngle.x); camera.EulerAngle.y = YawPitchUtility.Normalize(camera.EulerAngle.y); camera.EulerAngle.z = YawPitchUtility.Normalize(camera.EulerAngle.z); camera.Fov = calsOut.Fov; camera.Far = calsOut.Far; camera.Near = calsOut.Near; #if UNITY_EDITOR var p1 = calsOut.ArchorPosition; var p2 = _archoroffsetArm.LastLoc; var p3 = startingPosition; var p4 = _offsetArm.LastLoc; Debug.DrawLine(p1, p2, Color.red); Debug.DrawLine(p2, p3, Color.green); Debug.DrawLine(p3, p4, Color.blue); #endif }
private static void CalcuFreeMoveEularAngle(FreeMoveEntity observedFreeMove, CameraFinalOutputNewComponent camera, CameraStateOutputNewComponent calsOut) { if (observedFreeMove.hasFreeMoveController && observedFreeMove.freeMoveController.ControllType == (byte)EFreeMoveControllType.FixFocusPos) { var aimAt = observedFreeMove.freeMoveController.FocusOnPosition.ShiftedVector3(); var vect = aimAt - observedFreeMove.position.Value; camera.EulerAngle = Quaternion.LookRotation(vect).eulerAngles; } else { camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle; } }
private bool BuildingRestrictTest(CameraStateOutputNewComponent calsOut, PlayerEntity player) { if (player.stateInterface.State.GetActionState() != ActionInConfig.Gliding && player.stateInterface.State.GetActionState() != ActionInConfig.Parachuting && player.gamePlay.GameState != Components.GameState.AirPlane) { var realHeight = HeightTest(player, MaxTestHeight); if (realHeight >= 0) { if (realHeight < MaxTestHeight) { return(true); } } } return(false); }
public bool TestArchorOffset(CameraStateOutputNewComponent calsOut, PlayerEntity player, ref Vector3 startPoint) { float radius = player.characterContoller.Value.radius; var center = calsOut.ArchorPosition + calsOut.ArchorOffset.normalized * (player.characterContoller.Value.height - radius); var direction = calsOut.ArchorOffset.normalized; var maxDistance = calsOut.ArchorOffset.magnitude - player.characterContoller.Value.height; RaycastHit hitInfo; if (Physics.CapsuleCast(center, center, radius, direction, out hitInfo, maxDistance)) { var realdict = hitInfo.distance; if (realdict <= maxDistance) { startPoint.y = hitInfo.point.y - calsOut.ArchorPosition.y - DistanceOffset; return(true); } } return(false); }
private void CalcuForNormal(IUserCmd cmd, PlayerEntity player, CameraStateOutputNewComponent result) { DummyCameraMotorState.Convert(player.cameraStateNew, _state); DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput; _input.Generate(player, cmd, _state, LockView); if (!HasConfigInitialed(_input)) { return; } for (int i = 0; i < (int)SubCameraMotorType.End; i++) { var type = (SubCameraMotorType)i; SetNextMotor(player, type, _state, _input); } HandleAction(player); _motors.ActionManager.ClearActionCode(); player.cameraStateNew.CameraMotorInput = player.cameraStateNew.LastCameraMotorInput; player.cameraStateNew.LastCameraMotorInput = _input; player.cameraConfigNow.Config = _input.GetPoseConfig(_state.GetMainMotor().NowMode); player.cameraConfigNow.PeekConfig = _input.GetPeekConfig(); player.cameraConfigNow.DeadConfig = _input.GetDeadConfig(); CalcFinalOutput(player, (DummyCameraMotorInput)player.cameraStateNew.LastCameraMotorInput, result, _state); DummyCameraMotorState.Convert(_state, player.cameraStateNew); player.cameraStateNew.CanFire = !_state.IsFree() && _input.GetPoseConfig(player.cameraStateNew.MainNowMode).CanFire; }
private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera, Vector3 punchRotation, PlayerEntity player) { Vector3 lToCamera = calsOut.Offset; var clientTime = player.time.ClientTime; float lNewDistance = lToCamera.magnitude; bool collided = false; var startingRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation); var realArchorStart = calsOut.ArchorOffset; if (player.stateInterface.State.GetActionState() != ActionInConfig.Gliding && player.stateInterface.State.GetActionState() != ActionInConfig.Parachuting && player.gamePlay.GameState != Components.GameState.AirPlane) { TestArchorOffset(calsOut, player, ref realArchorStart); } var archorRotation = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0); var postOffsetFactor = ActualStartingPosition( calsOut.ArchorPosition + archorRotation * realArchorStart, archorRotation, calsOut.ArchorPostOffset + calsOut.PostOffset, _collisionLayers); var startingPosition = calsOut.FinalArchorPosition = calsOut.ArchorPosition + archorRotation * (realArchorStart + calsOut.ArchorPostOffset * postOffsetFactor + calsOut.PostOffset * postOffsetFactor); float actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers); var factor = 1f; if (actualDistance < lNewDistance) { collided = true; if (actualDistance < _collisionOffsetStartDistance) { factor = Mathf.Lerp(_collisionOffsetStartDistance, actualDistance, actualDistance / lNewDistance) / lNewDistance; startingPosition = calsOut.ArchorPosition + archorRotation * (realArchorStart + calsOut.ArchorPostOffset * factor * postOffsetFactor + calsOut.PostOffset * postOffsetFactor * factor); actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers); if (actualDistance >= lNewDistance) { collided = false; } } } var finalPostOffset = calsOut.Offset.normalized * actualDistance; if (collided && !player.appearanceInterface.Appearance.IsFirstPerson) { camera.LastCollisionOffset = finalPostOffset; camera.LastCollisionTime = clientTime; } else if (clientTime - camera.LastCollisionTime < camera.PostTransitionTime && !player.appearanceInterface.Appearance.IsFirstPerson) { finalPostOffset = PositionLerp(camera.LastCollisionOffset, finalPostOffset, (float)(clientTime - camera.LastCollisionTime) / camera.PostTransitionTime); } camera.PlayerFocusPosition = startingPosition; camera.Position = startingPosition + startingRotation * (finalPostOffset); camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation; camera.EulerAngle.x = YawPitchUtility.Normalize(camera.EulerAngle.x); camera.EulerAngle.y = YawPitchUtility.Normalize(camera.EulerAngle.y); camera.EulerAngle.z = YawPitchUtility.Normalize(camera.EulerAngle.z); camera.Fov = calsOut.Fov; camera.Far = calsOut.Far; camera.Near = calsOut.Near; #if UNITY_EDITOR var p1 = calsOut.ArchorPosition; var p2 = calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset; var p3 = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor); var p4 = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor + calsOut.PostOffset * postOffsetFactor * factor); var p5 = p4 + startingRotation * (calsOut.Offset.normalized * actualDistance); Debug.DrawLine(p1, p2, Color.red); Debug.DrawLine(p2, p3, Color.green); Debug.DrawLine(p3, p4, Color.blue); Debug.DrawLine(p4, p5, Color.yellow); #endif }
private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera, Vector3 punchRotation) { Vector3 lToCamera = calsOut.Offset; float lNewDistance = lToCamera.magnitude; bool collided = false; var archorRotation = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0); var postOffsetFactor = ActualStartingPosition( calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset, archorRotation, calsOut.ArchorPostOffset + calsOut.PostOffset, _collisionLayers); var startingPosition = calsOut.FinalArchorPosition = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * postOffsetFactor + calsOut.PostOffset * postOffsetFactor); var startingRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation); float actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers); var factor = 1f; if (actualDistance < lNewDistance) { if (actualDistance < _collisionOffsetStartDistance) { factor = actualDistance / lNewDistance; startingPosition = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor + calsOut.PostOffset * postOffsetFactor * factor); actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers); } } camera.PlayerFocusPosition = startingPosition; camera.Position = startingPosition + startingRotation * (calsOut.Offset.normalized * actualDistance); camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation; camera.EulerAngle.x = YawPitchUtility.Normalize(camera.EulerAngle.x); camera.EulerAngle.y = YawPitchUtility.Normalize(camera.EulerAngle.y); camera.EulerAngle.z = YawPitchUtility.Normalize(camera.EulerAngle.z); camera.Fov = calsOut.Fov; camera.Far = calsOut.Far; camera.Near = calsOut.Near; #if UNITY_EDITOR var p1 = calsOut.ArchorPosition; var p2 = calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset; var p3 = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor); var p4 = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor + calsOut.PostOffset * postOffsetFactor * factor); var p5 = p4 + startingRotation * (calsOut.Offset.normalized * actualDistance); Debug.DrawLine(p1, p2, Color.red); Debug.DrawLine(p2, p3, Color.green); Debug.DrawLine(p3, p4, Color.blue); Debug.DrawLine(p4, p5, Color.yellow); #endif }