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

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Akiba

Betreff: 3D-Kollisionsabfrage ... wie soll man's machen?

BeitragSa, Apr 16, 2011 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 16, 2011 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 17, 2011 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 17, 2011 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
So ... soll jetzt tatsächlich jedes einzelne Objekt auf Kollision untersucht werden mit dem Collisions-Befehl?
Collisions wird ein einziges Mal ausgeführt, nämlich vor der Hauptschleife.
Du kannst mehreren Objekten den gleichen Typ zuweisen (EntityType, dann brauchst du auch nicht so viele Collisions-Anweisungen.
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

BeitragMo, Apr 18, 2011 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 18, 2011 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy


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

BeitragDi, Apr 19, 2011 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDi, Apr 19, 2011 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 19, 2011 8:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDi, Apr 19, 2011 8:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ichg glaube dass der Nutzen nicht den Aufwand rechtfertigt, aber wenn Du meinst versuch dich nur Wink
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

BeitragDi, Apr 19, 2011 9:00
Antworten mit Zitat
Benutzer-Profile anzeigen
so übermotiviert bin ich dann doch nicht Laughing
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

BeitragDi, Apr 19, 2011 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Cool

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

ToeB

BeitragDi, Apr 19, 2011 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ... Very Happy


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

BeitragDi, Apr 19, 2011 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 19, 2011 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
nein das klingt ziemlich nach bullshit ^^
Rechtschreibfehler gelten der allgemeinen Belustigung!

TimBo

BeitragDi, Apr 19, 2011 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDi, Apr 19, 2011 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 19, 2011 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@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.

BladeRunner

Moderator

BeitragDi, Apr 19, 2011 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 19, 2011 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group