Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:06

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Schuss rotieren
BeitragVerfasst: Sa Mai 01, 2004 23:23 
Offline
DGL Member

Registriert: Sa Mär 20, 2004 22:48
Beiträge: 104
Ich habe ein kleines Problem: Ich will mit ein paar Freunden ein Spiel proggen. Da soll man dann von der Seite etwas von oben mit einem kleinen Männchen rumrennen und Schießen (ein Soldat-Klon, fals das Game jemand kennt). Sieht bis jetzt eigentlich schon alles wunderbar aus, aber jetzt habe ich ein Problem: Ich habe ein Projektil, das sich auf eine bestimmte Position zubewegen soll (auf was ich hinauswill, ist, dass man später mit der Maus zielen kann). Wie verknüpfe ich jetzt die Translation des Projektils mit der Position eines Vertexes? Wie kann ich ausserdem ein längeres Projektil, z.B. einen Laserstrahl, so rotieren, dass es genau in Richtung des Punktes zeigt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schuss rotieren
BeitragVerfasst: So Mai 02, 2004 11:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Gran hat geschrieben:
Wie verknüpfe ich jetzt die Translation des Projektils mit der Position eines Vertexes?

Beschreib mal genauer. Du musst doch einfach nur dein Projektil via glTranslatef an die richtige Stelle bringen.

Gran hat geschrieben:
Wie kann ich ausserdem ein längeres Projektil, z.B. einen Laserstrahl, so rotieren, dass es genau in Richtung des Punktes zeigt?

Das geht recht einfach über den Sinussatz. Schau dir mal diese Skizze hier an :
Bild
Alle Kanten (a,b,c) sind ja gegeben, da du sowohl die Koordinaten des Startpunktes als auch die des Zielpunktes hast. Ein Winkel ist 90° (der ggü. der Hypothenuse) und wichtig ist für dich dann im Endeffekt der Winkel Alpha. Der Sinus von Alpha ist laut Sinussatz nämlich Gegenkathete durch Hypothenuse, also dank gegebener Größen ein Kinderspiel.

P.S. : Falls ich nen Fehler gemacht habe, so verzeihen mir die Mathegurus das bitte. Meine letzte echte Matheunterrichtsstunde liegt schon Jahre zurück. Danach gabs nur noch fachspezifische Sachen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 13:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Dir sei verziehen, dass du die Definition des Sinus als Sinussatz ausgegeben hat. Der lautet nämlich eigentlich sin(alpha)/a = sinus(beta)/b = sinus(gamma)/c :wink:

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Nachdem die Begriffe Katheten und Hypothenuse sowieso nur in einem rechtwinkligen Dreieck gelten, folgt aus dem Sinussatz

sin(alpha) / a = 1 / c
sin(alpha) = a / c

und die Aussage
Zitat:
Der Sinus von Alpha ist laut Sinussatz nämlich Gegenkathete durch Hypothenuse

ist völlig korrekt

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Zitat:
Da soll man dann von der Seite etwas von oben mit einem kleinen Männchen rumrennen und Schießen (ein Soldat-Klon, fals das Game jemand kennt)


