3D-Kollisionsabfrage ... wie soll man's machen?
Übersicht

![]() |
AkibaBetreff: 3D-Kollisionsabfrage ... wie soll man's machen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute!
Ich beschäftige mich seit einigen Tagen mit den 3D-Befehlen von B3D. Klappt auch alles ganz gut. Aber die Kollisionsgeschichte hat mich etwas verwirrt. Mal ein Beispiel: Wir haben ein Level mit 1.000 Objekten, die auf Kollision überprüft werden müssen. Dazu gehören Wände, Treppen, Decken, umherwanderne Viecher und natürlich Details. So ... soll jetzt tatsächlich jedes einzelne Objekt auf Kollision untersucht werden mit dem Collisions-Befehl? Eine weitere Frage: EntityRadius. Wie findet man heraus, welcher Radius am besten zu einem Entity passt? Wie sollte dieser Umfang außerdem oval werden? Wäre dankbar wenn ihr mir weiterhelfen könntet oder vielleicht auch noch auf manch problematisches hinweisen könntet =) |
||
Luigi, man wendet sich nich gegen Familie... |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
du kannst ja mit einer einfachen Rechnung den Abstand schätzen und schauen , ob eine Kollisionsabfrage überhaupt sinnvoll ist.
ganz genau : sqr(a²+b²+c²) sqr( ) kannste aber auch weglassen. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
alternativ gibts da einen ganz billigen Trick zu.
Verstecke die Objekte die Momentan eh nicht gesehen werden können. Am Besten du unterteilst deine Objekte in Gruppen.. und weist diese jeweils einen Pivot zu. Nun musst du dein Level logisch so unterteilen, dass es sich in sinnvolle "sektoren" gliedert. Sektoren(mit dessen Gruppen) die gerade nicht gesehen werden können, werden ausgeblendet. Bei Versteckten Objekten findet keine Kollisionprüfung statt. So werden aus 1000 Objekten vll 15 Sektoren. Betritt nun ein Spieler einen Sektor wird die dazugehörige Gruppe auch wieder dargestellt. 1000 Objekte / 15 Sektoren = 67 Objekte zu Prüfen.. Benötigte Wunderbefehle: Code: [AUSKLAPPEN] Hideentity Showentity Entitydistance Entityparent CreatePivot Ich selber habe soetwas ähnliches bereits in meinem Aktuellen Projekt verwendet. Nur ich brauche das um dynamisch die 7 Hardwarelichter von BB zu verwalten. ~Edit~ du kannst auch mehrere Pivots für eine Gruppe setzen. Und diese als "Auslöser" zum Anzeigen oder verstecken benutzen. Um das umzusetzen brauchst du einen Master Pivot.. welcher das Parent von allen Objekten ist. Löst nun einer der Auslöser Pivots aus, so wird der Master mit sammt allen Unterobjekten versteckt/gezeigt. Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
- Zuletzt bearbeitet von Dottakopf am Di, Apr 19, 2011 11:50, insgesamt einmal bearbeitet
![]() |
blackgecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: So ... soll jetzt tatsächlich jedes einzelne Objekt auf Kollision untersucht werden mit dem Collisions-Befehl? Collisions![]() Du kannst mehreren Objekten den gleichen Typ zuweisen (EntityType ![]() |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
![]() |
Akiba |
![]() Antworten mit Zitat ![]() |
---|---|---|
Leute, Danke für eure Hilfe, das wird mir auf jeden Fall weiterhelfen. Insbesondere der Beitrag von Dottakopf, aber auch die der anderen!
Hat jemand eine Idee wegen meiner Frage zu EntityRadius? (Wie findet man heraus, welcher Radius am besten zu einem Entity passt? Wie sollte dieser Umfang außerdem oval werden?) LG Akiba |
||
Luigi, man wendet sich nich gegen Familie... |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
entityradius, lässt sich am leichtesten nachvollziehen in dem man es einfach visuell darstellt.
Einfach eine Spere in den Mittelpunkt des gewünschten objektes setzen, Mithilfe von entity Entityalpha das teil durchsichtig machen und fertig. Für bewegliche Objekte hängste die sphere als child an das sich bewegende Objekt. (scaleenttiy der Sphere so groß wie entityradius setzen...) Alternativ gibts ja auch noch entitybox. Bin nicht sicher wie der befehlt und parameter heißt. Hilfe... hilft ![]() der Beitrag von Blackgecko sollte aber die simplere lösung sein. Jetzt musst du nur noch die zu rendernden Polys im auge behalten. |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe noch eine Idee.
Was ist, wenn man die Objekte nach Abständen zum Spieler sortiert? Dann könnte man die Liste von nah bis fern durchgehen und nur bis zu einem bestimmten Abstand prüfen. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei vielen Objekten ist das wohl viel zu aufwendig, und je nach Levelarchitektur auch nicht praktizierbar. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja , wir haben ja schon eine relativ gut-sortierte Liste, da man ja bestimmt nicht in jedem Frame woanders hinfliegt. Dann muss man quasi doch nur diese Liste ausbessern und das ist doch schnell möglich.
Wenn man sagt, ok, die Teile, die jetzt 10 Einheiten weit weg sind, prüfe ich frühstens in 20 Frames wieder, hat man ja Rechenleistung gespart. Dafür braucht man mehr Speicher und es wird alles ungenauer, wenn man mit highspeed durch den Raum jagt. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ichg glaube dass der Nutzen nicht den Aufwand rechtfertigt, aber wenn Du meinst versuch dich nur ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
so übermotiviert bin ich dann doch nicht ![]() |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um zu ermitteln welche Objekte nun näher sind als andere, um anschließend deine Liste zu sortieren, und dann nur auf die nächstgelegensten Objekte zu Prüfen setzt leider vorraus, dass du immer wieder alle Objekte mit deiner Position vergleichen musst.
Also ... nicht wirklich sinnvoll um mehr FPS zu erzeugen. Allgemein möchte ich noch hinzufügen, dass Entitydistance ein recht langsamer befehl ist. Und übermäßiger einsatz in schleifen allgemein als "zu vermeiden" gilt ![]() Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kommt drauf an. Wenn man die Liste am anfang aufsetzt und dann die Sortierung mit der Kollisionsprüfung verbindet, sollte es entweder schneller oder zumindest gleichschnell bleiben.
Vielleicht probier ich das mal aus ... ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
oder man macht jedem Objekt eine Zeitangabe, wann es frühstens das nächste mal geprüft werden sollte.
So kann man auch Zeit sparen. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein das klingt ziemlich nach bullshit ^^ | ||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
und wie stellst du dir die Kollisionsabfrage in einem RPG vor ? | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Timbo, eine Zeitangabe? Anhand welcher Faktoren willst Du denn diese Zeit festlegen? Und wenn die Zeit noch nicht rum ist und trotzdem eine Kollision stattfinden könnte dann findet eben keine statt? Willkommen in der Wunderwelt der strange Bugs.
Ab davon geht das hier kilometerweit an der Ursprungsfrage vorbei. Wenn Du was funktionierendes vorzuweisen hast, was dem Fragesteller wirklich hilft: bitte gern. Aber diese theoretischen Blubberblasen helfen niemandem weiter. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BladeRunner
ich hätte der Distanz eine Zeit zugeordnet, mit Hilfe der Geschwindigkeit des Gamers. Zitat: Geschwindigkeit = strecke / zeit
=> zeit = strecke/ geschwindigkeit (kennt man ja alles schon) wenn die Geschwindigkeit ein Maximum hat, sagen wir 5 Einheiten/Sekunde. Kann man anhand der Strecke eine Zeit herleiten. Damit auch ja keine Bugs entstehen, kann man von der Zeit noch ne Sekunde abziehen, dann wird schon 60 Frames vor der frühsten Ankunft damit gerechnet. So jetzt kann man doch prüfen, ob die Zeit schon überschritten wurde oder nicht. Das ist um einiges schneller als den Abstand jedesmal aufs neue auszurechnen. Ist die Zeit überschritten muss entweder auf eine Kollision geprüft werden und ihr eine neue Zeit zugeordnet werden. Vorraussetzung ist, dass man eine maximale Geschwindigkeit hat. Soll ich das schnell umsetzen oder was meinst du mit funktionierendes vozuweisen habe? |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube halt immernoch das der Verwaltungsaufwand für all die Objekte das Maß des Nutzens weit übersteigt. Zudem halte ich es weiterhin für fehleranfällig, wenn auch durch die vorgeschlagenen Abzüge etwas Spielraum geschaffen wird.
Du musst wenn Du eine Zeitbindung anstrebst alle Objekte auf die abgelaufene Zeit prüfen. Macht bei n Objekten n Zeitmessungen (eine Subtraktion im Wesentlichen) PLUS die Anzahl der zu prüfenden Obekte *Pythagoras oder zumindest dessen Näherung ((x*x)+(y*y)). Ohne die Zeitbindung sind es eben n Pythagorasprüfungen bzw. deren Annäherung. Multiplikationen sind auf modernen Architekturen billig, daher kosten sie sehr wenig Zeit. Ich glaube Du müsstest eine riesige Anzahl an Objekten (im Millionenbereich) haben bis da eine ernsthafte Zeitproblematik auftritt, und wenn Du soviele Objekte hast, hast Du deine Performanceprobleme schon an ganz anderer Stelle. Was den Funktionsbeweis angeht muss ich mich bei Dir entschuldigen, ich glaubte du wolltest Zeitprüfung und Listensortierung kombinieren, was zum einen komplex und zum andern nicht zielführend wäre. Dennoch denke ich dass ein simples "Bist du in Kollisionsreichweite?" mit allen Objekten die gangbarste Lösung ist. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein das war eine neue Idee von mir. Was man hätte machen können, wäre die Objekte nach der Zeit zu sortieren. Dann hat man nur die Prüfung von Objekten, die in der Edit:(zeitlich gesehen) Nähe sind. Da die in der Liste folgenden Objekte eine noch größere Zeit haben müssen.
Aber das führt zu weit. Selbst würde ich es wahrscheinlich auch nicht machen (wollen), nur mal als Idee, falls man echt ein "Zeitproblem" hat. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group