private RFRD TrackUpdate(float accel, float steer, WheelDataExt[] WD, GameObject track, int RotateDir, ref Vector2 trackTextureOffset, WheelData[] upperWheels, ref float middleRPM) { RFRD rfrd = new RFRD(); float delta = Time.fixedDeltaTime; float trackRpm = 0.0f; trackRpm = CalculateSmoothRpm(WD); trackRpm += (AngularVelocity * RotateDir * 0.25f) / Time.deltaTime; middleRPM = trackRpm; float RPMtoDeg = delta * trackRpm * 360.0f / 60.0f; if (wheelsAndBonesAxisSettings.inverseWheelsRotation) { RPMtoDeg *= -1.0f; } if (isUsingWheelSkidmarks) { if (RotateDir > 0) { leftWheelSkidmarks.gameObject.SetActive(WD[0].col.isGrounded); if (!WD[0].col.isGrounded) { leftWheelSkidmarks.lastSkidmark = -1; } } else { rightWheelSkidmarks.gameObject.SetActive(WD[0].col.isGrounded); if (!WD[0].col.isGrounded) { rightWheelSkidmarks.lastSkidmark = -1; } } } for (int i = 0; i < WD.Length; i++) { WD[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(WD[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg, 360.0f); WD[i].wheelTransform.localEulerAngles = WD[i].wheelRotationAngles; rfrd += CalculateMotorForce(WD[i].col, accel, steer); } for (int i = 0; i < upperWheels.Length; i++) { upperWheels[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(upperWheels[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg, 360.0f); upperWheels[i].wheelTransform.localEulerAngles = upperWheels[i].wheelRotationAngles; } if (track != null) { trackTextureOffset += new Vector2(0, RPMtoDeg * delta); track.GetComponent <MeshRenderer>().material.mainTextureOffset = trackTextureOffset; } return(rfrd); }
public void UpdateWheels(float accel, float steer) { if (leftTrackWheelData == null && rightTrackWheelData == null) { return; } if (steer != 0 && !isBrakeingAble) { if ((accel != 1 || accel != -1) && (rigidBody.velocity.magnitude * 3.6f < 5)) { if (rigidBody.angularVelocity.magnitude / Mathf.Deg2Rad < 10) { if (accel >= 0) { accel = PushSpeed; } else { accel = -PushSpeed; } steer = 0; } else if (rigidBody.angularVelocity.magnitude / Mathf.Deg2Rad < maxAngularVelocity - 10) { if (accel >= 0) { accel = PushSpeed; } else { accel = -PushSpeed; } } } } leftTrackSpeed = RPMtoKMPH(leftTrackWheelData[0].col.radius, leftTrackMiddleRPM) + steerGByAngularVelocity * 10; rightTrackSpeed = RPMtoKMPH(rightTrackWheelData[0].col.radius, rightTrackMiddleRPM) - steerGByAngularVelocity * 10; RFRD rfrd = new RFRD(); LeftTrackRPM = TrackRPM(leftTrackWheelData); RightTrackRPM = TrackRPM(leftTrackWheelData); t += Time.fixedDeltaTime; rfrd = TrackUpdate(accel, steer, leftTrackWheelData, leftTrack, 1, ref leftTrackTextureOffset, leftTrackUpperWD, ref leftTrackMiddleRPM); rfrd += TrackUpdate(accel, -steer, rightTrackWheelData, rightTrack, -1, ref rightTrackTextureOffset, rightTrackUpperWD, ref rightTrackMiddleRPM); rotationVector.y = steer * rfrd.rotationForce; rotationVector.z = -steer * rfrd.rotationDamper; // //Debug.Log(rigidbody.angularVelocity); }
private RFRD CalculateMotorForce(WheelCollider col, float accel, float steer) { WheelFrictionCurve fc = colliderFromPrefab.sidewaysFriction; RFRD rfrd = new RFRD(); float wheelSpeed = Mathf.Abs(RPMtoKMPH(col.radius, col.rpm)); float motorTorque = 0.0f; float brakeTorque = 0.0f; if (accel == 0 && steer == 0) { brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); motorTorque = 0.0f; rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; } else if (accel == 0.0f) { if (!col.isGrounded) { motorTorque = steer * accelerationConfiguration.acceleration.Evaluate(wheelSpeed); rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; } else { rfrd.rotationForce = rotationOnStayConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount; rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount; motorTorque = 0.0f; fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor; fc.extremumValue *= sidewaysFrictionExtremumFactor; } //brakeTorque = accelerationConfiguration.brake.Evaluate (wheelSpeed); brakeTorque = rotationOnStayConfiguration.brake.Evaluate(wheelSpeed); } else { if (steer != 0.0f) { if (!col.isGrounded) { rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; } else { rfrd.rotationForce = rotationOnAccelerationConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount; rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount; fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor; fc.extremumValue *= sidewaysFrictionExtremumFactor; } } motorTorque = accel * accelerationConfiguration.acceleration.Evaluate(wheelSpeed); if (col.rpm > 0 && accel < 0) { brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); } else if (col.rpm < 0 && accel > 0) { brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); } else { if (steer != 0.0f) { brakeTorque = rotationOnAccelerationConfiguration.brake.Evaluate(wheelSpeed); } else { brakeTorque = 0.0f; } } } //col.suspensionSpring = js; col.motorTorque = motorTorque; col.brakeTorque = brakeTorque; col.sidewaysFriction = fc; return(rfrd); }
private RFRD TrackUpdate(float accel,float steer,WheelDataExt[] WD, GameObject track, ref Vector2 trackTextureOffset, WheelData[] upperWheels, ref float middleRPM) { float delta = Time.fixedDeltaTime; RFRD rfrd = new RFRD(); float trackRpm = 0.0f; trackRpm = CalculateSmoothRpm(WD); middleRPM = trackRpm; float RPMtoDeg = delta * trackRpm * 360.0f / 60.0f; if(wheelsAndBonesAxisSettings.inverseWheelsRotation) RPMtoDeg *=-1.0f; foreach (WheelDataExt w in WD){ w.wheelTransform.localPosition = CalculateWheelOrBonePosition(w.wheelTransform,w.col,w.wheelStartPos,true); w.boneTransform.localPosition = CalculateWheelOrBonePosition(w.boneTransform,w.col,w.boneStartPos,false); w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg,360.0f); w.wheelTransform.localEulerAngles = w.wheelRotationAngles; rfrd += CalculateMotorForce(w.col,accel,steer); //Debug.Log(rfrd.rotationDamper); } if(trackTextireAnimationSettings.inverseTextureDirection) trackRpm *=-1.0f; trackTextureOffset[trackTextireAnimationSettings.TTAxisPointer] = Mathf.Repeat(trackTextureOffset[trackTextireAnimationSettings.TTAxisPointer] + delta*trackRpm*trackTextureSpeed/60.0f,1.0f); if(track.renderer.material.GetTexture("_MainTex")){ track.renderer.material.SetTextureOffset("_MainTex",trackTextureOffset); } if(track.renderer.material.GetTexture("_BumpMap")){ track.renderer.material.SetTextureOffset("_BumpMap",trackTextureOffset); } foreach (WheelData w in upperWheels){ w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg,360.0f); w.wheelTransform.localEulerAngles = w.wheelRotationAngles; } return rfrd; }
private RFRD CalculateMotorForce(WheelCollider col, float accel, float steer) { WheelFrictionCurve fc = colliderFromPrefab.sidewaysFriction; RFRD rfrd = new RFRD(); float wheelSpeed = Mathf.Abs(RPMtoKMPH(col.radius,col.rpm)); float motorTorque = 0.0f; float brakeTorque = 0.0f; if(accel == 0 && steer == 0){ brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); motorTorque =0.0f; rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; }else if( accel == 0.0f){ if(!col.isGrounded){ motorTorque = steer*accelerationConfiguration.acceleration.Evaluate(wheelSpeed); rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; }else{ rfrd.rotationForce = rotationOnStayConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount; rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount; motorTorque = 0.0f; fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor; fc.extremumValue *= sidewaysFrictionExtremumFactor; } brakeTorque = rotationOnStayConfiguration.brake.Evaluate(wheelSpeed); }else{ if(steer!=0.0f) if(!col.isGrounded){ rfrd.rotationForce = 0.0f; rfrd.rotationDamper = 0.0f; }else{ rfrd.rotationForce = rotationOnAccelerationConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount; rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount; fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor; fc.extremumValue *= sidewaysFrictionExtremumFactor; } motorTorque = accel*accelerationConfiguration.acceleration.Evaluate(wheelSpeed); if(col.rpm > 0 && accel < 0){ brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); }else if(col.rpm < 0 && accel > 0){ brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed); }else{ if(steer!=0.0f) brakeTorque = rotationOnAccelerationConfiguration.brake.Evaluate(wheelSpeed); else brakeTorque = 0.0f; } } //col.suspensionSpring = js; col.motorTorque = motorTorque; col.brakeTorque = brakeTorque; col.sidewaysFriction = fc; return rfrd; }
public void UpdateWheels(float accel,float steer) { RFRD rfrd = new RFRD(); rfrd =TrackUpdate(accel,steer,leftTrackWheelData,leftTrack,ref leftTrackTextureOffset,leftTrackUpperWD,ref leftTrackMiddleRPM); rfrd +=TrackUpdate(accel,-steer,rightTrackWheelData,rightTrack,ref rightTrackTextureOffset,rightTrackUpperWD,ref rightTrackMiddleRPM); rotationVector.y = steer*rfrd.rotationForce; rotationVector.z = -steer*rfrd.rotationDamper; if(steer!=0.0f){ rigidbody.AddRelativeTorque(rotationVector,ForceMode.Acceleration); //-steer*rfrd.rotationDamper } //Debug.DrawRay(transform.position,rigidbody.angularVelocity,Color.red); //Debug.Log(rigidbody.angularVelocity); }