Seite 1 von 1

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

Verfasst: 13.02.2020 01:46
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

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 13.02.2020 15:48
von alter Mann
Dazu müsste man erst einmal wissen, wie Deine 3D-Daten aussehen/aufgebaut sind.

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 13.02.2020 16:32
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 :-)

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 14.02.2020 00:35
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

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 14.02.2020 23:40
von tft
Hallo,

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

Gruss TFT

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 15.02.2020 00:27
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

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 15.02.2020 13:22
von alter Mann
...ne, gilt für alle Double-Werte. Abs() ist nur für den Abstand zum Quadermittelpunkt als Differenz zwischen 2 Werten.

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 12.03.2020 20:51
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

Re: Funktion zur 3D Collisions Erkennung gesucht.

Verfasst: 16.03.2020 11:14
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