Registriert: Do Feb 21, 2008 10:49 Beiträge: 55 Wohnort: Dresden
Programmiersprache: FPC/Linux
so, da ich (wieder)einsteiger bin (über 2 jahre abstinenz) poste ich mal im einsteigerforum.
ich lade mein terrain aus einer heightmap, dann packe ich da erstmal noch n paar bäume und wände hin. nachdem die objekte initialisiert sind, kommt alles in einen octree (ist alles mehr oder weniger aus den hiesigen tutorials) und dann rattert mein programm die gesammte heigtmap durch und setzt in einem 4x4 raster waypoints. verbindungen setzt er immer zwischen waypoints und ihren 8 nachbarn. der erkennt auch wenn sich zwischen den waypoints etwas massives im weg steht (ray-triangle-intersect ist meine standard-kollisionsabfrage) oder der anstieg zu steil ist und setzt dann die verbindung gegebenenfalls nicht.
dann habe ich mir nen a* gebastelt, um routen von punkt a nach b zu ermitteln. das klappt alles wunderbar. ich kann auch in einer kamerafahrt die route ablatschen lassen und der dreht sich selbstständig und alles.
jetzt hätte ich gerne gegner da hingesetzt, denen ich eine route gebe, die sie dann immer ablatschen. das ist im prinzip so schon fertig. ich will aber, dass wenn ein gegner sichtkontakt mit mir (kamera, bzw kugel um die kamera) seine route verlässt und mir auf den keks geht (zb bis er mich 5 sekunden lang aus den augen verloren hat und wieder seine gewohnte route aufnimmt).
wie mache ich das am besten mit dem "gegner kann mich sehen"? mein erster gedanke wäre die modelview matrix so zu setzen, als wäre der gegner die kamera und dann gucken, ob die kugel um die kamera in seinen frustum ist. gegebenenfalls mittels ray-triangle-intersect weiter prüfen, ob dem vektor (gegner-kamera) was im weg steht. wie würdet ihr das machen? ich brauche im prinzip nur eine "gegner sieht mich"-erkennung, dass verfolgen bekomme ich sicherlich alleine hin, bzw. wenn nicht, werde ich euch schon noch damit nerven.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Eine sehr einfache Möglichkeit wäre, jedem Gegner einen LookVector zu geben, der halt in die Richtung zeigt, in die er gerade sieht. Jetzt rechnest du die Position von dir minus die Position des Gegners und normalisierst diesen Verbindungsvektor. Das Punktprodukt aus dem resultierenden und dem Lookvektor ergibt den Cosinus des Winkels zwischen ihnen. Wenn der größer als ca. 0.707 ist, ist der Winkel beispielsweise kleiner als 45°.
Das so entstandene "Frustum" wäre zwar nicht eckig sondern rund, allerdings entspricht ja beides nicht wirklich der Realität, also dem "menschlichen Viewfrustum".
edit: achso, den Verbindungsvektor müsste man natürlich uaf Kollision prüfen, denn sonst könnten deine Bots ja durch Wände sehen. Hat allerdings den Nachteil, dass dein Bot nur deinen Mittelpunkt sieht und nicht deinen Arm oder sowas.
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:44, insgesamt 1-mal geändert.
Registriert: Do Feb 21, 2008 10:49 Beiträge: 55 Wohnort: Dresden
Programmiersprache: FPC/Linux
die idee gefällt mir schon mal ganz gut.
und zur zeit hat die kamera eh kein physisches objekt (ego perspektive, war bis zum jetzigen zeitpunkt also sinnfrei da noch n objekt mitzschleppen), der sichtbarkeitstest mit dem mittelpunkt reicht also zur not. hat vor allem den vorteil, dass ich relativ leicht einige bots mit tunnelblick bauen könnte, also was weiß ich, einen mit 10° oder so.
Eine Möglichkeit für eine exakte Sichtbarkeitsberechnung wäre die Szene aus Sicht des Gegners zu rendern. Zuerst renderst du die Level-Geometrie ohne Texturen/Effekte um den Z-Buffer zu füllen. Am besten glColorMask benutzen...du brauchst ja nur den Z-Buffer. Anschließend renderst du das Objekt von dem du wissen möchtest ob es für den Gegner sichtbar ist. Dabei benutzt du aber einen Occlusion-Query um die Anzahl der gerenderten Pixel zu zählen. Wenn mehr als ein Pixel gerendert wurde ist das Objekt offensichtlich sichtbar. Wenn du möchtest kannst du auch sagen das der Gegner z.B. erst ab 20 Pixeln "sichtbar" ist.
Die Verwendung eines Framebufferobjektes (FBO) ist hier empfehlenswert. Damit könnte man dann z.B. reduzierter Auflösung rendern. Der User bekommt das ja nicht zu Gesicht, d.h. man muss hier nicht unbedingt in 1280x1024 rendern sondern 640x480 reicht vielleicht auch völlig.
Es sollte klar sein das dieses Verfahren wesentlich aufwendiger ist als einfach nur einen Winkel zwischen Vektoren zu berechnen, dafür kann man sich aber gut hinter Kisten oder einem Baum verstecken
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.