First things on the physics object
This commit is contained in:
@@ -1,20 +1,70 @@
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
public class RocketPhysics : MonoBehaviour
|
||||
{
|
||||
[Header("References")]
|
||||
public MainEngine mainEngine;
|
||||
public Rigidbody rb;
|
||||
public Altimeter altimeter;
|
||||
|
||||
[Header("Data")]
|
||||
public DoublePrecisionVector3 position;
|
||||
public DoublePrecisionVector3 velocity;
|
||||
public DoublePrecisionVector3 rotation;
|
||||
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
void Start()
|
||||
{
|
||||
|
||||
position = new DoublePrecisionVector3(rb.position.x, rb.position.y, rb.position.z);
|
||||
velocity = new DoublePrecisionVector3(rb.linearVelocity.x, rb.linearVelocity.y, rb.linearVelocity.z);
|
||||
rotation = new DoublePrecisionVector3(rb.rotation.eulerAngles.x, rb.rotation.eulerAngles.y, rb.rotation.eulerAngles.z);
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
double gravityAcceleration = altimeter.gh;
|
||||
double thrustAcceleration = mainEngine.thrust / rb.mass;
|
||||
|
||||
Vector3 thrustDirection = rb.rotation * Vector3.up;
|
||||
DoublePrecisionVector3 gravityAccelerationVector = new DoublePrecisionVector3(0, -gravityAcceleration, 0);
|
||||
DoublePrecisionVector3 thrustAccelerationVector = new DoublePrecisionVector3(
|
||||
thrustDirection.x * thrustAcceleration,
|
||||
thrustDirection.y * thrustAcceleration,
|
||||
thrustDirection.z * thrustAcceleration
|
||||
);
|
||||
DoublePrecisionVector3 totalAcceleration = gravityAccelerationVector + thrustAccelerationVector;
|
||||
|
||||
velocity = velocity + totalAcceleration * Time.deltaTime;
|
||||
position = position + velocity * Time.deltaTime;
|
||||
|
||||
rb.position = new Vector3((float)position.x, (float)position.y, (float)position.z);
|
||||
rb.linearVelocity = new Vector3((float)velocity.x, (float)velocity.y, (float)velocity.z);
|
||||
rb.rotation = Quaternion.Euler((float)rotation.x, (float)rotation.y, (float)rotation.z);
|
||||
}
|
||||
}
|
||||
|
||||
public class DoublePrecisionVector3
|
||||
{
|
||||
public double x;
|
||||
public double y;
|
||||
public double z;
|
||||
|
||||
public DoublePrecisionVector3(double x, double y, double z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public static DoublePrecisionVector3 operator +(DoublePrecisionVector3 a, DoublePrecisionVector3 b)
|
||||
{
|
||||
return new DoublePrecisionVector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
||||
}
|
||||
|
||||
public static DoublePrecisionVector3 operator *(DoublePrecisionVector3 a, double d)
|
||||
{
|
||||
return new DoublePrecisionVector3(a.x * d, a.y * d, a.z * d);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user