Как сделать так, чтобы вращающиеся объекты попадали в цель правым концом?

25

Я работаю над оружием метательного ножа, где игрок бесплатно целится, а затем бросает нож. Нож вращается в воздухе, и при столкновении перестает вращаться и привязывается к объекту, с которым столкнулся. Вращение выполняется с помощью анимации, а путь ножа - физикой.

Одна из проблем, с которой я сталкиваюсь, заключается в том, чтобы убедиться, что когда нож сталкивается с врагом, нож будет обращен к ним. В данный момент иногда случается так, что нож первым вонзается в рукоять противника. Что, очевидно, нереально. В то же время, я думаю, что для ножа было бы совершенно неразумно «поражать» врага, только если он столкнулся с лезвием первым, поскольку скорость вращения ножа находится вне контроля игрока.

Я наблюдал много медленных видеороликов с аналогичным оружием, и каждый раз, когда оружие выбрасывалось, оно вращалось в воздухе и волшебным образом всегда заканчивалось тем, что лезвие указывало на его цель. Для игры, в которой расстояние броска будет постоянным, это довольно просто сделать. Но я не совсем уверен, как предсказать это, так как есть много непредсказуемых факторов, например. направление ножа, вращение ножа, положение врага, расстояние от врага и т. д. Если это возможно, я бы предпочел не использовать сложную логику прогнозирования, поскольку игра будет для довольно дешевых устройств. Есть ли способ «дыма и зеркал» решить эту проблему?

Пример: https://youtu.be/0fav8lFpBko?t=42s

Внешний интерфейс
источник
15
Нож, всегда поражающий цель первым, также нереалистичен, особенно когда мы говорим о движущейся цели.
Theraot
1
В зависимости от аромата игры, есть несколько стилей метания ножа, которые не вращают лезвие. Обычно они используют ножи, специально предназначенные для стабильного полета.
Перкинс
если центр масс ножа находится значительно ближе к концу рукоятки, чем к концу лезвия, и скорость вращения ножа намного больше, чем его скорость перемещения, тогда он может фактически поразить цель лезвием всегда. это был бы очень странный нож и очень странное существо, которое может бросить его таким образом
Сардж Борщ
2
Эта проблема достаточно заметна, так что об этом есть статья на TVTropes: «Лезвие всегда приземляется заостренно»
Мейсон Уилер
Мне также нравится различие, сделанное в вопросе. Если вы переключили вращение на управление физическим движком, у вас могло бы быть достаточно информации, чтобы затем выполнить расчет во время столкновения, чтобы увидеть, достаточно ли точно конец ножа обращен к цели или нет. Либо так, либо сохраняйте анимацию, и просто предварительно запекайте значения, где анимации ножа направлены вперед, и сравнивайте текущий кадр анимации, чтобы увидеть, находится ли он в этом диапазоне или нет.
Пизис

Ответы:

35

Притворяться

Посмотрите видео, которое вы связали, посмотрите его в замедленном режиме ... а что это? Камера прыгает в конце, и нож уже в шлеме цели.

Просто подделайте это. Как только расстояние от ножа до цели небольшое, прыгайте с помощью ножа в цель магическим образом.

Редактировать: вы можете проверить, попадет ли он в цель, используя замысловатый прогноз, а затем притвориться, что он сначала попал в клинок, а затем показать анимацию, когда цель не двигается и нож убивает ее.


Запутанный прогноз

так как скорость вращения ножа находится вне контроля игрока.

Это верно. Это вне контроля игрока. Тем не менее, не под вашим контролем ...

Если вы можете вычислить расстояние, которое должен пройти нож, вы можете сделать так, чтобы скорость вращения ножа в первую очередь ударила по лезвию.

Теперь не имеет смысла делать это предсказание в середине полета, потому что нож должен был бы приспособиться, если препятствие будет мешать. Таким образом, вы будете делать это, когда вы бросаете.

Тот факт, что вы должны следовать параболическому пути к тесту на попадание, делает его более сложным, чем простой набор лучей. Я бы предложил получить уравнение для параболического движения, которое соответствует метанию ножа, и оценить его с заданными интервалами.

Также можно найти расстояние препятствий до параболы, найдя ближайшую точку в параболе к положению препятствия, а затем выполнить проверку столкновения с этой точкой.

После того, как вы узнаете, сколько ножа должен пройти, вы можете разделить его на целое число оборотов, чтобы он сначала ударил лезвие. Изменить: или целое число 0,5 в зависимости от того, как вы бросаете.

Конечно, препятствия сместились бы к тому моменту, когда туда попадет нож ...


Быть реалистичным

Вы не будете делать первый удар ножом 100% времени, особенно с движущимися целями. Просто примите это, метательный нож не является надежным оружием. Так что имейте альтернативу, чтобы он подпрыгивал, когда он ударяется о ручку первым. Вы можете проверить, ударил ли он сначала по ручке, проверив его ориентацию и сравнив его с направлением на точку столкновения.

