|
3D-программирование Вопросы, касающиеся программирования 3D мира |
14.12.2007, 00:23
|
#1
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Передвижение бота из пункта А в пункт В по вейпоинтам.
Собственно суть вопроса в заголовке.
Как это делать криво через заднее место я знаю,
а как правильно не знаю.
Хотелосьбы увидеть кодом как это делать правильно?
Ещё больше бы хотелось увидеть это кодом дипломата.
|
(Offline)
|
|
14.12.2007, 00:42
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
пространство перемещения двумерное? допустим да.
Graphics3D 1024,768,32,1
cam=CreateCamera()
point=CreateCube()
EntityColor point,0,255,0
HideEntity point
EntityAlpha point,0.8
ground=CreatePlane()
EntityColor ground,128,64,16
PositionEntity cam,0,10,-50
PointEntity cam,ground
player=CreateSphere(16)
EntityColor player,0,0,255
HideEntity player
EntityBlend player,3
Type TPlayer
Field ent
Field curwaypoint
End Type
Const MAX_WAYPOINTS=100
Dim WayPoints(MAX_WAYPOINTS)
Const spiral=1
If spiral
da#=(360.0/MAX_WAYPOINTS)*5
dr#=100.0/MAX_WAYPOINTS
a#=0
r#=0
For i=1 To MAX_WAYPOINTS
a=a+da
r=r+dr
WayPoints(i)=CopyEntity(point)
ShowEntity WayPoints(i)
PositionEntity WayPoints(i),Sin(a)*r,0.5,Cos(a)*r
Next
Else
For i=1 To MAX_WAYPOINTS
WayPoints(i)=CopyEntity(point)
ShowEntity WayPoints(i)
PositionEntity WayPoints(i),Rnd(-100,100),0.5,Rnd(-100,100)
Next
EndIf
For i=1 To 10
p.TPlayer=New TPlayer
p\ent=CopyEntity(player)
ShowEntity p\ent
PositionEntity p\ent,Rnd(-100,100),0.5,Rnd(-100,100)
p\curwaypoint=Rand(1,MAX_WAYPOINTS-1)
Next
While Not KeyDown(1)
TurnEntity cam,MouseYSpeed()*0.5,0,0
TurnEntity cam,0,-MouseXSpeed()*0.5,0
RotateEntity cam,EntityPitch(cam),EntityYaw(cam),0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
;Само путешествие по вейпойнтам
For p.TPlayer=Each TPlayer
PointEntity p\ent,WayPoints(p\curwaypoint+1)
MoveEntity p\ent,0,0,0.1
If EntityDistance(p\ent,WayPoints(p\curwaypoint+1))<2
p\curwaypoint=p\curwaypoint+1
If p\curwaypoint=MAX_WAYPOINTS Then p\curwaypoint=0
EndIf
Next
RenderWorld
Flip
Wend
заметь, что само перемещение занимает всего 8 строчек.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.12.2007, 14:09
|
#3
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Я тут мало что понял.
И не понял в коде как создать перемещение из пункта А в пункт Б.
В своём коде я расставлял трианглы как хотел, и писал ботам
как правильно ездить по этим трианглам.
А тут чёто спираль какаято из кубов, и боты тупо ездиют по кругу.
Мне не понятно как на основе этого делать дороги,
и чтобы боты знали когда какую дорогу использовать.
Какаято блин свободная генирация вейпоинтов, а не установка куда нужно.
Вот допустим я ща 10 домов поставлю в разных сторонах,
и как же мне правельно установить вейпоинты, и не так чтоб по прямой,
а чтоб по дорогам на плейне выбитым?
И чтобы бот знал в какой момент и какую дорогу лучше использовать.
Вот в своём жопакоде я могу легко вбить все маршруты,
а тут даже не представляю.
Напишите мне просто перемещение От какогонибудь цилиндра к сфере, а между ними пуст ькубы вейпоинты стоят.
И не как попал по всяким синусам, а чётко собственно вырисованной кривой дороге.
И чтоб боту была команда от цилиндра ехать к сфере, н очерез вейпоинты.
Во тесли такой код будет я пойму.
И ненадо там лишнюю фигню писать типа всяких альф и прочей фигни,
1 бот, 1 плейн, 10 кубов лично расстваленых какнибудь змейкой там или хз, 1 сфера.
Вот такой код я пойму, а щас я даж не представляю что таким кодом сделат ьможно,
во всяком случае сделать то, что я уже могу делат ьв своём коде у меня тут не получится.
|
(Offline)
|
|
14.12.2007, 14:15
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
PositionEntity WayPoints(i),x,y,z
устанавливает точку i в координаты x,y,z
|
(Offline)
|
|
14.12.2007, 14:22
|
#5
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
А как я отдельные вейпоинты установлю как мне надо? Этаж команда все вейпоинты кудато пихает,
у тя там вообще синус - косинус прописано, и он спираль нарисовал.
И вообще мне не надо задачу давать кататься по вейпоинтам туда сюда,
мне надо ехать от дома к дому пользуясь дорогой,
и чтоб бот знал какую именно из дорог надо пользовать в нужный момент.
|
(Offline)
|
|
14.12.2007, 14:27
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
нет, эта строчка "куда-то" пихает только i-тый вэйпойнт.
пожалуста - будет два вэйпойнта - будет бот ездить туда-сюда.
|
(Offline)
|
|
14.12.2007, 14:37
|
#7
|
Знающий
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений (для 133 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Чего-то не очень вопрос ясен...
Ну расставь пивоты где нужно, дапустим piv(0), piv(1), piv(2)...
;в цикле
PointEntity bot,piv(c)
MoveEntity bot,0,0,vz
If EntityDistance(bot,piv(c)) < 5 Then c=c+1 ;ну мол на следующий пивот
---
Типа так наверно в простейшем случае...
Для плавного поворота можно AlignToVector вместо PointEntity.
|
(Offline)
|
|
14.12.2007, 14:40
|
#8
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Блин еслиб мне написали как я просил я бы понял, а щас я ничё не понимаю.
И ненадо мне его тупо по вейпоинтам гонять, мне надо гонять от дома к дому через эти вейпоинты,
и чтобы он знал когда какую дорогу пользовать потому, что дорога двухполосная.
|
(Offline)
|
|
14.12.2007, 14:44
|
#9
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
А! ето меняет дело.
тут все будет чуть сложнее, но в принципе, реализуемо.
пока писать не буду.
|
(Offline)
|
|
14.12.2007, 14:46
|
#10
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Да, сложнее...
Пока такое могу влёгкую делать только своим кодом...
|
(Offline)
|
|
14.12.2007, 16:06
|
#11
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Дипломат - а у тебя какой вариант?
Без проблем! Могу даже рабочий пример написать: делов-то на 15 минут. Только создай нормальный корректный вопрос с описанием проблемы и ТЗ в соответствующем разделе.
|
Вот вопрос:
Есть 2 дома, между ними в плейне вырублена кривая зигзаговая дорога,
на дороге должно быть 2 ряда вейпоинтов (правая и левая стороны),
должны быть боты.
Как заставить ботов ездить от дома к дому через вейпоинты, выберая правильный путь?
То есть каким образом это можно сделать вместо моего какакода:
If a\d#=1 And a\PS#=0 And a\T#=23 And a\ZPPS#=2 Then
PointEntity a\entity,PolevoyShpat
a\v#=0.1
End If
If EntityDistance(a\entity,PolevoyShpat)<1 And a\PS#<23 Then
a\v#=0.0
a\PS#=a\PS#+0.1
If a\PS#>23 Then a\PS#=23
If a\PS#=23 Then a\T#=0
End If
If a\PS#=23 And a\UPPS#=0 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS1
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS1)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=1
End If
If a\PS#=23 And a\UPPS#=1 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS2
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS2)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=2
End If
If a\PS#=23 And a\UPPS#=2 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS3
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS3)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=3
End If
If a\PS#=23 And a\UPPS#=3 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS4
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS4)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=5
End If
If a\PS#=23 And a\UPPS#=5 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS5
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS5)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=6
End If
If a\PS#=23 And a\UPPS#=6 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS6
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS6)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=7
End If
If a\PS#=23 And a\UPPS#=7 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS7
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS7)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=8
End If
If a\PS#=23 And a\UPPS#=8 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS8
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS8)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\PS#=23 And a\UPPS#=9 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS9
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS9)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\PS#=23 And a\UPPS#=9 Then
PointEntity a\entity,ZavodPPS
a\v#=0.1
End If
If EntityDistance(a\entity,ZavodPPS)<1 And a\PS#>0 Then
a\v#=0.0
a\PS#=0
a\UPPS#=0
a\ZPPS#=1
End If
If EntityDistance(a\entity,ZavodPPS)<1 And a\PS#=0 Then
a\T#=a\T#+0.1
If a\T#>23 Then
a\T#=23
a\r#=0
End If
End If
If a\d#=1 And a\PS#=0 And a\T#=23 And a\ZPPS#=1 And a\UPPS#=0 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS1
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS1)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=1
End If
If a\T#=23 And a\UPPS#=1 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS2
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS2)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=2
End If
If a\T#=23 And a\UPPS#=2 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS3
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS3)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=3
End If
If a\T#=23 And a\UPPS#=3 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS4
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS4)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=5
End If
If a\T#=23 And a\UPPS#=5 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS5
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS5)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=6
End If
If a\T#=23 And a\UPPS#=6 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS6
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS6)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=7
End If
If a\T#=23 And a\UPPS#=7 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS7
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS7)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=8
End If
If a\T#=23 And a\UPPS#=8 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS8
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS8)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\T#=23 And a\UPPS#=9 Then
PointEntity a\entity,UP2_PolevoyShpat_ZavodPPS9
a\v#=0.1
End If
If EntityDistance(a\entity,UP2_PolevoyShpat_ZavodPPS9)<1 And a\T#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\T#=23 And a\UPPS#=9 Then
PointEntity a\entity,PolevoyShpat
a\v#=0.1
End If
If EntityDistance(a\entity,PolevoyShpat)<1 And a\PS#<23 Then
a\v#=0.0
a\PS#=a\PS#+0.1
If a\PS#>23 Then a\PS#=23
If a\PS#=23 Then a\T#=0
a\UPPS#=0
a\ZPPS#=0
End If
If a\PS#=23 And a\UPPS#=0 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS1
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS1)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=1
End If
If a\PS#=23 And a\UPPS#=1 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS2
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS2)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=2
End If
If a\PS#=23 And a\UPPS#=2 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS3
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS3)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=3
End If
If a\PS#=23 And a\UPPS#=3 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS4
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS4)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=5
End If
If a\PS#=23 And a\UPPS#=5 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS5
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS5)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=6
End If
If a\PS#=23 And a\UPPS#=6 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS6
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS6)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=7
End If
If a\PS#=23 And a\UPPS#=7 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS7
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS7)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=8
End If
If a\PS#=23 And a\UPPS#=8 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS8
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS8)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\PS#=23 And a\UPPS#=9 Then
PointEntity a\entity,UP_PolevoyShpat_ZavodPPS9
a\v#=0.1
End If
If EntityDistance(a\entity,UP_PolevoyShpat_ZavodPPS9)<1 And a\PS#=23 Then
a\v#=0.0
a\UPPS#=9
End If
If a\PS#=23 And a\UPPS#=9 Then
PointEntity a\entity,ZavodPPS
a\v#=0.1
End If
If EntityDistance(a\entity,ZavodPPS)<1 And a\PS#>0 Then
a\v#=0.0
a\PS#=0
a\UPPS#=0
a\ZPPS#=1
End If
If EntityDistance(a\entity,ZavodPPS)<1 And a\PS#=0 Then
a\T#=a\T#+0.1
If a\T#>23 Then
a\T#=23
a\r#=0
End If
End If
|
(Offline)
|
|
14.12.2007, 16:35
|
#12
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Blitzerg, это можно сделать намного проще. у меня пока нет времени. у Дипломата думаю тоже.
вот приблизительный алгоритм.
1. у вейпойнта должен быть флаг - ведет он к первому дому или ко второму
2. если боту сказано идти, например к первому дому, то он ищет ближайший вейпойнт, ведущий к первому дому и идет к нему. далее просто - как в моем примере.
|
(Offline)
|
|
14.12.2007, 16:59
|
#13
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Я для своей стрелялки ( Razor ) написал сей код:
Type WP
Field entity[100]
Field wn
field cnt
End type
Function AddWP(w.WP,x#,y#,z#)
w\entity[w\cnt]=CreatePivot()
PositionEntity w\entity[w\cnt],x#,y#,z#
w\cnt=w\cnt+1
end function
function AligntObjectToWP(obj, w.wp)
pointentity obj,w\entity[w\wn]
moveentity obj,0,0,1
if entitydistance(obj,w\entity[w\wn])<5 then
if w\wn<w\cnt then w\wn=w\wn+1
if w\wn=w\cnt then w\wn=0
end if
end function
А теперь как этим всем пользоваться:
AddWP(w.wp,x#,y#,z#) - добавляет к массиву Entity еще один элемент, где w.wp это переменная типа WP; х,y,z - это координаты в пространстве
AligntObjectToWP(obj, w.wp) - заставляет двигаться определенный объект по определенному массиву вэйпоинтов. где obj это привязываемый к вейпоинтам объект, а w.wp это переменная типа WP.
В данном примере для каждого бота может быть своя карта вэйпоинтов. Юзать эти функции легко + они полностью работо способны
__________________
|
(Offline)
|
|
14.12.2007, 19:41
|
#14
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
эх, если бы мне лет этак пять назат так все расжевывали
|
(Offline)
|
|
14.12.2007, 19:58
|
#15
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
Blitzerg, добавляй в тип вэйпоигта еще 1 field:
Type Twp
...
Field flag%
...
End Type
Потом выполняеш проверку на флаг:
if wp\flag% = 1 then
PointEntity Player,wr\ent
...
ну и так дальше
если дорога кривая, то нужно розбить ее на маленькие прямолинейные отрезки в конце которых ставить вэйпоинт !!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:00.
|