|
3D-программирование Вопросы, касающиеся программирования 3D мира |
04.07.2007, 11:36
|
#1
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Избежание погрешностей (AI)
Вообщем сделал я простенький ИИ для игры, но когда он "поворачивает" то координаты, по которым он "ездит" сбиваются немного
На картинке показано, что Position_X = 69,9995
Как мне избежать таких погрешностей?
|
(Offline)
|
|
04.07.2007, 11:39
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Избежание погрешностей (AI)
Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся?
|
(Offline)
|
|
04.07.2007, 11:42
|
#3
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от MoKa
Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся?
|
Windows...тяжко живется)
Попробую по твоему совету щас сделать...
|
(Offline)
|
|
04.07.2007, 11:45
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Избежание погрешностей (AI)
Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.
|
(Offline)
|
|
04.07.2007, 11:47
|
#5
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от JohnK
Округляй до целого. (int) переменная.
|
Какую именно переменную округлять?
Вот так он у меня "ходит"
en1\timer#=en1\timer#+en1\speed#
If en1\timer#<=10 Then en1\speed#=.1 Else en1\speed#=0
If en1\timer#>=10 And en1\understand_f=0 Then en1\timer#=0
если таймер больше 10 и впереди свободно, то таймер опять на 0
И впринципе это работает без погрешностей, но вот когда ИИ производит поворот (из-за стены) или упирается в стену, то тут начинается...
|
(Offline)
|
|
04.07.2007, 11:48
|
#6
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от MoKa
Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.
|
То есть если погрешность, то через positionEntity ставить его на место?
|
(Offline)
|
|
04.07.2007, 12:02
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Избежание погрешностей (AI)
Тут уже нужно делать проверку на текущее положение в определённой оси, т.к. как понял у тебя всё поле будет поделено на вертикальные и горизонтальные оси, поэтому и проверяй, а при несоответствии координат к оси, уже двигай.
Еслу у тебя они двигаються и не налезают на перегородки, то и колизия вообще не нужна, т.к. с ней гемороя на свою голову только.
Если погрешность, то менять координаты и ставить на место.
|
(Offline)
|
|
04.07.2007, 12:12
|
#8
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от MoKa
Тут уже нужно делать проверку на текущее положение в определённой оси, т.к. как понял у тебя всё поле будет поделено на вертикальные и горизонтальные оси, поэтому и проверяй, а при несоответствии координат к оси, уже двигай.
Еслу у тебя они двигаються и не налезают на перегородки, то и колизия вообще не нужна, т.к. с ней гемороя на свою голову только.
Если погрешность, то менять координаты и ставить на место.
|
Коллизия у меня есть. За перегородки и на кубики ИИ не влезает. Вот только не понял как ты мне предлагаешь его двигать? Может как-то можно сдлелать ИИ без этих проверок?
У меня ИИ сделан через массив. И проверяется, если впереди 0, то свободно.
|
(Offline)
|
|
04.07.2007, 12:13
|
#9
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Re: Избежание погрешностей (AI)
Fant, сорри, это применимо к C\C#\C++.
А почему бы тебе просто не использовать целые числа? Целые прибавлять, целые отнимать. И все у тебя будет int
|
(Offline)
|
|
04.07.2007, 12:18
|
#10
|
Гигант индустрии
Регистрация: 04.08.2006
Сообщений: 2,642
Написано 53 полезных сообщений (для 92 пользователей)
|
Re: Избежание погрешностей (AI)
Может ему нужна скорость 0.04, а не 1, например ?
|
(Offline)
|
|
04.07.2007, 12:19
|
#11
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от JohnK
Fant, сорри, это применимо к C\C#\C++.
А почему бы тебе просто не использовать целые числа? Целые прибавлять, целые отнимать. И все у тебя будет int
|
Что бы ИИ корректно ездил, я должен
1. Проверить есть ли препядствие
2. Пустить таймер до 10.
Тогда он уткнется в стенку
Таймер у меня целый. От 1 до 10 считает (>=10)
А вот скорость ИИ должна быть .1 иначе быстро получается
|
(Offline)
|
|
04.07.2007, 12:21
|
#12
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Избежание погрешностей (AI)
Значит у тебя двух мерный массив - карта проходимости.
Тогда зачем таймер? Если можно просто двигать его, и проверять в карте проходимости: стоит ли по направлению объект, если да, то поворачивать, тут стадия бота с "Идти", меняется на "Поворачивать "+тут нужно проверять по карте проходимости, если справа пусто то "90", если слева пусто "-90", если и там и там пусто, то или то или другое, а если занято, то 180 или -180, и параметр, в который запишешь начальный градус перед поворотом, он будет делиться на 90, дальше в цикле, выбираем режим поворота, и соответственно, положительное\отрицательное, в ту сторону и крутим, и проверяем на разницу текущего градуса и начального перед началом поворота, если она (разница), будет больше\меньше (зависит положительное или отрицательное), то поворачивать его опять только на тот же градус (малоли погрешность), и переходить в режим "Двигать".
Надеюсь система понятна?
Не факт, ты его юзаешь т.к. проходя эти 10, бот будет какраз в координате перекрёстка, а это можно проверить координатами.
Может ему нужна скорость 0.04, а не 1, например ?
|
Нельзя использовать такие большие координаты, придерживайтесь масштаба (Проверено!), это удобно и лишняя головная боль не будет тревожить! Масштаб: 10Единиц = 1Метр
|
(Offline)
|
|
04.07.2007, 12:21
|
#13
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от Raiter
Может ему нужна скорость 0.04, а не 1, например ?
|
А разница?
|
(Offline)
|
|
04.07.2007, 12:27
|
#14
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Сообщение от MoKa
Значит у тебя двух мерный массив - карта проходимости.
Тогда зачем таймер? Если можно просто двигать его, и проверять в карте проходимости: стоит ли по направлению объект, если да, то поворачивать, тут стадия бота с "Идти", меняется на "Поворачивать "+тут нужно проверять по карте проходимости, если справа пусто то "90", если слева пусто "-90", если и там и там пусто, то или то или другое, а если занято, то 180 или -180, и параметр, в который запишешь начальный градус перед поворотом, он будет делиться на 90, дальше в цикле, выбираем режим поворота, и соответственно, положительное\отрицательное, в ту сторону и крутим, и проверяем на разницу текущего градуса и начального перед началом поворота, если она (разница), будет больше\меньше (зависит положительное или отрицательное), то поворачивать его опять только на тот же градус (малоли погрешность), и переходить в режим "Двигать".
Надеюсь система понятна?
|
Понятно) я так хотел еще полгода назад сделать. Дело в том что у меня с массивом так:
Local obj_x = Int((EntityX (obj)/10))
Local obj_z = Int ((EntityZ (obj)/10))
Округление)
И получается, что когда ИИ (или даже игрок) зайдет большей половиной на клетку, то происходит проверка и он останавливается на полпути ИБО дальше не идет так как там якобы "препядствие". Для этого я установил таймер. Когда срабатывает "якобы препядствие" я отсчитываю еще 10 и получаю что ИИ упирается в стенку
|
(Offline)
|
|
04.07.2007, 12:35
|
#15
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Избежание погрешностей (AI)
Вот игрок у меня, например, без всяких погрешностей. Но там и константы (просто движения игрока не я делал и я в принципе на 100% не разобрался как там сделали так, что он без проблем ходит)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:43.
|