Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Erkennen wenn object den Boden berührt (OpenGL) (https://www.delphipraxis.net/117382-erkennen-wenn-object-den-boden-beruehrt-opengl.html)

EWeiss 17. Jul 2008 00:09


Erkennen wenn object den Boden berührt (OpenGL)
 
Bestimmt wieder ein frage für little dave ;)

Wie der thread schon sagt möchte ich erkennen wenn meine CD den Boden berührt auf dem die Albums sich drehen.
Ich denke das gäbe einen feinen Effekt wenn ich dann diesen zu Wasser werden lasse.

hier wird der Quader erstellt
Delphi-Quellcode:
begin

  glDepthMask(ByteBool(GL_TRUE));

  // Kamera ausrichten, damit man was sieht
  glTranslatef(0, -7, -30);

  // Maus verarbeiten
  if FMousePos.X > 0 then
  begin
  if FMousePos.X < 30 then
     ListAngle := ListAngle - pi/4 * ADeltaTime
  else
  if FMousePos.X > _FNormal.Image1.Width - 30 then
     ListAngle := ListAngle + pi/4 * ADeltaTime;
  end;

  // Wichtig für die Spiegelung
  glDisable(GL_CULL_FACE);

  glEnable(GL_BLEND);
  // Jetzt spiegel wir alles an der x-z-Ebene
  glScalef(1, -1, 1);
  // Jetzt zeichnen wir zuerst die Reflektionen der Quads
  DrawQuads();

  glDisable(GL_BLEND);
  // Dann spiegel wir wieder zurück
  glScalef(1, -1, 1);
  // und zeichnen die eigentlichen Quads
  DrawQuads();

  // Jetzt brauchen wir Blending
  glEnable(GL_BLEND);
  // nun die Blending-Funktion setzen
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  glBegin(GL_QUADS);
    glColor4f(0.0, 0.0, 0.0, 0.7); glVertex3f(-15, 0, 15);
    glColor4f(0.0, 0.0, 0.0, 0.7); glVertex3f(-15, 0,-15);
    glColor4f(0.0, 0.0, 0.0, 0.7); glVertex3f( 15, 0,-15);
    glColor4f(0.0, 0.0, 0.0, 0.7); glVertex3f( 15, 0, 15);
  glEnd();
  glDisable(GL_BLEND);

  glLoadIdentity;

end;
der unterste teil.

EDIT:
Lese mich mal im Wiki ein ;)

gruss Emil

DGL-luke 17. Jul 2008 06:57

Re: Erkennen wenn object den Boden berührt (OpenGL)
 
Die glColor-Aufrufe sehen übrigens recht redundant aus ;-)

Also, das was du hier machst, ist ja praktisch Collision Detection.

Such dir da n Algorithmus aus dem Internet, um einen Kreis gegen eine Oberfläche zu kollidieren.

Allerdings würde ich dir empfehlen, dafür Metaobjekte zu definieren, und nicht direkt mit den Grafikroutinen zu arbeiten.

Allerdings sehe ich hier auch nirgends, wo du die Position der CD festlegst...

EWeiss 17. Jul 2008 07:01

Re: Erkennen wenn object den Boden berührt (OpenGL)
 
Zitat:

Zitat von DGL-luke
Die glColor-Aufrufe sehen übrigens recht redundant aus ;-)

Also, das was du hier machst, ist ja praktisch Collision Detection.

Such dir da n Algorithmus aus dem Internet, um einen Kreis gegen eine Oberfläche zu kollidieren.

Allerdings würde ich dir empfehlen, dafür Metaobjekte zu definieren, und nicht direkt mit den Grafikroutinen zu arbeiten.

Allerdings sehe ich hier auch nirgends, wo du die Position der CD festlegst...

Zitat:

Die glColor-Aufrufe sehen übrigens recht redundant aus
ja könnte praktisch so vorgehen ;)

Delphi-Quellcode:
  glBegin(GL_QUADS);
    glColor4f(0.0, 0.0, 0.0, 0.7);
    glVertex3f(-15, 0, 15);
    glVertex3f(-15, 0,-15);
    glVertex3f( 15, 0,-15);
    glVertex3f( 15, 0, 15);
  glEnd();
  glDisable(GL_BLEND);
Da eh alle gleich sind habe das versäumt war vorher nicht so
Durch das ändern weil sich die Farben immer verändert haben habe ich die 3 zeilen nicht entfernt :wall:
Danke für den Hinweis.

Ja werd da mla im Internet was suchen da was selbst zu machen wäre dann doch zu aufwendig.

EDIT:
Allerdings sehe ich hier auch nirgends, wo du die Position der CD festlegst...
Die hat ja keinen festen punkt da sie routiert.