Ja ich kenne das Game (ich bin ziemlich gut in dem Game ;D) und ich progge derzeit auch sowas in der Art ;D
Machst du auch nen Multiplayer?
Kannst mich ja mal im IRC (#delphigl @ euIRC) oder im ICQ (139678577) ansprechen.

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, kannst du nicht anstatt einen "Stab" zu rotieren gleich mit den richtigen Koordinaten zeichnen?! (rein von der Geschwindigkeit her, alzu schwer ist Sinus ja auch net ^^)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Was soll denn dadran besser sein? Wenn du das Quad schon rotiert rendern willst, musst du im Endeffekt vier Koordinaten von Hand (auf der CPU) berechnen. So berechnet man nur einen Winkel (auf der CPU), und die Rotation geht doch dank HW T&L dann unwahrscheinlich schnell...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Vermutlich kann man ganz auf sin verzichten.
Man weiß ja die Richtung in der der Laser zeigen soll.r=Ziel-Start
Diesen Vektor normalisiert man dann. Dann rechnet man einen Vektor aus, der zu r senkrecht steht. Da ja alles 2D sein soll ist das dann:
r'=(r.y,-r.x) und darauf kann man das Quad dann auch schon zeichnen.
Wenn p der Mittelpunkt des Lasers ist, dann hat das Quad die 4 Eckpunkte

p-r*Länge-r'*Breite,p+r*Länge-r'*Breite,p+r*Länge+r'*Breite,p-r*Länge+r'*Breite

Die ganze Berechnung kann man auch in ein Vertex Program auslagern, um die Zeit für die Normalisierung zu sparen. Aber man hat ja sowieso schon die Bewegungsrichtung für das Projektil irgendwo im Program. Und die ist ja meistens sowieso schon normalisiert, so daß man sie direkt für r einsetzen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Nein, keine Punkte mehr ausrechnen @ SOS...
Er hat ja dann schon die Spieler Pos und dort wo es hingehen soll.
Deshalb dachte ich, wenn es als Laser sein sollte.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 19:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich versteh dich irgendwie nicht. Einen Laser muss man ja auch (wenns brauchbar aussehen soll) als Quad rendern. Nach deiner Methode müsste er dann alle 4 Vertices des Quads entsprechend rotieren, was dann im Endeffekt vier Berechnungen für die CPU bedeuten würde, die die GPU doch viel besser kann.

P.S. : Er hat übrigens Projektil geschrieben, also kein einfacher Strahl der von Schusstart nach Zielposition geht.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 19:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, mein Fehler :-( Aber er hat auch Laser geschrieben ;)
Naja, stimmt dann müsste man alle vier berechnen.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 02, 2004 20:48 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Frage ist nur wie lange es dauert die aktuelle Matrix mit der Rotationsmatrix zum multiplizieren, also wie lange ein glRotatef braucht. Da man die Achse frei wählen kann ist es durchaus möglich, daß die Berechnung etwas umfangreicher ist. Zudem kann vermutlich noch ein glPushMatrix/glPopMatrix hinzu. Daher der Vorschlag mit dem Vertex Program.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 03, 2004 08:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Na ja gut, wenn nicht gerade mehrere hunderttausend Laser- (oder Projektil-) schüsse pro Sekunde losgehen sollen, dürfte es so ziemlich egal sein, wie jetzt die Richtung bestimmt wird :wink: .

Den Winkel auszurechnen, wird spätestens dann wichtig, wenn komplexere Objekte (etwa ein Arm, eine Waffe) entlang der Schussrichtung ausgerichtet werden sollen.
Betreff glRotatef, glTranslatef und glScalef habe ich die Erfahrung gemacht, dass es irgendwann einfacher wird, die meisten Transformationen im Voraus zu berechnen, und nur die fertigen Transformationsmatrizen nach OpenGL hochzuladen, da man für diverse nicht-graphische Zwecke (die in den meisten Spielen ja auch von Nöten sind) ohnehin die globale Transformation eines Objektes im Programm benötigt (und sei es nur, um eine Bounding Sphere oder Bounding Box als Weltkoordinaten auszudrücken).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Danke
BeitragVerfasst: Mo Mai 03, 2004 16:15 
Offline
DGL Member

Registriert: Sa Mär 20, 2004 22:48
Beiträge: 104
THX@ALL, ihr habt mir wirklich geholfen, vor allem die Zeichnung hat mir alles verdeutlicht. Ich bin zwar erst 9. Klasse und 15 Jahre alt (hab' also noch nie Sinus gelernt bzw. benutzt...), aber trotzdem hab' ich das jetzt irgendwie hingekriegt. Ich hab' statt des Schusses jetzt einfach ein rundes Projektil eingesetzt, bei dem es egal ist, in welche Richtung es rotiert (es muss ja nichtmal rotieren). Mein Schuss bewegt sich jetzt korrekt, aber er rotiert nicht, weil ich das mit dem Winkel Alpha nicht gerallt hab'. Wäre nett, wenn mir das jemand GAAAAAAANZ langsam erklären könnte (ich muss euch warnen: Mathe hab' ich 'ne 5). Um das Ganze etwas zu konkretisieren: Das Sinus-Zeugs hab' ich in etwa verstanden, ich muss ja einfach die Kathete oben durch die Hyphotenuse teilen, meine Frage: Die Kathete oben hab' ich, aber wie bekomme ich die Länge c? Das wäre meine einzigste Frage...thx schonmal im vorraus

P.S.: @las, kannste mir mal deine ICQ-Nummer geben? Ich hab' nämlich kein IRC




...(AAAAAARG, ICH BIN SO DUMM, lol, wenn sich einer durchgelesen hat, was ich erst für 'nen Mist gepostet hab' am Schluss...ich hab' einfach gepostet, ohne nachzudenken, und jetzt ist mir erst aufgefallen, dass ich c doch ganz einfach mit dem Satz des Pythagoras berechnen kann. Okay, ich denke mal, ich hab' jetzt alles verstanden...)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 03, 2004 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Zitat:
Kannst mich ja mal im IRC (#delphigl @ euIRC) oder im ICQ (139678577
) ansprechen.


*Räusper*

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]