/// <summary> /// Initializes a new instance. /// </summary> /// <param name="position">Indicates the position of the gear cylinder (front, left, right).</param> /// <param name="startState">Indicates the initital state of the gear cylinder.</param> public GearCylinder(Position position, GearStates startState) : base(position) { _stateMachine = startState; GearCylinderIsStuckFault.Name = $"{Position}GearCylinderIsStuck"; _latchingBoxExtended = new LatchingBox(8, 4, $"{Position}GearCylinderLatchingBoxExtended"); _latchingBoxRetracted = new LatchingBox(8, 4, $"{Position}GearCylinderLatchingBoxRetracted"); }
void UpdateAero() { if (previousState != CurrentState) { if (CurrentState == GearStates.Retracted || CurrentState == GearStates.Deployed) { part.dragModel = CurrentState == GearStates.Deployed ? Part.DragModel.DEFAULT : Part.DragModel.NONE; StartCoroutine(DelayedMeshUpdate()); } } previousState = CurrentState; }
public GearCylinderIsStuckFaultEffect(Position position, GearStates start) : base(position, start) { }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="startState">Indicates the initial state of the gears.</param> public MechanicalPartPlants(GearStates startState) { GearFront = new Gear(Position.Front, startState); GearLeft = new Gear(Position.Left, startState); GearRight = new Gear(Position.Right, startState); }
public void FixedUpdate() { float negTiltAngleAdjust = (legAngle < 0) ? 180 : 0; if (transformsToMirror != string.Empty) { if (isMirrored) { foreach (var t in transformsToMirrorList) { t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 180 - negTiltAngleAdjust, t.localRotation.eulerAngles.z); } } else { foreach (var t in transformsToMirrorList) { t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 0 + negTiltAngleAdjust, t.localRotation.eulerAngles.z); } } } if (mirrorRetractedWheel && isMirrored) { retractedWheelTargetTransform.localRotation = Quaternion.Euler(retractedWheelTargetTransform.localRotation.x, retractedWheelTargetTransform.localRotation.y, 180); } wheelColliderHolderTransform.localRotation = wheelHingeTransform.localRotation; //scene specific stuff if (HighLogic.LoadedSceneIsEditor) { tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward); wheelHeight = Mathf.Clamp(wheelHeight, minHeight, maxHeight); wheelColliderHolderTransform.localPosition = new Vector3(0, 0, -wheelHeight); deployedWheelTargetTransform.localPosition = new Vector3(0, 0, -wheelHeight); //wheel angle target stuff float wlocalYrot = isMirrored ? wheelAngle : -wheelAngle; float wlocalZrot = isMirrored && mirrorDeployedWheel ? 180 : 0; deployedWheelTargetTransform.localRotation = Quaternion.Euler(0, wlocalYrot, wlocalZrot); //leg angle target stuff float legLocalXrot = 270 + legAngle; float legLocalYrot = 0; float legLocalZrot = 0; if (legAngle != 0) { legLocalYrot = isMirrored ? 270 : 90; legLocalZrot = isMirrored ? 90 : 270; } tiltTargetTransform.localRotation = Quaternion.Euler(legLocalXrot, legLocalYrot, legLocalZrot); //scale transform.localScale = algScale * Vector3.one; } else { if (CurrentState == GearStates.Deployed) { tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward); /* * foreach(WheelCollider wheelCollider in part.FindModelComponents<WheelCollider>()) * { * suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight; * wheelCollider.suspensionDistance = suspensionDistance; * jointSpring.spring = suspensionSpring; * jointSpring.damper = suspensionDamper; * jointSpring.targetPosition = wheelCollider.suspensionSpring.targetPosition; * wheelCollider.suspensionSpring = jointSpring; * //wheelCollider.brakeTorque = brakeTorque; * } */ //set wheel collider values for (int i = 0; i < wheelColliders.Length; i++) { suspensionDistance = Mathf.Cos(tiltAngleP * Mathf.Deg2Rad) * wheelHeight; wheelColliders[i].suspensionDistance = suspensionDistance; jointSpring.spring = suspensionSpring; jointSpring.damper = suspensionDamper; jointSpring.targetPosition = wheelColliders[i].suspensionSpring.targetPosition; wheelColliders[i].suspensionSpring = jointSpring; } float mirrorMult = isMirrored ? 1 : -1; float m = wheelHeight * Mathf.Sin(tiltAngleP * Mathf.Deg2Rad); float localX = m * Mathf.Cos(tiltAngleP * Mathf.Deg2Rad) * mirrorMult; float localZ = -(m * Mathf.Sin(tiltAngleP * Mathf.Deg2Rad)); wheelColliderHolderTransform.localPosition = new Vector3(localX, 0, localZ); } else { /* * foreach(var wheelCollider in part.FindModelComponents<WheelCollider>()) * { * wheelCollider.suspensionDistance = 0; * } */ for (int i = 0; i < wheelColliders.Length; i++) { wheelColliders[i].suspensionDistance = 0; } wheelColliderHolderTransform.localPosition = Mathf.Clamp01((currentNormTime - stageNormTime) / (1 - stageNormTime)) * new Vector3(0, 0, -wheelHeight); } } //get animation normalized time and current state float animNormTime = 0; if (!hasLoaded) { //emptyAnimation.Stop(); anim.normalizedTime = animNormTimeP; hasLoaded = true; } else { animNormTimeP = anim.normalizedTime; animSpeedP = anim.speed; } deployTime = anim.length; anim.normalizedTime = Mathf.Clamp01(anim.normalizedTime); if (emptyAnimation.isPlaying) { animNormTime = 1 - anim.normalizedTime; } for (int i = 0; i < wheelColliders.Length; i++) { if (animNormTime < 0.2f && CurrentState != GearStates.Deployed) { wheelColliders[i].radius = 0.0001f; } else { wheelColliders[i].radius = wheelRadius; } } if (animNormTime == 0 && !emptyAnimation.isPlaying) { CurrentState = TargetState; } else if (anim.speed < 0) { TargetState = GearStates.Deployed; CurrentState = GearStates.Deploying; } else if (anim.speed > 0) { TargetState = GearStates.Retracted; CurrentState = GearStates.Retracting; } Steering(); UpdateDoors(); doorsNormTime = (90 / doorSpeed) / deployTime; deployTime -= 90 / doorSpeed; UpdateGear(); UpdateWheelAlignment(); SavePosAndRot(); }
public override void OnStart(PartModule.StartState state) { base.OnStart(state); emptyAnimation = part.FindModelAnimators(animationName)[0]; anim = emptyAnimation[animationName]; //set max and min for wheel height var wheelHeightTweakable = (UI_FloatRange)Fields["wheelHeight"].uiControlEditor; wheelHeightTweakable.maxValue = maxHeight; wheelHeightTweakable.minValue = minHeight; //set max wheelAngle tweakable var wheelAngleTweakable = (UI_FloatRange)Fields["wheelAngle"].uiControlEditor; wheelAngleTweakable.maxValue = maxWheelAngle; wheelAngleTweakable.minValue = 0; //set min/max leg tilt tweakable var tiltAngleTweakable = (UI_FloatRange)Fields["legAngle"].uiControlEditor; tiltAngleTweakable.maxValue = maxTilt; tiltAngleTweakable.minValue = minTilt; //set max brakeTorque tweakable var brakeTorqueTweakable = (UI_FloatRange)Fields["brakeTorque"].uiControlEditor; brakeTorqueTweakable.maxValue = maxBrakeTorque; //tiltTransforms tiltTransform = part.FindModelTransform(tiltTransformName); tiltTargetTransform = part.FindModelTransform(tiltTargetTransformName); tiltRetractTargetTransform = part.FindModelTransform(tiltRetractTargetTransformName); //deployTransforms deployTransform = part.FindModelTransform(deployTransformName); deployTargetTransform = part.FindModelTransform(deployTargetTransformName); retractTargetTransform = part.FindModelTransform(retractTargetTransformName); //wheelTransforms wheelHingeTransform = part.FindModelTransform(wheelHingeTransformName); retractedWheelTargetTransform = part.FindModelTransform(retractedWheelTargetTransformName); deployedWheelTargetTransform = part.FindModelTransform(deployedWheelTargetTransformName); wheelColliderTarget = part.FindModelTransform(wheelColliderTargetName); wheelColliderHolderTransform = part.FindModelTransform("wheelColliderHolder"); wheelAlignmentTransform = part.FindModelTransform(wheelAlignmentTransformName); if (canSteer) { steeringTransform = part.FindModelTransform(steeringTransformName); } initialHeight = Vector3.Distance(deployedWheelTargetTransform.localPosition, retractedWheelTargetTransform.localPosition); SetUpDoors(); if (animSpeedP > 0) { animNormTimeP = 1; } else if (animSpeedP < 0) { animNormTimeP = 0; } anim.normalizedTime = animNormTimeP; float animNormTime = 1 - animNormTimeP; animNormTime = Mathf.Clamp01(animNormTime); if (animNormTime >= 1) { CurrentState = GearStates.Deployed; } else if (animNormTime <= 0) { CurrentState = GearStates.Retracted; } else if (anim.speed < 0) { CurrentState = GearStates.Deploying; } else { CurrentState = GearStates.Retracting; } if (posAndRotSaved) { LoadPosAndRot(); } if (CurrentState == GearStates.Deployed || CurrentState == GearStates.Deploying) { wheelHingeTransform.localPosition = deployedWheelTargetTransform.localPosition; wheelHingeTransform.localRotation = deployedWheelTargetTransform.localRotation; tiltTransform.localRotation = tiltTargetTransform.localRotation; deployTransform.localRotation = deployTargetTransform.localRotation; } else { wheelHingeTransform.localPosition = retractedWheelTargetTransform.localPosition; wheelHingeTransform.localRotation = retractedWheelTargetTransform.localRotation; tiltTransform.localRotation = tiltRetractTargetTransform.localRotation; deployTransform.localRotation = retractTargetTransform.localRotation; } part.OnEditorAttach += new Callback(OnEditorAttach); //fs wheel overrides fsWheel = part.FindModuleImplementing <FSBDwheel>(); fsWheel.brakeTorque = brakeTorque; //scale transform.localScale = algScale * Vector3.one; if (part.FindModelTransform(boundsCollider) != null) { Destroy(part.FindModelTransform(boundsCollider).gameObject); } if (!HighLogic.LoadedSceneIsEditor) { showSettings = false; } RefreshTweakables(); wheelColliders = part.FindModelComponents <WheelCollider>(); }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="position">The position the gear is located at on the airplane.</param> /// <param name="startState">Indicates the state the gear is in when the simulation is started.</param> public Gear(Position position, GearStates startState) { Position = position; State = startState; GearIsStuckFault.Name = $"{Position}GearIsStuck"; }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="startState">Indicates the initital states of the gear cylinder state machines. </param> public MechanicalPartActuators(GearStates startState) { FrontGearCylinder = new GearCylinder(Position.Front, startState); LeftGearCylinder = new GearCylinder(Position.Left, startState); RightGearCylinder = new GearCylinder(Position.Right, startState); }
void UpdateAero() { if(previousState!=CurrentState) { if(CurrentState == GearStates.Retracted || CurrentState == GearStates.Deployed) { part.dragModel = CurrentState == GearStates.Deployed ? Part.DragModel.DEFAULT : Part.DragModel.NONE; StartCoroutine(DelayedMeshUpdate()); } } previousState = CurrentState; }
public override void OnStart(PartModule.StartState state) { base.OnStart(state); emptyAnimation = part.FindModelAnimators(animationName)[0]; anim = emptyAnimation[animationName]; //set max and min for wheel height var wheelHeightTweakable = (UI_FloatRange) Fields["wheelHeight"].uiControlEditor; wheelHeightTweakable.maxValue = maxHeight; wheelHeightTweakable.minValue = minHeight; //set max wheelAngle tweakable var wheelAngleTweakable = (UI_FloatRange) Fields["wheelAngle"].uiControlEditor; wheelAngleTweakable.maxValue = maxWheelAngle; wheelAngleTweakable.minValue = 0; //set min/max leg tilt tweakable var tiltAngleTweakable = (UI_FloatRange) Fields["legAngle"].uiControlEditor; tiltAngleTweakable.maxValue = maxTilt; tiltAngleTweakable.minValue = minTilt; //set max brakeTorque tweakable var brakeTorqueTweakable = (UI_FloatRange)Fields["brakeTorque"].uiControlEditor; brakeTorqueTweakable.maxValue = maxBrakeTorque; //tiltTransforms tiltTransform = part.FindModelTransform(tiltTransformName); tiltTargetTransform = part.FindModelTransform(tiltTargetTransformName); tiltRetractTargetTransform = part.FindModelTransform(tiltRetractTargetTransformName); //deployTransforms deployTransform = part.FindModelTransform(deployTransformName); deployTargetTransform = part.FindModelTransform (deployTargetTransformName); retractTargetTransform = part.FindModelTransform(retractTargetTransformName); //wheelTransforms wheelHingeTransform = part.FindModelTransform (wheelHingeTransformName); retractedWheelTargetTransform = part.FindModelTransform (retractedWheelTargetTransformName); deployedWheelTargetTransform = part.FindModelTransform (deployedWheelTargetTransformName); wheelColliderTarget = part.FindModelTransform(wheelColliderTargetName); wheelColliderHolderTransform = part.FindModelTransform("wheelColliderHolder"); wheelAlignmentTransform = part.FindModelTransform(wheelAlignmentTransformName); if(canSteer) { steeringTransform = part.FindModelTransform (steeringTransformName); } initialHeight = Vector3.Distance(deployedWheelTargetTransform.localPosition, retractedWheelTargetTransform.localPosition); SetUpDoors(); if(animSpeedP > 0) { animNormTimeP = 1; } else if(animSpeedP < 0) { animNormTimeP = 0; } anim.normalizedTime = animNormTimeP; float animNormTime = 1-animNormTimeP; animNormTime = Mathf.Clamp01(animNormTime); if(animNormTime >= 1) { CurrentState = GearStates.Deployed; } else if(animNormTime <= 0) { CurrentState = GearStates.Retracted; } else if(anim.speed < 0) { CurrentState = GearStates.Deploying; } else { CurrentState = GearStates.Retracting; } if(posAndRotSaved) LoadPosAndRot(); if(CurrentState == GearStates.Deployed || CurrentState == GearStates.Deploying) { wheelHingeTransform.localPosition = deployedWheelTargetTransform.localPosition; wheelHingeTransform.localRotation = deployedWheelTargetTransform.localRotation; tiltTransform.localRotation = tiltTargetTransform.localRotation; deployTransform.localRotation = deployTargetTransform.localRotation; } else { wheelHingeTransform.localPosition = retractedWheelTargetTransform.localPosition; wheelHingeTransform.localRotation = retractedWheelTargetTransform.localRotation; tiltTransform.localRotation = tiltRetractTargetTransform.localRotation; deployTransform.localRotation = retractTargetTransform.localRotation; } part.OnEditorAttach += new Callback(OnEditorAttach); //fs wheel overrides fsWheel = part.FindModuleImplementing<FSBDwheel>(); fsWheel.brakeTorque = brakeTorque; //scale transform.localScale = algScale * Vector3.one; if(part.FindModelTransform(boundsCollider)!=null) { DestroyImmediate(part.FindModelTransform(boundsCollider).gameObject); } if(!HighLogic.LoadedSceneIsEditor) { showSettings = false; } RefreshTweakables(); wheelColliders = part.FindModelComponents<WheelCollider>(); previousState = CurrentState; part.SendMessage("GeometryPartModuleRebuildMeshData"); if(state != StartState.Editor) { part.mass = baseMass * Mathf.Pow(algScale, 3); } }
public void FixedUpdate() { float negTiltAngleAdjust = (legAngle < 0) ? 180 : 0; if(transformsToMirror!=string.Empty) { if(isMirrored) { foreach(var t in transformsToMirrorList) { t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 180 - negTiltAngleAdjust, t.localRotation.eulerAngles.z); } } else { foreach(var t in transformsToMirrorList) { t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 0 + negTiltAngleAdjust, t.localRotation.eulerAngles.z); } } } if(mirrorRetractedWheel && isMirrored) { retractedWheelTargetTransform.localRotation = Quaternion.Euler(retractedWheelTargetTransform.localRotation.x, retractedWheelTargetTransform.localRotation.y, 180); } wheelColliderHolderTransform.localRotation = wheelHingeTransform.localRotation; //scene specific stuff if(HighLogic.LoadedSceneIsEditor) { tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward); wheelHeight = Mathf.Clamp(wheelHeight, minHeight, maxHeight); wheelColliderHolderTransform.localPosition = new Vector3(0, 0, -wheelHeight); deployedWheelTargetTransform.localPosition = new Vector3(0, 0, -wheelHeight); //wheel angle target stuff float wlocalYrot = isMirrored ? wheelAngle : -wheelAngle; float wlocalZrot = isMirrored && mirrorDeployedWheel ? 180 : 0; deployedWheelTargetTransform.localRotation = Quaternion.Euler(0, wlocalYrot, wlocalZrot); //leg angle target stuff float legLocalXrot = 270+legAngle; float legLocalYrot = 0; float legLocalZrot = 0; if(legAngle!=0) { legLocalYrot = isMirrored ? 270 : 90; legLocalZrot = isMirrored ? 90 : 270; } tiltTargetTransform.localRotation = Quaternion.Euler(legLocalXrot, legLocalYrot, legLocalZrot); //scale transform.localScale = algScale * Vector3.one; } else { if(CurrentState == GearStates.Deployed) { tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward); /* foreach(WheelCollider wheelCollider in part.FindModelComponents<WheelCollider>()) { suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight; wheelCollider.suspensionDistance = suspensionDistance; jointSpring.spring = suspensionSpring; jointSpring.damper = suspensionDamper; jointSpring.targetPosition = wheelCollider.suspensionSpring.targetPosition; wheelCollider.suspensionSpring = jointSpring; //wheelCollider.brakeTorque = brakeTorque; } */ //set wheel collider values for(int i = 0; i < wheelColliders.Length; i++) { suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight; wheelColliders[i].suspensionDistance = suspensionDistance; jointSpring.spring = suspensionSpring; jointSpring.damper = suspensionDamper; jointSpring.targetPosition = wheelColliders[i].suspensionSpring.targetPosition; wheelColliders[i].suspensionSpring = jointSpring; } float mirrorMult = isMirrored ? 1 : -1; float m = wheelHeight * Mathf.Sin(tiltAngleP*Mathf.Deg2Rad); float localX = m * Mathf.Cos (tiltAngleP * Mathf.Deg2Rad) * mirrorMult; float localZ = -(m * Mathf.Sin (tiltAngleP * Mathf.Deg2Rad)); wheelColliderHolderTransform.localPosition = new Vector3(localX, 0, localZ); } else { /* foreach(var wheelCollider in part.FindModelComponents<WheelCollider>()) { wheelCollider.suspensionDistance = 0; } */ for(int i = 0; i < wheelColliders.Length; i++) { wheelColliders[i].suspensionDistance = 0; } wheelColliderHolderTransform.localPosition = Mathf.Clamp01((currentNormTime-stageNormTime)/(1-stageNormTime)) * new Vector3(0,0,-wheelHeight); } } //get animation normalized time and current state float animNormTime = 0; if(!hasLoaded) { //emptyAnimation.Stop(); anim.normalizedTime = animNormTimeP; hasLoaded = true; } else { animNormTimeP = anim.normalizedTime; animSpeedP = anim.speed; } deployTime = anim.length; anim.normalizedTime = Mathf.Clamp01(anim.normalizedTime); if(emptyAnimation.isPlaying) animNormTime = 1-anim.normalizedTime; for(int i = 0; i < wheelColliders.Length; i++) { if(animNormTime < 0.2f && CurrentState != GearStates.Deployed) { wheelColliders[i].radius = 0.0001f; } else { wheelColliders[i].radius = wheelRadius; } } if(animNormTime == 0 && !emptyAnimation.isPlaying) { CurrentState = TargetState; } else if(anim.speed < 0) { TargetState = GearStates.Deployed; CurrentState = GearStates.Deploying; } else if(anim.speed > 0) { TargetState = GearStates.Retracted; CurrentState = GearStates.Retracting; } Steering(); UpdateDoors(); doorsNormTime = (90/doorSpeed)/deployTime; deployTime -= 90/doorSpeed; UpdateGear(); UpdateWheelAlignment(); SavePosAndRot(); UpdateAero(); }