Просмотр полной версии : Алгоритм заставляющий моба бежать лицом вперед
HuntsMan
21.09.2011, 16:15
Нужно заставить моба бежать лицом вперед. Набросал такой алгоритм:
float angl = spawnedCreature->GetOrientation() * 180 / M_PI;
float len_x = 10 * sin(angl);
float len_y = 10 * cos(angl);
if (angl > 180)
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + len_x, spawnedCreature->GetPositionY() + len_y, spawnedCreature->GetPositionZ());
else
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - len_y, spawnedCreature->GetPositionY() - len_y, spawnedCreature->GetPositionZ());
Но моб иногда бежит не лицом вперед, а по диагонали. Что может быть тут не так?
SilverIce
21.09.2011, 17:41
> float angl = spawnedCreature->GetOrientation() * 180 / M_PI;
радианы переводите в градусы. зачем ? ;)
sin/cos работают с радианами
HuntsMan
21.09.2011, 19:35
> float angl = spawnedCreature->GetOrientation() * 180 / M_PI;
радианы переводите в градусы. зачем ? ;)
sin/cos работают с радианами
Там вроде погрешность идет.
Я кое что накалякал тут на бумашке, как буду дома прийду и проверю, потом покажу :)
add:
Сделал вот так:
float angl = angle * 180 / M_PI;
if (angl < 90)
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 5*cos(angl), spawnedCreature->GetPositionY() + 5*sin(angl), spawnedCreature->GetPositionZ());
else if (angl < 180)
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - 5*cos(angl), spawnedCreature->GetPositionY() + 5*sin(angl), spawnedCreature->GetPositionZ());
else if (angl < 270)
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - 5*cos(angl), spawnedCreature->GetPositionY() - 5*sin(angl), spawnedCreature->GetPositionZ());
else
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 5*cos(angl), spawnedCreature->GetPositionY() - 5*sin(angl), spawnedCreature->GetPositionZ());
Но что-то все равно по диагонали бегут. Я уже хз что им ещё нада. На бумаге вроде все ровно получается, а на деле...
Minimajack
21.09.2011, 22:19
для движения вперед, код на java, но принцип одинаков
не важно какое значение угла синус и косинус даст нужный знак.
public void walkForward(float distance)
{
position.x -= distance * (float)Math.sin(Math.toRadians(yaw));
position.y += distance * (float)Math.cos(Math.toRadians(yaw));
}
HuntsMan
21.09.2011, 22:57
Точнее вот так будет:
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 10*cos(angle), spawnedCreature->GetPositionY() + 10*sin(angle), spawnedCreature->GetPositionZ());
И работает =)
MaxXx2021
22.09.2011, 06:44
Точнее вот так будет:
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 10*cos(angle), spawnedCreature->GetPositionY() + 10*sin(angle), spawnedCreature->GetPositionZ());
И работает =)
максимальный угол в wow 6.282f.
Minimajack
22.09.2011, 08:43
максимальный угол в wow 6.282f.
Ориентация то не меняется.
HuntsMan
22.09.2011, 09:43
Я проверял для всех углов - работает нормально :)
MaxXx2021
22.09.2011, 17:33
Ориентация то не меняется.
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
Minimajack
22.09.2011, 17:58
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
вы путаете градусы и радианы.
MaxXx2021
22.09.2011, 18:05
вы путаете градусы и радианы.
Я не путаю. Я говорю, нет смысла переводить угол. Причем в движении.
HuntsMan
22.09.2011, 22:22
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
Относительно чего? Радиан или градусов?
HuntsMan
24.09.2011, 19:29
И снова я со своей математикой :D
Вобщем хочу отспавнить мобов вокруг босса. Накалякал такой код:
float angle = 0;
for(int i = 0; i < 8; i++)
{
sLog->outString("Summon %u mobs, gradus: %f", i, angle*180/M_PI);
me->SummonCreature(46007, me->GetPositionX() + cos(angle)*15, me->GetPositionY() + sin(angle)*15, me->GetPositionZ(), 1.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10000);
angle += M_PI / 4;
}
Вроде все верно, но в итоге получается вот такое: http://filebeam.com/bea0a44dbd20541fadbdc5ff186804fb.jpg
То что в лог вывожу:
2011-09-24 20:24:25 Summon 0 mobs, gradus: 0.000000
2011-09-24 20:24:25 Summon 1 mobs, gradus: 45.000000
2011-09-24 20:24:25 Summon 2 mobs, gradus: 90.000000
2011-09-24 20:24:25 Summon 3 mobs, gradus: 134.999997
2011-09-24 20:24:25 Summon 4 mobs, gradus: 180.000000
2011-09-24 20:24:25 Summon 5 mobs, gradus: 225.000003
2011-09-24 20:24:25 Summon 6 mobs, gradus: 269.999993
2011-09-24 20:24:25 Summon 7 mobs, gradus: 314.999983
По всем расчетам должно спавнить верное кол-во. Где я ошибся? :(
add: А не, все ок, это я дураг :D Оказывается у моба вторая модель была модель невидимки, поэтому он и не отображался :)
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot