Suche Kollisionsprüfung Dreieck Dreieck
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
Re: Suche Kollisionsprüfung Dreieck Dreieck
hallo mpz, mit 1,6ghz (notebook,512mb und grafikkarte on board), komme ich auf 65fps.
also eine tolle leistung, was du da rausgeholt hast.
gruss
peter
also eine tolle leistung, was du da rausgeholt hast.
gruss
peter
Re: Suche Kollisionsprüfung Dreieck Dreieck
hier eine Dreieckskollision:
Wie gesagt, einfach aus meiner Routine von oben geschnippelt, sollte dir einiges an Arbeit ersparen 
Sollte extrem schnell sein, eine zusätzliche Optimierung wäre noch eine vorherige rechteck-rechteck Kollisionsprüfung, habe ich der einfachheit halber aber mal weg gelassen.
Code: Alles auswählen
EnableExplicit
Procedure.l col_line_line(x1.f,y1.f,x2.f,y2.f,x3.f,y3.f,x4.f,y4.f)
;check if two lines collide
;modified code from: Stargate (PB Forums)
Protected cross_prod_a.f
Protected cross_prod_b.f
Protected new_vectorX.i
Protected new_VectorY.i
Protected comp.f
cross_prod_a = (x2-x1)*(y4-y3) - (x4-x3)*(y2-y1)
If cross_prod_a
new_vectorX = x3 - x1
new_VectorY = y3 - y1
cross_prod_b = new_vectorX * (y4-y3) - new_VectorY * (x4-x3)
comp = cross_prod_b / cross_prod_a
If comp >= 0 And comp <= 1
cross_prod_b = new_vectorX * (y2-y1) - new_VectorY * (x2-x1)
comp = cross_prod_b / cross_prod_a
If comp >= 0 And comp <= 1
ProcedureReturn #True
EndIf
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l col_point_tri(t1x.f,t1y.f,t2x.f,t2y.f,t3x.f,t3y.f,Px.f,Py.f)
;check if point lies in the triangle
Protected r.f
Protected s.f
Protected result.f
Protected Ax.f = t2x - t1x
Protected Ay.f = t2y - t1y
Protected Bx.f = t3x - t1x
Protected By.f = t3y - t1y
Px - t1x
Py - t1y
If By = 0
By = 0.0001
EndIf
r = (By*Ax-Ay*Bx)
If r
r = (Px*By-Bx*Py)/r
s = (Py-Ay*r)/By
result = r+s
If result <= 1 And result => 0 And r <= 1 And r => 0 And s <= 1 And s => 0
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure collision(a1x.i,a1y.i,a2x.i,a2y.i,a3x.i,a3y.i,b1x.i,b1y.i,b2x.i,b2y.i,b3x.i,b3y.i)
If col_point_tri(a1x,a1y,a2x,a2y,a3x,a3y,b1x,b1y) Or col_point_tri(a1x,a1y,a2x,a2y,a3x,a3y,b2x,b2y) Or col_point_tri(a1x,a1y,a2x,a2y,a3x,a3y,b3x,b3y)
ProcedureReturn #True
ElseIf col_point_tri(b1x,b1y,b2x,b2y,b3x,b3y,a1x,a1y) Or col_point_tri(b1x,b1y,b2x,b2y,b3x,b3y,a2x,a2y) Or col_point_tri(b1x,b1y,b2x,b2y,b3x,b3y,a3x,a3y)
ProcedureReturn #True
ElseIf col_line_line(a1x,a1y,a2x,a2y,b1x,b1y,b2x,b2y) Or col_line_line(a2x,a2y,a3x,a3y,b1x,b1y,b2x,b2y) Or col_line_line(a3x,a3y,a1x,a1y,b1x,b1y,b2x,b2y)
ProcedureReturn #True
ElseIf col_line_line(a1x,a1y,a2x,a2y,b2x,b2y,b3x,b3y) Or col_line_line(a2x,a2y,a3x,a3y,b2x,b2y,b3x,b3y) Or col_line_line(a3x,a3y,a1x,a1y,b2x,b2y,b3x,b3y)
ProcedureReturn #True
ElseIf col_line_line(a1x,a1y,a2x,a2y,b3x,b3y,b1x,b1y) Or col_line_line(a2x,a2y,a3x,a3y,b3x,b3y,b1x,b1y) Or col_line_line(a3x,a3y,a1x,a1y,b3x,b3y,b1x,b1y)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Define a1x.i,a1y.i,a2x.i,a2y.i,a3x.i,a3y.i,b1x.i,b1y.i,b2x.i,b2y.i,b3x.i,b3y.i
;no hit
a1x = 1 : a1y = 1
a2x = 3 : a2y = 4
a3x = 5 : a3y = 1
b1x = 4 : b1y = 3
b2x = 9 : b2y = 3
b3x = 6 : b3y = 0
Debug collision(a1x,a1y,a2x,a2y,a3x,a3y,b1x,b1y,b2x,b2y,b3x,b3y)
;hit (one edge in another triangel)
a1x = 1 : a1y = 1
a2x = 4 : a2y = 4
a3x = 5 : a3y = 1
b1x = 3 : b1y = 2
b2x = 7 : b2y = 2
b3x = 6 : b3y = 4
Debug collision(a1x,a1y,a2x,a2y,a3x,a3y,b1x,b1y,b2x,b2y,b3x,b3y)
;hit (only crossing lines)
a1x = 1 : a1y = 1
a2x = 3 : a2y = 4
a3x = 5 : a3y = 1
b1x = 1 : b1y = 3
b2x = 5 : b2y = 3
b3x = 3 : b3y = 0
Debug collision(a1x,a1y,a2x,a2y,a3x,a3y,b1x,b1y,b2x,b2y,b3x,b3y)
Sollte extrem schnell sein, eine zusätzliche Optimierung wäre noch eine vorherige rechteck-rechteck Kollisionsprüfung, habe ich der einfachheit halber aber mal weg gelassen.
pb 4.51
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Re: Suche Kollisionsprüfung Dreieck Dreieck
Hi Gnasen,
da kann ich mich nur bedanken...
Grüß Michael
da kann ich mich nur bedanken...
Grüß Michael
Working on
- LibSGD - MP3D Engine - 
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
Re: Suche Kollisionsprüfung Dreieck Dreieck
Also bei mir läuft das von "gnasen" nicht.
..absturz.
Gruss
..absturz.
Gruss
Re: Suche Kollisionsprüfung Dreieck Dreieck
Wären etwas mehr Informationen möglich? Denn ausser ein paar Grundrechenarten und Prozeduraufrufen passiert da nicht viel, was absturzen könnte. Was sagt denn der Debugger?
pb 4.51
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Suche Kollisionsprüfung Dreieck Dreieck
... oha ... 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Suche Kollisionsprüfung Dreieck Dreieck
frage:
wieso braucht dein Programm so drigend:
wieso braucht dein Programm so drigend:
das sind doch nur Sprites ...---------------------------
test3.exe - Komponente nicht gefunden
---------------------------
Die Anwendung konnte nicht gestartet werden, weil d3dx9_38.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben.
---------------------------
OK
---------------------------
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
Re: Suche Kollisionsprüfung Dreieck Dreieck
Dat is se.....veraltete funktion "Countlist()" verwendet
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
Re: Suche Kollisionsprüfung Dreieck Dreieck
...aber "texturen"...das sind doch nur Sprites ...
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Suche Kollisionsprüfung Dreieck Dreieck
@STARGÅTE
wenn ich mich nicht täusche, benutzt seine Engine DX9 direkt und nicht über PB.
die DLLs von DX müssen gegebenenfalls mal upgedatet werden.
als ich vor ner Weile Civ4 gepatcht hab, musste ich ein halbes Dutzend DLLs nachinstallieren, weil mein letztes DX9 von ner älteren CD war.
wenn ich mich nicht täusche, benutzt seine Engine DX9 direkt und nicht über PB.
die DLLs von DX müssen gegebenenfalls mal upgedatet werden.
als ich vor ner Weile Civ4 gepatcht hab, musste ich ein halbes Dutzend DLLs nachinstallieren, weil mein letztes DX9 von ner älteren CD war.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.