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=5288)

Crystal 14.12.2007 00:23

Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Собственно суть вопроса в заголовке.
Как это делать криво через заднее место я знаю,
а как правильно не знаю.
Хотелосьбы увидеть кодом как это делать правильно?
Ещё больше бы хотелось увидеть это кодом дипломата.

HolyDel 14.12.2007 00:42

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 строчек.

Crystal 14.12.2007 14:09

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Я тут мало что понял.
И не понял в коде как создать перемещение из пункта А в пункт Б.
В своём коде я расставлял трианглы как хотел, и писал ботам
как правильно ездить по этим трианглам.
А тут чёто спираль какаято из кубов, и боты тупо ездиют по кругу.
Мне не понятно как на основе этого делать дороги,
и чтобы боты знали когда какую дорогу использовать.

Какаято блин свободная генирация вейпоинтов, а не установка куда нужно.
Вот допустим я ща 10 домов поставлю в разных сторонах,
и как же мне правельно установить вейпоинты, и не так чтоб по прямой,
а чтоб по дорогам на плейне выбитым?
И чтобы бот знал в какой момент и какую дорогу лучше использовать.

Вот в своём жопакоде я могу легко вбить все маршруты,
а тут даже не представляю.


Напишите мне просто перемещение От какогонибудь цилиндра к сфере, а между ними пуст ькубы вейпоинты стоят.
И не как попал по всяким синусам, а чётко собственно вырисованной кривой дороге.
И чтоб боту была команда от цилиндра ехать к сфере, н очерез вейпоинты.
Во тесли такой код будет я пойму.

И ненадо там лишнюю фигню писать типа всяких альф и прочей фигни,
1 бот, 1 плейн, 10 кубов лично расстваленых какнибудь змейкой там или хз, 1 сфера.

Вот такой код я пойму, а щас я даж не представляю что таким кодом сделат ьможно,
во всяком случае сделать то, что я уже могу делат ьв своём коде у меня тут не получится.

HolyDel 14.12.2007 14:15

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
PositionEntity WayPoints(i),x,y,z
устанавливает точку i в координаты x,y,z

Crystal 14.12.2007 14:22

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
А как я отдельные вейпоинты установлю как мне надо? Этаж команда все вейпоинты кудато пихает,
у тя там вообще синус - косинус прописано, и он спираль нарисовал.

И вообще мне не надо задачу давать кататься по вейпоинтам туда сюда,
мне надо ехать от дома к дому пользуясь дорогой,
и чтоб бот знал какую именно из дорог надо пользовать в нужный момент.

HolyDel 14.12.2007 14:27

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
нет, эта строчка "куда-то" пихает только i-тый вэйпойнт.
пожалуста - будет два вэйпойнта - будет бот ездить туда-сюда.

Damp 14.12.2007 14:37

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.

Crystal 14.12.2007 14:40

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Блин еслиб мне написали как я просил я бы понял, а щас я ничё не понимаю.
И ненадо мне его тупо по вейпоинтам гонять, мне надо гонять от дома к дому через эти вейпоинты,
и чтобы он знал когда какую дорогу пользовать потому, что дорога двухполосная.

HolyDel 14.12.2007 14:44

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
А! ето меняет дело.
тут все будет чуть сложнее, но в принципе, реализуемо.
пока писать не буду.

Crystal 14.12.2007 14:46

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Да, сложнее...
Пока такое могу влёгкую делать только своим кодом...

Crystal 14.12.2007 16:06

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


HolyDel 14.12.2007 16:35

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Blitzerg, это можно сделать намного проще. у меня пока нет времени. у Дипломата думаю тоже.
вот приблизительный алгоритм.
1. у вейпойнта должен быть флаг - ведет он к первому дому или ко второму
2. если боту сказано идти, например к первому дому, то он ищет ближайший вейпойнт, ведущий к первому дому и идет к нему. далее просто - как в моем примере.

mr.DIMAS 14.12.2007 16:59

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.
В данном примере для каждого бота может быть своя карта вэйпоинтов. Юзать эти функции легко + они полностью работо способны

Trilliput 14.12.2007 19:41

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
эх, если бы мне лет этак пять назат так все расжевывали :)

IGR 14.12.2007 19:58

Re: Передвижение бота из пункта А в пункт В по вейпоинтам.
 
Blitzerg, добавляй в тип вэйпоигта еще 1 field:
Type Twp
...
Field flag%
...
End Type

Потом выполняеш проверку на флаг:
if wp\flag% = 1 then
PointEntity Player,wr\ent
...
ну и так дальше

если дорога кривая, то нужно розбить ее на маленькие прямолинейные отрезки в конце которых ставить вэйпоинт !!


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

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