Theraot
источник
1
Ах, я не видел прыжок, как умно, но так просто. Это очень очевидно, когда я смотрел это кадр за кадром, как вы предложили.
FrontEnd
14

Если вы заранее знаете, где приземлится нож - как в тех кадрах, снятых с помощью видеокамер, которые наиболее точно производятся после факта - просто рассчитайте правильную скорость вращения на основе расстояния полета и желаемого количества оборотов. Метательные ножи покидают рукоятку метателя в первую очередь, поэтому ему нужно повернуть N + 0,5 на полные обороты 1 , где N обычно равно по крайней мере 1, но может быть больше в зависимости от уровня мастерства метателя или от того, насколько круто вы хотите, чтобы он выглядел: больше спинов = круче.

Если вы этого не сделаете, то можно обмануть, зафиксировав вращение при ударе, и, возможно, скрыть его с брызгами крови. Как волшебник, если вы сделаете это достаточно быстро, игрок не заметит.

Конечно, все это не реально. В реальной жизни метание ножа очень сложно и требует много практики, если вы хотите, чтобы нож приземлился первым. Метатель должен быть полностью осведомлен о расстоянии и соответственно изменять свой бросок, в противном случае нож попадет сначала в рукоять.

1 : Есть несколько стилей, где нож тоже лезет первым.

congusbongus
источник
4
+1: брызги крови. Хорошие фокусы. Изменить: или облако пыли для негорячей версии.
Theraot
2
@Theraot и / или сделать скорость вращения достаточно быстрой, чтобы зритель не мог точно отследить, куда он направлен.
Перкинс
14
  1. Рассчитайте расстояние по прямой до цели.

  2. Каждый кадр устанавливает угол наклона ножа равным 2PI * (остальноеStraightLineDistance) / (originalStraightLineDistance) * DesiredNumRotations.

Коэффициент вращения будет немного отличаться, если вы не двигаете ножом по прямой линии, но никто никогда не заметит.

Если вы не определили цель заранее (то есть вы просто бросаете и используете физику, чтобы увидеть, что она поражает), вам нужно будет ее обмануть, но вы можете использовать тот же принцип, что и цель, на которую она может попасть. регулируя вращение, чтобы быть правильным для этой цели.

Тим Б
источник
4

Настоящие метательные ножи имеют очень высокую вероятность попадания лезвия первыми. Создайте свои ножи соответственно.

Коллекция метательных ножей из Википедии : Коллекция метательных ножей из википедии

Вы хотите, чтобы центр масс и, следовательно, центр вращения были как можно дальше от кончика лезвия . Это увеличит вероятность того, что лезвие развернется в положение удара, прежде чем конец рукоятки попадет туда.

Лезвие, как правило, длинное и тонкое, выступающее как можно дальше от центра масс при добавлении как можно меньшей собственной массы. Кроме того, на конце рукоятки часто имеется дискообразный или сферический противовес, что интересно, что я не вижу ни в одном из ножей из изображения из Википедии.

Нож отбрасывается, удерживая кончик лезвия и изгибая рукоятку в направлении метания.

dotancohen
источник
2

Для «дыма и зеркал» вы можете иметь центр вращения ножа (то есть центр масс) рядом с рукояткой (то есть не заостренной частью). Таким образом, если скорость вращения достаточно высока по сравнению со скоростью ножа, можно гарантировать, что конец лезвия столкнется с целью, а не с какой-либо другой частью.

Есть некоторый расчет, чтобы получить минимальную скорость вращения с учетом центра масс и размеров, но она должна быть простой. Обратите внимание, что это ничего не говорит о угле удара.

Guido
источник
1

Идеальный метатель ножей?

В данный момент вы говорите, что крутите нож с помощью анимации. Какой параметр вы используете для управления углом? Номер кадра? Время игры? Масштабируется произвольной скоростью вращения?

Если вместо этого вы используете параметр (расстояние перемещения) / (общее расстояние до цели) с соответствующим масштабированием по пи и (число витков + 0,5), то нож действительно всегда волшебным образом достигнет точки первым.

Neil_UK
источник
Первая часть этого вопроса, как представляется, требует разъяснений. Вероятно, это следует сделать в виде комментариев к вопросу. Не могли бы вы подробнее рассказать о предложенном вами методе для волшебного прибытия? Например, вы говорите «с соответствующим масштабированием по пи»; какое масштабирование? Справедливо предположить, что если пользователь должен спросить, он может не понять, каким будет соответствующее масштабирование.
Гнемлок
@TimB лучше объяснил это, но предложенное Нилом решение - хороший подход. Измените скорость анимации вращающегося ножа так, чтобы, когда он достиг цели, нож находился в положении «острый конец перешел в другого человека». Это намного проще (программировать, И вычислительно), чем вычислять параболические траектории с участием движущихся целей и т. Д. Что касается «соответствующего масштабирования с помощью PI», которое, вероятно, будет просто равно 2, учитывая, что number_of_revolutions - еще одна переменная в псевдо-уравнении Нила. Если это анимация по ключевым кадрам, то вы просто масштабируете свой индекс и забываете о пи.
AC