Du bist nicht angemeldet (anmelden)
Seite 1
„Urban AI“ Pathfinding
Hat jemand von euch schonmal versucht Fussgänger/Passanten in Flash bauen und mit einer künstlichen Intelligenz auszustatten. Will heissen, dass die Viecher nicht einfach rumwuseln, sondern hauptsächlich in eine Richtung steuern und sich gegenseitig ausweichen.
Alle Informationen die ich im Netz finde, sind leider schon down…
Alle Informationen die ich im Netz finde, sind leider schon down…
Vielleicht helfen dir steering/flocking-Algorithmen weiter: http://blog.soulwire.co.uk/flash/actions...behaviors/
Haben halt keine Kollisonsabfrage. Das ließe sich aber u.U. mit dem ProximityManager von Skinner kombinieren: http://www.gskinner.com/blog/archives/20...anage.html
Oder irgendwas simpleres, Kachelbasiertes.
Haben halt keine Kollisonsabfrage. Das ließe sich aber u.U. mit dem ProximityManager von Skinner kombinieren: http://www.gskinner.com/blog/archives/20...anage.html
Oder irgendwas simpleres, Kachelbasiertes.
http://www.vergenet.net/~conrad/boids/ps...ocode.html
der pseudocode hat mir damals gute geholfen. Zusammen mit einem waypoint/pathfinding system nimmt dir flocking immerhin ab, dass sie sich gegenseitig ausweichen.
Für eine echtzeit simulation solltest du aber noch einige optimierungen treffen. (z.B.: die fläche auf der sie sich bewegen in sektoren einteilen, sodass du die kollisionsabfragen nur mit den objekten innerhalb des jeweiligen sektors machst. Techniken, die dir dabei weiterhelfen könnten sind unter anderm Spatial Hashing und Octree(3D)/Quadtree(2D) traversal, einfach mal googlen, findet man sehr viel!)
der pseudocode hat mir damals gute geholfen. Zusammen mit einem waypoint/pathfinding system nimmt dir flocking immerhin ab, dass sie sich gegenseitig ausweichen.
Für eine echtzeit simulation solltest du aber noch einige optimierungen treffen. (z.B.: die fläche auf der sie sich bewegen in sektoren einteilen, sodass du die kollisionsabfragen nur mit den objekten innerhalb des jeweiligen sektors machst. Techniken, die dir dabei weiterhelfen könnten sind unter anderm Spatial Hashing und Octree(3D)/Quadtree(2D) traversal, einfach mal googlen, findet man sehr viel!)
moka schrieb am 27.01.10, 13:17 Uhr:
Für eine echtzeit simulation solltest du aber noch einige optimierungen treffen. (z.B.: die fläche auf der sie sich bewegen in sektoren einteilen, sodass du die kollisionsabfragen nur mit den objekten innerhalb des jeweiligen sektors machst. Techniken, die dir dabei weiterhelfen könnten sind unter anderm Spatial Hashing und Octree(3D)/Quadtree(2D) traversal, einfach mal googlen, findet man sehr viel!)
Darum kümmert sich der Proximitymanager.
espy schrieb am 27.01.10, 13:42 Uhr:
moka schrieb am 27.01.10, 13:17 Uhr:
Für eine echtzeit simulation solltest du aber noch einige optimierungen treffen. (z.B.: die fläche auf der sie sich bewegen in sektoren einteilen, sodass du die kollisionsabfragen nur mit den objekten innerhalb des jeweiligen sektors machst. Techniken, die dir dabei weiterhelfen könnten sind unter anderm Spatial Hashing und Octree(3D)/Quadtree(2D) traversal, einfach mal googlen, findet man sehr viel!)
Darum kümmert sich der Proximitymanager.
keine ahnung was das ist
Editiert: 29.01.10, 17:09 Uhr
vielen dank! ich hab mir ein paar der sachen mal angeguckt, aber ich glaube die performance gibt das nicht her. (isometrische flash auf full-hd hab jetzt was eigenes gebaut – ganz bilig: wegpunkte in ein array geschoben, fertig. sieht ganz ordentlich aus und passt ganz gut zu unserem style.

hier noch ein paar auszüge – 010101!
private const waypoints0:Array = new Array(new Array(-410, -100, 0, 1),new Array(-410, 72, 1, 0),new Array( 100, 72, 0, -1),new Array( 100, -440, -1, 0),new Array(-50, -440, 1, 0) );
und so wird das ganze von den fussgängern verwertet. wenn man das noch optimieren kann – nur her damit!
Spoiler (anzeigen):
private function initialPosition(_pedestrian:IsoSprite):void{var thiswp = wp[0];var nextwp = wp[1];var offset:int = (Math.random() * OFFSET) - (OFFSET / 2);//beam it scotty_pedestrian.moveTo( thiswp[0] + offset, thiswp[1] + offset, 0);//how long to walk: s_maxs_max = Math.abs( thiswp[0] - nextwp[0] ) + Math.abs( thiswp[1] - nextwp[1] );//take care about the right spriteswitchSprite(thiswp[2], thiswp[3]);}private function switchSprite(_xdir:int, _ydir:int):void{if(_ydir>0){this.sprites = [ sprite_a ];}else if(_ydir<0){this.sprites = [ sprite_c ];}else if(_xdir>0){this.sprites = [ sprite_b ];}else if(_xdir<0){this.sprites = [ sprite_d ];}}private function onEnterFrame(evt:ProxyEvent):void{if(s < s_max){move();}else if(wp_i < wp.length-2){wp_i++;s = 0;setSmax();switchSprite(wp[wp_i][2], wp[wp_i][3]);}else{wp_i = 0;s = 0;initialPosition(this);}}private function move():void{var thiswp = wp[wp_i];this.moveTo(this.x + thiswp[2] * SPEED, this.y + thiswp[3] * SPEED, 0);s += SPEED;}private function setSmax():void{





