Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 24.05.2009, 21:42   #1
karry
Нуждающийся
 
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений
(для 10 пользователей)
Скорость юнита

Начну новую тему, пожалуй.

Вот допустим у меня юнит двигается со скоростью 5 единиц/секунду, а я ему указываю цель на расстоянии 11 единиц от него. Как остановить юнит в нужной точке ?
Не строить же, в самом деле, дерево из IF-Else, проверяющих расстояние через каждую единицу ?
Можно поставить скорость в зависимость от расстояния, но это изменит начальные условия задачи.
(Offline)
 
Ответить с цитированием
Старый 24.05.2009, 22:05   #2
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Скорость юнита

Мммм... Дык в чем проблема?
Перемещение изначально равно скорости юнита. Если расстояние до цели меньше чем то, которое проходит юнит за шаг (т.е. скорости юнита), то перемещение ставится равным этому расстоянию. Алгоритм допиливать напильником по желанию, до получения желаемого результата.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
karry (24.05.2009)
Старый 24.05.2009, 22:09   #3
karry
Нуждающийся
 
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений
(для 10 пользователей)
Ответ: Скорость юнита

Мммм... Дык в чем проблема?
В том что я до этого не додумался.
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 02:06   #4
karry
Нуждающийся
 
Регистрация: 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
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 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
karry
Нуждающийся
 
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений
(для 10 пользователей)
Ответ: Скорость юнита

Для тебя это было буквально вчера - а для меня десять лет назад.
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 03:11   #7
karry
Нуждающийся
 
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений
(для 10 пользователей)
Ответ: Скорость юнита

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

-создаю два пивота, один родитель другого.
-на всякий случай присваиваю им одинаковые координаты.
-ни один пивот никуда не повернут, ориентация дефолтная.
-делаю обоим pointentity на один и тот же объект.
-проверяю у обоих пивотов глобальный EntityYaw - и они несовпадают !
Как такое может быть ? И главное - как с этим бороться ?
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 03:41   #8
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Скорость юнита

а координаты тоже глобально присваиваешь?
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 04:00   #9
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Скорость юнита

Если один припаренчен к другому - нафига оба поворачивать ?
а углы не совпадают, потомучто ты сначала повернул ребенка, а потом родителя.
__________________
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 06:35   #10
rr333
Нуждающийся
 
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений
(для 38 пользователей)
Ответ: Скорость юнита

Кстати, karry, если дистанция между юнитом и целью меньше скорости, то просто обнули скорость и поставь юнит на цель. Тогда
Кружить точно не будет.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
karry (25.05.2009)
Старый 25.05.2009, 09:28   #11
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Ответ: Скорость юнита

Для плавного поворота AlignToVector , но иногда получаются глюки, указываешь ехать назад, а юнит едет вперед.
Причем тоже самое получается если делать PointEntity временного пивота и плавно менять угол юнита до угла этого пивота (почти аналог AlignToVector получается).
Я так думаю глюк начинается с функции EntityYaw(), которая при некоторых углах дает не верные значения.
Моск сломал думая как этого избежать ))
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 12:38   #12
karry
Нуждающийся
 
Регистрация: 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
karry
Нуждающийся
 
Регистрация: 19.05.2009
Сообщений: 82
Написано 8 полезных сообщений
(для 10 пользователей)
Ответ: Скорость юнита

Черт, я-то думал что углы поворота в блице как во всех нормальных 3D приложениях, от 0 до 360, а они от 0 до 180 и до -180 !
Вот в чем загвоздка...как же определять в какую сторону юниту поворачиваться если один угол положительный а второй отрицательный ?
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 14:49   #14
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Скорость юнита

логично: угол +180, вот тебе и формат 0-360
__________________
(Offline)
 
Ответить с цитированием
Старый 25.05.2009, 17:22   #15
rr333
Нуждающийся
 
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений
(для 38 пользователей)
Ответ: Скорость юнита

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить пересечение пути юнита с определенным объектом? stone_evil 3D-программирование 22 14.05.2009 17:35
Скорость Fant 3D-программирование 36 24.06.2007 01:21
Скорость smaller 3D-программирование 5 21.08.2006 16:02


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com