(Gelöst) Funktion zur 3D Collisions Erkennung gesucht.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

(Gelöst) Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Funktion zur 3D Collisions Erkennung gesucht.

Hallo,

wie der Titel schon sagt, benötige ich eine Funktion, die ohne die 3D Funktionen von Oggre Auskommt.
Etwas in dieser art. Leider bekomme ich das nicht zum Funktionieren. Im Netz habe ich folgendes gefunden.

Code: Alles auswählen

  ;function intersect(a, b) {
  ;  Return (a.minX <= b.maxX && a.maxX >= b.minX) && (a.minY <= b.maxY && a.maxY >= b.minY) && (a.minZ <= b.maxZ && a.maxZ >= b.minZ);
  
  ;  public Static boolean checkCollision(ObjectBox a, ObjectBox b){
  ; {
  ;   //check the X axis
  ;   If(Math.abs(a.getX() - b.getX()) < a.getSizeX() + b.getSizeX())
  ;   {
  ;      //check the Y axis
  ;      If(Math.abs(a.getY() - b.getY()) < a.getSizeY() + b.getSizeY())
   ;     {
   ;         //check the Z axis
   ;         If(Math.abs(a.getZ() - b.getZ()) < a.getSizeZ() + b.getSizeZ())
   ;         {
   ;            Return true;
   ;         }
   ;     }
   ;  }
    ;
   ;Return false;
   ; } 
und dieses, was eine Kugel Cube Collision detektieren kann.

Code: Alles auswählen

     ;function intersect(sphere, box) {
      ;  // get box closest point To sphere center by clamping
      ;  var x = Math.max(box.minX, Math.min(sphere.x, box.maxX));
      ;  var y = Math.max(box.minY, Math.min(sphere.y, box.maxY));
      ;  var z = Math.max(box.minZ, Math.min(sphere.z, box.maxZ));
      ;
      ;  // this is the same As isPointInsideSphere
      ;  var distance = Math.sqrt((x - sphere.x) * (x - sphere.x) +
      ;                           (y - sphere.y) * (y - sphere.y) +
      ;                           (z - sphere.z) * (z - sphere.z));
      ;  
      ;  Return distance < sphere.radius;
Hat jemand zufällig etwas wo er weis das es Funktioniert? Wenn ich nicht schon graue Haar hätte .... na ihr wisst schon.

Gruss TFT
Zuletzt geändert von tft am 16.03.2020 11:15, insgesamt 1-mal geändert.
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von alter Mann »

Dazu müsste man erst einmal wissen, wie Deine 3D-Daten aussehen/aufgebaut sind.
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Hallo,

es sind immer Quader, die durch ihre X/Y/Z Position bekannt sind. Und eine Ausdehnung D haben. Das Objekt das sich bewegt. Kann eine Kugel oder ein Quader sein. Wobei sich dieser nur Verschiebt, und nicht rotiert. Ich habe einen
Alte Position X/Y/Z und eine Neue. Bei Kollision muss erkannt werden in welche Richtung ein Bewegung möglich ist, oder auf 0 gesetzt wird. Also benötige ich eine Berechnung, ob sich 2 Volumen überschneiden. Und wenn ja, muss der bewegungs Vector angepast werden. Das ganze mit einer Liste an Objekte.

Alles unklar ? ... genau wie bei mir :-)
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von alter Mann »

Code: Alles auswählen

Procedure.i KollisionQuaderQuader(dX1m.d,dY1m.d,dZ1m.d,dL1x.d,dL1y.d,dL1z.d,dX2m.d,dY2m.d,dZ2m.d,dL2x.d,dL2y.d,dL2z.d)
  ; dX1m,dY1m,dZ1m - Mittelpunkt 1.Quader
  ; dL1x,dL1y,dL1z - Länge,Breite,Höhe 1.Quader
  ; dX2m,dY2m,dZ2m - Mittelpunkt 2.Quader
  ; dL2x,dL2y,dL2z - Länge,Breite,Höhe 2.Quader
  
  If Abs(dX1m-dX2m)<(dL1x+dL2x)*0.5 And Abs(dY1m-dY2m)<(dL1y+dL2y)*0.5 And Abs(dZ1m-dZ2m)<(dL1z+dL2z)*0.5
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
  
EndProcedure

Procedure.i KollisionQuaderKugel(dX1m.d,dY1m.d,dZ1m.d,dL1x.d,dL1y.d,dL1z.d,dX2m.d,dY2m.d,dZ2m.d,dR2.d)
  ; dX1m,dY1m,dZ1m - Mittelpunkt Quader
  ; dL1x,dL1y,dL1z - Länge,Breite,Höhe Quader
  ; dX2m,dY2m,dZ2m - Mittelpunkt Kugel
  ; dR2            - Radius Kugel
  Protected dQx.d,dQy.d,dQz.d
  If dX1m-dL1x*0.5>dX2m : dQx = dX1m-dL1x*0.5 : ElseIf dX1m+dL1x*0.5<dX2m : dQx = dX1m+dL1x*0.5 : Else : dQx = dX2m : EndIf
  If dY1m-dL1y*0.5>dX2m : dQy = dY1m-dL1y*0.5 : ElseIf dY1m+dL1y*0.5<dY2m : dQy = dY1m+dL1y*0.5 : Else : dQy = dY2m : EndIf
  If dZ1m-dL1z*0.5>dX2m : dQz = dZ1m-dL1z*0.5 : ElseIf dZ1m+dL1z*0.5<dZ2m : dQz = dZ1m+dL1z*0.5 : Else : dQz = dZ2m : EndIf
  dQx - dX2m
  dQy - dY2m
  qQz - dZ2m
  If dQx*dQx+dQy*dQy+dQz*dQz < dR2*dR2 : ProcedureReturn #True : EndIf
  ProcedureReturn #False
EndProcedure
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Hallo,

danke!!!!! Ich werde es sobald wie möglich ausprobieren.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Hallo,

beim durchschauen fiel mir auf, das du Vorzeichenlose Double verwendest. Gehe ich richtig in der annahm, das diese Formeln nur mit Positiven Zahlen Funktionieren?
Oder ist das eher ein Automatschischen ABS?

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von alter Mann »

...ne, gilt für alle Double-Werte. Abs() ist nur für den Abstand zum Quadermittelpunkt als Differenz zwischen 2 Werten.
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Hallo,

wollte mal ein Feedback geben. Die Quader/Quader Erkennung funktioniert so lala.
Aber Quader/Kugel benimmt sich als wäre es Quader/Quader ebenfals so lala.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: Funktion zur 3D Collisions Erkennung gesucht.

Beitrag von tft »

Hallo,

für diejenigen die es Interessiert.

Ich habe mich ein wenig über die Funktionsweise der Collisions Erkennungs Rutine gewundert. Aber nach etlichen
Versuchen habe ich begriffen. Das es sich dabei um eine Volumen Berechnung handelt. Die nur detektiert, ob sich Volumina
überschneiden. Um daraus eine 3D Collisionserkennung zu machen braucht es noch die Vector bestimmung und die Reaktion darauf.

Schluss endlich habe ich mich dazu entschlossen, 6 Bumper um meine Bewegte Position zu Platzieren die nur dann geprüft werden,
wenn die Bewegungs Richtung Ihrer Position entspricht. Also immer höchsten 3. Jeder Bumper blockiert nur in die Richtung des
Bewegungs Vectors. Funktioniert super, und lässt sich sehr Preziese einsetzen.

An dieser Stelle nochmal danke für die Rutine.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Antworten