Aber hier wird sie festgelegt wenn du das meinst

Delphi-Quellcode:
function RenderCompactDisc(This_Mod: PWinAMPVisModule): integer;
Var
  Y       : GLFloat;
  I       : integer;

begin
 
  // Reset the matrix:
  glLoadIdentity;

  Inc(rDisk);
  if rDisk > 3780 then
    rDisk := 180;


  BackGroundBeat := 0;
  for I := 0 to 9 do
    BackGroundBeat := BackgroundBeat + This_Mod^.spectrumData[0][I] +
                                       This_Mod^.spectrumData[1][I];
  BackgroundBeat := BackgroundBeat / 10 / 32;

  if BounceBeat then
    Y := BackGroundBeat
  else
    Y := 0;

  if ShowCover then
    // Move our cd 34 units into the screen:
    glTranslatef(0, 4, -34 +Y)
  else
    glTranslatef(0, 0, -DiskPosition+Y);

  if rDisk > 180 then // If more than 2 seconds has passed:
  begin
    // Rotate our geometry a little around each axis:
    glRotatef((rDisk - 180+Y) * 0.8 , 1, 0, 0);
    glRotatef((rDisk - 180+Y) * 1 , 0, 1, 0);
    glRotatef((rDisk - 180+Y) * 0.1 , 0, 0, 1);
  end;

  Result := 0;

end;
gruss Emil

littleDave 17. Jul 2008 08:39

Re: Erkennen wenn object den Boden berührt (OpenGL)
 
Zitat:

Zitat von EWeiss
Bestimmt wieder ein frage für little dave ;)

Welch eine Ehre :-)

Zitat:

Zitat von EWeiss
Wie der thread schon sagt möchte ich erkennen wenn meine CD den Boden berührt auf dem die Albums sich drehen.
Ich denke das gäbe einen feinen Effekt wenn ich dann diesen zu Wasser werden lasse.

Das ist an sich ein schon etwas aufwendigerer Effekt - dafür musst du bei dir wahrscheinlich einiges ändern: Das Grundprinzip wäre folgendes:
Zuerst solltest du die Reflektionen mit der finalen Rotation und Perspektive in eine Textur rendern (z.B. per FBO oder per glCopyTexSubImage). Diese Textur ist dann der "Inhalt" deiner Spiegelfläche, welche du dann mittels eines/mehrerer Quads zeichnest.
Da du jetzt den Inhalt in einer Textur hast, kannst du entweder per Shader oder per simples Vertex-Transforming eine Wasseroberfläche simulieren. Per Shader wäre zwar die modernere Variante, ist aber auch komplizierter da du die Wellen erst als Heightmap-Textur dynamisch erstellen musst und diese dann an den Shader weitergibst. Das Resultat kann sich dann aber sehen lassen. Als Beispiel mal ein Screenshot aus meiner Engine:
http://wiki.delphigl.com/images/thum...rial_step3.jpg

Über den genauen Ablauf des Render-Vorgangs gibt es hier ein sehr gutes Tutorial.

Wenn du aber nicht so sehr auf Shader stehen solltest (also dann die Vertex-Methode benutzen würdest), könntest du ja diese Methode von Sulaco etwas anpassen.

Und die Überprüfung, ob ein Objekt den Boden berührt, musst du komplett selbst übernehmen - für sowas ist OpenGL nicht da. Aber DGL-Luke hat ja schon den richtigen Ansatz für dich geliefert (wobei eine Sphere hier nicht so gut geeignet ist).
Für deinen Boden erstellst du zunächst eine Ebenengleichung mit a*x + b*y + c*z + d = 0, wobei a, b und c die einzelnen Komponenten des Normalenvektors der Ebene sind. In diese Gleichung setzt du dann einfach die Position des Mittelpunktes deines Objektes ein und bekommst dann den Abstand des Mittelpunktes zur Ebene. Wenn dieser Abstand jetzt kleiner-gleich der halben Höhe des Objektes, berührt dein Objekt den Boden.
Hoffe du verstehst wie ich das meine.

Grüße

EWeiss 17. Jul 2008 08:48

Re: Erkennen wenn object den Boden berührt (OpenGL)
 
Zitat:

Hoffe du verstehst wie ich das meine.
Ich verstehe was du meinst :)
Das sample im Wiki habe ich auch schon gelesen feine sache.
Denke aber das ich es, wenn realisierbar in der art wie bei Sulaco machen werde.
Es muss nicht so hundert prozentig sein wie in deinem Beispiel lediglich eine kleine
zusätliche spielerei das sich da was tut wenn die CD aufsetzt.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz