|
3D-программирование Вопросы, касающиеся программирования 3D мира |
24.05.2009, 21:42
|
#1
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Скорость юнита
Начну новую тему, пожалуй.
Вот допустим у меня юнит двигается со скоростью 5 единиц/секунду, а я ему указываю цель на расстоянии 11 единиц от него. Как остановить юнит в нужной точке ?
Не строить же, в самом деле, дерево из IF-Else, проверяющих расстояние через каждую единицу ?
Можно поставить скорость в зависимость от расстояния, но это изменит начальные условия задачи.
|
(Offline)
|
|
24.05.2009, 22:05
|
#2
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Скорость юнита
Мммм... Дык в чем проблема?
Перемещение изначально равно скорости юнита. Если расстояние до цели меньше чем то, которое проходит юнит за шаг (т.е. скорости юнита), то перемещение ставится равным этому расстоянию. Алгоритм допиливать напильником по желанию, до получения желаемого результата.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.05.2009, 22:09
|
#3
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
Мммм... Дык в чем проблема?
|
В том что я до этого не додумался.
|
(Offline)
|
|
25.05.2009, 02:06
|
#4
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
Вроде работает...но !
Я пишу так :
;move mode init
Select unit01\movemode
Case 1
If pickhover<>0
If EntityName$(pickhover)="Ground"
PositionEntity move_icon,PickedX(),.1,PickedZ()
ShowEntity move_icon
EndIf
EndIf
Case 0
If unit01\movemode=0 Then HideEntity move_icon
Case 2
dis#=EntityDistance#(unit01\pivot,move_icon)
If unit01\movemode=2 And dis>.5 Then
PositionEntity move_icon,unit01\wpx,.01,unit01\wpz
PointEntity unit01\pivot,move_icon
MoveEntity unit01\pivot,0,0,.5
Else If dis<=.5 And dis>0 Then
MoveEntity unit01\pivot,0,0,dis
Else If dis=0 Then
unit01\movemode=0
EndIf
End Select
movemode 0 - юнит стоит на месте.
movemode 1 - состояние выбора точки на земле для помещения waypoint.
movemode 2 - юнит в движении.
move_icon это waypoint, который остается на земле при клике, и к которому идет юнит. Когда юнит достигает цели картинка move_icon должна прятаться.
Большую часть времени юнит точно достигает цели, то есть расстояние между юнитом и целью становится равно нулю. Но иногда что-то сглючивает, и movemode так и остается равным 2, хотя юнит достиг цели. А расстояние от юнита до цели при этом становится равным чему-то вроде 1.190059e-007 и тому подобное.
Кстати, как бы еще заставить юнит поворачиваться к waypoint плавно, а не в один фрейм ?
Я пытался сделать так : припарентил к юниту еще один пивот, pointentity его на waypoint, затем считал его entityyaw в переменную, и хотел использовать разницу между этой переменной и entityyaw самого юнита, но не тут-то было, в большинстве случаев юнит достигает цели и начинает бесконечно кружить на месте...
|
(Offline)
|
|
25.05.2009, 02:13
|
#5
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Скорость юнита
Кстати, как бы еще заставить юнит поворачиваться к waypoint плавно, а не в один фрейм ?
|
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
Nex (25.05.2009), NitE (25.05.2009)
|
25.05.2009, 02:22
|
#6
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
Для тебя это было буквально вчера - а для меня десять лет назад.
|
(Offline)
|
|
25.05.2009, 03:11
|
#7
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
В процессе дебага обнаружилось вот что :
-создаю два пивота, один родитель другого.
-на всякий случай присваиваю им одинаковые координаты.
-ни один пивот никуда не повернут, ориентация дефолтная.
-делаю обоим pointentity на один и тот же объект.
-проверяю у обоих пивотов глобальный EntityYaw - и они несовпадают !
Как такое может быть ? И главное - как с этим бороться ?
|
(Offline)
|
|
25.05.2009, 03:41
|
#8
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Ответ: Скорость юнита
а координаты тоже глобально присваиваешь?
|
(Offline)
|
|
25.05.2009, 04:00
|
#9
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Скорость юнита
Если один припаренчен к другому - нафига оба поворачивать ?
а углы не совпадают, потомучто ты сначала повернул ребенка, а потом родителя.
__________________
|
(Offline)
|
|
25.05.2009, 06:35
|
#10
|
Нуждающийся
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений (для 38 пользователей)
|
Ответ: Скорость юнита
Кстати, karry, если дистанция между юнитом и целью меньше скорости, то просто обнули скорость и поставь юнит на цель. Тогда
Кружить точно не будет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.05.2009, 09:28
|
#11
|
Знающий
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений (для 133 пользователей)
|
Ответ: Скорость юнита
Для плавного поворота AlignToVector , но иногда получаются глюки, указываешь ехать назад, а юнит едет вперед.
Причем тоже самое получается если делать PointEntity временного пивота и плавно менять угол юнита до угла этого пивота (почти аналог AlignToVector получается).
Я так думаю глюк начинается с функции EntityYaw(), которая при некоторых углах дает не верные значения.
Моск сломал думая как этого избежать ))
|
(Offline)
|
|
25.05.2009, 12:38
|
#12
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
Всем спасибо за участие в теме. Теперь будем разбираться...
Michael
а координаты тоже глобально присваиваешь?
|
В данном случае да.
tormoz
Если один припаренчен к другому - нафига оба поворачивать ?
|
Ну как...один пивот определяет текущую ориентацию юнита, а второй требуемую. Получается разница углов. Это во-первых.
Во-вторых, первым делается pointentity чайлда, и его entityyaw сразу считывается в переменную.
rr333
Хороший совет.
Damp
Для плавного поворота AlignToVector , но иногда получаются глюки
|
Хм, у меня глюки случаются в 100% случаев. Поворачивает-то он плавно, автоматом, но угол выдает всегда неверный...то есть он направляет энтити "куда-то в ту сторону", а не на конкретный угол...не знаю почему.
если делать PointEntity временного пивота и плавно менять угол юнита до угла этого пивота
|
Я именно это и пытался сделать.
Писал так :
If EntityYaw#(unit01\pivot,1)=ppv_yaw then
moveentity, etc.
else if abs(ppv_yaw-entityyaw#(unit01\pivot,1))>4
turnentity
else turnentity,0,ppv_yaw-entityyaw#(unit01\pivot,1),0
Не работало.
В чем засада ? Вроде логично...
|
(Offline)
|
|
25.05.2009, 14:07
|
#13
|
Нуждающийся
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений (для 10 пользователей)
|
Ответ: Скорость юнита
Черт, я-то думал что углы поворота в блице как во всех нормальных 3D приложениях, от 0 до 360, а они от 0 до 180 и до -180 !
Вот в чем загвоздка...как же определять в какую сторону юниту поворачиваться если один угол положительный а второй отрицательный ?
|
(Offline)
|
|
25.05.2009, 14:49
|
#14
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Скорость юнита
логично: угол +180, вот тебе и формат 0-360
__________________
|
(Offline)
|
|
25.05.2009, 17:22
|
#15
|
Нуждающийся
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений (для 38 пользователей)
|
Ответ: Скорость юнита
А может так выйдет глюк с entityyaw исправить:
припарентить пивот сбоку от объекта, и при определении угла определять глобально положение пивота относительно объекта. Т.е. если пивот справа - угол от 0 до 180, если слева - 180 до 360.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:56.
|