Я довольно давно программирую маленькую игру. Мы начали кодировать небольшой FPS-Shooter внутри школьного проекта, чтобы получить немного опыта с DirectX.
Я не знаю почему, но я не смог остановить проект и тоже начал программировать дома. На данный момент я пытаюсь создать небольшой ИИ. Конечно, это определенно нелегко, но в любом случае это моя личная цель. Тема могла бы заполнить несколько книг хе-хе.
У меня до сих пор ходячая часть моих ботов. Они идут по заданному пути. Я не работаю над "прицеливанием" ботов.
Во время программирования я столкнулся с какой-то математической задачей, которую пока не мог решить. Я надеюсь, что ваш вклад поможет мне продвинуться дальше. Концепции, идеи и все остальное высоко ценится.
Проблема:
Вычислите позицию (D3DXVECTOR3), где кривая снаряда (зависит от силы тяжести, скорости), попадет в кривую пешеходной дорожки противника (зависит от скорости). Мы предполагаем, что противник идет по постоянной линии.
Известные переменные:
float projectilSpeed = 2000 m/s //speed of the projectile per second
float gravitation = 9.81 m/s^2 //of cause the gravity lol
D3DXVECTOR3 targetPosition //position of the target stored in a vector (x,y,z)
D3DXVECTOR3 projectilePosition //position of the projectile
D3DXVECTOR3 targetSpeed //stores the change of the targets position in the last second
Variabledefinition
ProjectilePosition at time of collision = ProjectilePos_t
TargetPosition at time of collision = TargetPos_t
ProjectilePosition at time 0, now = ProjectilePos_0
TargetPosition at time 0, now = TargetPos_0
Time to impact = t
Aim-angle = theta
Моя попытка:
Найдена формула для расчета «капли» (Drop of the снаряд на основе силы тяжести) в Википедии:
float drop = 0.5f * gravity * t * t
Скорость снаряда имеет горизонтальную и вертикальную части. Найдена формула для этого в Википедии, а также:
ProjectilVelocity.x = projectilSpeed * cos(theta)
ProjectilVelocity.y = projectilSpeed * sin(theta)
Так что я бы предположил, что это верно для кривой снаряда:
ProjectilePos_t.x = ProjectilePos_0.x + ProjectileSpeed * t
ProjectilePos_t.y = ProjectilePos_0.y + ProjectileSpeed * t + 0.5f * gravity * t * t
ProjectilePos_t.z = ProjectilePos_0.z + ProjectileSpeed * t
Цель идет с постоянной скоростью, поэтому мы можем определить его кривую следующим образом:
TargetPos_t = TargetPos_0 + TargetSpeed * D3DXVECTOR3(t, t, t)
Теперь я не знаю, как продолжить. Я должен решить это как-то, чтобы ухватиться за время, чтобы как-то повлиять.
В качестве основной формы я мог бы использовать:
float time = distanz / projectileSpeed
Но это было бы не совсем правильно, поскольку предполагалось бы линейную «Траекторию». Мы просто находим это поведение при использовании ракеты.
Я надеюсь, что смог объяснить проблему как можно больше. Если остались вопросы, не стесняйтесь спрашивать меня!
Привет из Германии,
Фрэнк
Edit:
Основная проблема заключается в том, что я не могу рассчитать положение врагов во время столкновения, так как у меня нет времени, прошедшего до столкновения. И с другой стороны, я не могу рассчитать время, не зная местоположение врагов во время удара. Может быть, итерационный метод решает это.
кривой враг:
pos(t).x = pos(0).x + speed.x * time
pos(t).y = pos(0).y + speed.y * time
pos(t).z = pos(0).z + speed.z * time
Кривая снаряда:
pos (t) .y = pos (0) .y + sin (тета) * скорость + 0,5 * гравитация * время * время
pos (t) .x и pos (t) .z не уверены, как вычислять в (x и z), определяют направление вперед в основном ... не только x ..
не могу рассчитать противника, не зная времени .. и я не могу рассчитать время, не зная углов (тета, тангажа / рыскания) и расстояние, которое будет до «будущей» точки удара