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?
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 :
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.
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
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
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.
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 ^^)
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...
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
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.
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.
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.
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.
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 .
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).
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...)
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.