- Home /
Question by
ErAsk · Nov 05, 2016 at 09:22 PM ·
rotationtranslation
Rotation weirdly affects translation
I'm working on simple spaceship simulation. I can turn on/off engines with space, rotate vertically with w, s and horizontally with a, d. The problem is rotation weirdly affects translation. It looks like that:
http://i.imgur.com/duyiy3i.gif
My space control script:
private float verticalRotation, horizontalRotation, rotationSpeed;
private Kinematics kinematics;
void Start()
{
rotationSpeed = 0.25f;
kinematics = gameObject.GetComponent<Kinematics>();
}
void Update()
{
verticalRotation += Input.GetAxis("Vertical");
horizontalRotation += Input.GetAxis("Horizontal");
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(verticalRotation * rotationSpeed, horizontalRotation * rotationSpeed, 0), Time.deltaTime);
if (kinematics != null)
{
if (Input.GetKey(KeyCode.Space))
kinematics.EngineAcceleration = 0.0025f * transform.up;
else
kinematics.EngineAcceleration = Vector3.zero;
}
}
My kinematics script:
private Vector3 initialVelocity, velocity, acceleration, initialPosition, position, engineAcceleration, gravitationalAcceleration, motionTime;
public Vector3 EngineAcceleration
{
set
{
engineAcceleration = value;
}
}
void Start()
{
initialPosition = transform.position;
position = initialPosition;
}
void FixedUpdate()
{
UpdateAcceleration();
UpdateVelocity();
UpdateMotionTime();
UpdatePosition();
}
void UpdateAcceleration()
{
acceleration = engineAcceleration + gravitationalAcceleration;
}
void UpdateVelocity()
{
velocity.x = initialVelocity.x + (acceleration.x * motionTime.x);
velocity.y = initialVelocity.y + (acceleration.y * motionTime.y);
velocity.z = initialVelocity.z + (acceleration.z * motionTime.z);
}
void UpdateMotionTime()
{
if (velocity.x != 0 || acceleration.x != 0)
motionTime.x += Time.deltaTime;
else
{
motionTime.x = 0;
initialPosition.x = transform.position.x;
}
if (velocity.y != 0 || acceleration.y != 0)
motionTime.y += Time.deltaTime;
else
{
motionTime.y = 0;
initialPosition.y = transform.position.y;
}
if (velocity.z != 0 || acceleration.z != 0)
motionTime.z += Time.deltaTime;
else
{
motionTime.z = 0;
initialPosition.z = transform.position.z;
}
}
void UpdatePosition()
{
position.x = initialPosition.x + (initialVelocity.x * motionTime.x) + (acceleration.x * (motionTime.x * motionTime.x) * 0.5f);
position.y = initialPosition.y + (initialVelocity.y * motionTime.y) + (acceleration.y * (motionTime.y * motionTime.y) * 0.5f);
position.z = initialPosition.z + (initialVelocity.z * motionTime.z) + (acceleration.z * (motionTime.z * motionTime.z) * 0.5f);
transform.position = position;
}
Please don't give me answers with unity physics methods - I have to write my own physics.
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612100111im_/https://answers.unity.com/themes/thub/images/avi.jpg)