forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Скорость юнита (http://forum.boolean.name/showthread.php?t=8371)

karry 24.05.2009 21:42

Скорость юнита
 
Начну новую тему, пожалуй.

Вот допустим у меня юнит двигается со скоростью 5 единиц/секунду, а я ему указываю цель на расстоянии 11 единиц от него. Как остановить юнит в нужной точке ?
Не строить же, в самом деле, дерево из IF-Else, проверяющих расстояние через каждую единицу ?
Можно поставить скорость в зависимость от расстояния, но это изменит начальные условия задачи.

Knightmare 24.05.2009 22:05

Ответ: Скорость юнита
 
Мммм... Дык в чем проблема?
Перемещение изначально равно скорости юнита. Если расстояние до цели меньше чем то, которое проходит юнит за шаг (т.е. скорости юнита), то перемещение ставится равным этому расстоянию. Алгоритм допиливать напильником по желанию, до получения желаемого результата.

karry 24.05.2009 22:09

Ответ: Скорость юнита
 
Цитата:

Мммм... Дык в чем проблема?
В том что я до этого не додумался. :dontknow:

karry 25.05.2009 02:06

Ответ: Скорость юнита
 
Вроде работает...но !
Я пишу так :

Код:

;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 самого юнита, но не тут-то было, в большинстве случаев юнит достигает цели и начинает бесконечно кружить на месте...

ABTOMAT 25.05.2009 02:13

Ответ: Скорость юнита
 
Цитата:

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

karry 25.05.2009 02:22

Ответ: Скорость юнита
 
Для тебя это было буквально вчера - а для меня десять лет назад. :-D

karry 25.05.2009 03:11

Ответ: Скорость юнита
 
В процессе дебага обнаружилось вот что :

-создаю два пивота, один родитель другого.
-на всякий случай присваиваю им одинаковые координаты.
-ни один пивот никуда не повернут, ориентация дефолтная.
-делаю обоим pointentity на один и тот же объект.
-проверяю у обоих пивотов глобальный EntityYaw - и они несовпадают !
Как такое может быть ? И главное - как с этим бороться ?

MiXaeL 25.05.2009 03:41

Ответ: Скорость юнита
 
а координаты тоже глобально присваиваешь?

tormoz 25.05.2009 04:00

Ответ: Скорость юнита
 
Если один припаренчен к другому - нафига оба поворачивать ?
а углы не совпадают, потомучто ты сначала повернул ребенка, а потом родителя.

rr333 25.05.2009 06:35

Ответ: Скорость юнита
 
Кстати, karry, если дистанция между юнитом и целью меньше скорости, то просто обнули скорость и поставь юнит на цель. Тогда
Кружить точно не будет.

Damp 25.05.2009 09:28

Ответ: Скорость юнита
 
Для плавного поворота AlignToVector , но иногда получаются глюки, указываешь ехать назад, а юнит едет вперед.
Причем тоже самое получается если делать PointEntity временного пивота и плавно менять угол юнита до угла этого пивота (почти аналог AlignToVector получается).
Я так думаю глюк начинается с функции EntityYaw(), которая при некоторых углах дает не верные значения.
Моск сломал думая как этого избежать ))

karry 25.05.2009 12:38

Ответ: Скорость юнита
 
Всем спасибо за участие в теме. Теперь будем разбираться...

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

Не работало.
В чем засада ? Вроде логично...

karry 25.05.2009 14:07

Ответ: Скорость юнита
 
Черт, я-то думал что углы поворота в блице как во всех нормальных 3D приложениях, от 0 до 360, а они от 0 до 180 и до -180 !
Вот в чем загвоздка...как же определять в какую сторону юниту поворачиваться если один угол положительный а второй отрицательный ?

SBJoker 25.05.2009 14:49

Ответ: Скорость юнита
 
логично: угол +180, вот тебе и формат 0-360

rr333 25.05.2009 17:22

Ответ: Скорость юнита
 
А может так выйдет глюк с entityyaw исправить:
припарентить пивот сбоку от объекта, и при определении угла определять глобально положение пивота относительно объекта. Т.е. если пивот справа - угол от 0 до 180, если слева - 180 до 360.


Часовой пояс GMT +4, время: 15:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot