Проблема не так сложна, потому что единственной силой, приложенной в этом сценарии, является гравитация, объект не имеет сопротивления. И все же, хоть убей, я не могу понять, что не так.
Для моих осей X и Z я использую равномерное прямолинейное движение с уравнением:
Код: Выделить всё
x = v0x * cos(alpha) * t + x0
Для оси Y я использую равномерно ускоренное (только под действием силы тяжести).
В основном
Код: Выделить всё
y = y0 + v0y * sin(alpha) * t - 1/2 gt^2
И тем не менее, применение всего этого приводит к очень дурацкому запуску пушечного ядра...
Я просмотрел множество других сообщений, но либо их требования отличались от моих, либо они использовали другое уравнение, которое я едва мог понять.
Вот код:
Код: Выделить всё
void ShootCannonball(Vector3 targetPoint, Vector3 originPoint, float T)
{
float angle = initialAngle * Mathf.Deg2Rad; // Convert to radians
GameObject newCannonball = Instantiate(cannonballPrefab, originPoint, Quaternion.identity);
Rigidbody rb = newCannonball.GetComponent();
float vox = UniformMotionX(targetPoint.x, originPoint.x, angle, T);
float voy = AcceleratedY(targetPoint.y, originPoint.y, angle, T);
float voz = UniformMotionZ(targetPoint.z, originPoint.z, angle, T);
Vector3 push = new Vector3(vox, voy, voz);
// Fire!
rb.AddForce(push, ForceMode.VelocityChange);
}
float UniformMotionX(float target, float origin, float angle, float T)
{
return (target - origin) / (T * Mathf.Cos(angle));
}
float AcceleratedY(float target, float origin, float angle, float T)
{
return (target - origin + 0.5f * currentGravity * Mathf.Pow(T,2)) / (T * Mathf.Sin(angle));
}
float UniformMotionZ(float target, float origin, float angle, float T)
{
return (target - origin) / (T * Mathf.Cos(angle));
}
Спасибо за любые советы, которые вы можете дать меня, и все остальное, что вам нужно, спрашивайте.
На видео вы можете видеть, что цель в порядке, но она всегда промахивается.
Подробнее здесь: https://stackoverflow.com/questions/790 ... lic-motion
Мобильная версия