Приложение силы к объекту так, чтобы он поразил цель по параболическому движению.C#

Место общения программистов C#
Ответить
Anonymous
 Приложение силы к объекту так, чтобы он поразил цель по параболическому движению.

Сообщение Anonymous »

Я пытаюсь выстрелить ядром из пушки в трехмерном пространстве, но ядро ​​приземляется значительно дальше цели. Я использую физические расчеты, чтобы определить начальную скорость на основе угла запуска и времени приземления.
Проблема не так сложна, потому что единственной силой, приложенной в этом сценарии, является гравитация, объект не имеет сопротивления. И все же, хоть убей, я не могу понять, что не так.
Для моих осей X и Z я использую равномерное прямолинейное движение с уравнением:

Код: Выделить всё

x = v0x * cos(alpha) * t + x0
где x — положение по оси x, v0x начальная скорость (что я хотел бы выяснить), альфа угол , t время приземления и x0 начальное положение.
Для оси Y я использую равномерно ускоренное (только под действием силы тяжести).
В основном

Код: Выделить всё

y = y0 + v0y * sin(alpha) * t - 1/2 gt^2
где y — положение по оси y, y0 начальное положение, v0y начальная скорость (тоже хочу разобраться) , а g — сила гравитации.
И тем не менее, применение всего этого приводит к очень дурацкому запуску пушечного ядра...
Я просмотрел множество других сообщений, но либо их требования отличались от моих, либо они использовали другое уравнение, которое я едва мог понять.
Вот код:

Код: Выделить всё

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://imgur.com/a/8hfdvh6
Спасибо за любые советы, которые вы можете дать меня, и все остальное, что вам нужно, спрашивайте.
На видео вы можете видеть, что цель в порядке, но она всегда промахивается.

Подробнее здесь: https://stackoverflow.com/questions/790 ... lic-motion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»