Moin
Wer könnte mir mal dabei helfen ne procedure zu schreiben die Vectoren berechnent?
ich habe x,y,z als gegeben und möchte nun gern nen vector haben. danke schon mal.
Vectoren berechnen ?
also ich habe einen ursprungspunkt und darum will ich per OpenGL nen kreis zeichnen und für die einzelnen punkte des kreises (die dann mit linien verbunden werden) brauch ich halt die vectoren. es gibt halt in OpenGL keine funktion die nen kreis zeichnet oder besser ich habe keine gefunden. nun will ich das hgalt mit vecoren selber machen und wenn das nix wird muß ich sehen das ich das mit GLU hin bekomme.
Dafür braucht man eigentlich nur Sinus, Cosiunus und Tangens.
Also du startest im Mittelpunkt des Kreises und bei 0 Grad. (Das ist dann rechts vom Mittelpunkt). Der Radius muss bekannt sein, du musst also wissen wie groß der Kreis sein soll. Jetzt die Koordinaten ausrechnen, wo du dich jetzt mit dem "Stift" befindest:
y = cos(winkel) * radius
x = sin(winkel) * radius
Das ergibt dann die Position wo der erste Punkt hin muss, der Ursprung ist die Kreismitte. Dann gehst du jetzt 1 Grad weiter auf die 360 zu, steigst also praktisch entgegen den Urzeigersinn aufwärts. Wieder mit Sinus und Cosinus die Koordinaten berechnen. Bei kleinen Radien ist dieser jetzt nahe dem ersten Punkt, bei großen Radien kann er stark abweichen. Daher verbinde diese beiden Punkte per Strich, damit es keine einzelnen Punkte bleiben.
Dies wiederholt sich bis du einen vollen Kreis gezogen hast.
Wenn der Radius sehr groß ist und bei 1 Grad Rotation du merkst, dass der Kreis nicht sehr rund aussieht, einfach weil die Abstände der Punkte so groß ist, dass man die Einzelnen Verbindungslinien zwischen den Punkten stark heraussieht, verkleinere den Winkel der immer Erhöht wird auf 0,5 oder 0,25 und probier es nochmal aus. Am besten geht sowas wohl mit einer While-Schleife die anhält bis eine Winkelvariable >= 360 ist. (oder mit einer For-schleife, aber da du eventuell Kommawerte als "Step" hast musst du da etwas umdenken und den Step verzehnfachen und ihn in der Schleife teilen, sonst bekommst du keine Kommawerte hin).
Ansonsten weiß ich jetzt nicht, wass das mit einem Vektor zu tun hat. Bzw. warum hast du x,y,z gegeben, wenn du doch garnicht die Punkte des Kreises kennst... Naja, schau ob du mit dem obigen Text was anstellen kannst und melde dich dann.
Also du startest im Mittelpunkt des Kreises und bei 0 Grad. (Das ist dann rechts vom Mittelpunkt). Der Radius muss bekannt sein, du musst also wissen wie groß der Kreis sein soll. Jetzt die Koordinaten ausrechnen, wo du dich jetzt mit dem "Stift" befindest:
y = cos(winkel) * radius
x = sin(winkel) * radius
Das ergibt dann die Position wo der erste Punkt hin muss, der Ursprung ist die Kreismitte. Dann gehst du jetzt 1 Grad weiter auf die 360 zu, steigst also praktisch entgegen den Urzeigersinn aufwärts. Wieder mit Sinus und Cosinus die Koordinaten berechnen. Bei kleinen Radien ist dieser jetzt nahe dem ersten Punkt, bei großen Radien kann er stark abweichen. Daher verbinde diese beiden Punkte per Strich, damit es keine einzelnen Punkte bleiben.
Dies wiederholt sich bis du einen vollen Kreis gezogen hast.
Wenn der Radius sehr groß ist und bei 1 Grad Rotation du merkst, dass der Kreis nicht sehr rund aussieht, einfach weil die Abstände der Punkte so groß ist, dass man die Einzelnen Verbindungslinien zwischen den Punkten stark heraussieht, verkleinere den Winkel der immer Erhöht wird auf 0,5 oder 0,25 und probier es nochmal aus. Am besten geht sowas wohl mit einer While-Schleife die anhält bis eine Winkelvariable >= 360 ist. (oder mit einer For-schleife, aber da du eventuell Kommawerte als "Step" hast musst du da etwas umdenken und den Step verzehnfachen und ihn in der Schleife teilen, sonst bekommst du keine Kommawerte hin).
Ansonsten weiß ich jetzt nicht, wass das mit einem Vektor zu tun hat. Bzw. warum hast du x,y,z gegeben, wenn du doch garnicht die Punkte des Kreises kennst... Naja, schau ob du mit dem obigen Text was anstellen kannst und melde dich dann.
Aber ein Kreis ist ein 2D-Gebilde. Es gibt da keine dritte Koordinate welche Z ausmacht. Z könnte allerhöchstens die gesamte Ebene sein, auf der sich der Kreis befindet. Dann ist der Mittelpunkt dort, und alle anderen Punkte auch. Mittels glTranslatef(x,y,z) kannst du vor dem kompletten Kreis einfach die Matrix so verschieben, dass sie den Ursprung im Zentrum des Kreises hat (und da kannst du dann auch den Z-Wert des Ursprungs des Kreises nehmen, was den "Zoom" ausmacht) und renderst dann den kompletten Kreis. Dort ist dann zu beachten, dass dein "Z" bei den Vertices immer 0 ist, da du dich nicht mehr von der Ebene anhebst oder absenkst. Wenn du eine 3D-Matrix hast (MODELVIEW) dann wird der Kreis auch entsprechend kleiner dargestellt wenn er weiter hinten m Raum ist. Mit PROJECTION wird der Kreis unabhängig von Z immer gleichgroß dargestellt, da keine 3D-Perspektive errechnet wird.
Mit diesen Infos sollte es nun eigentlich möglich sein, einen Kreis in eine OpenGL-Welt zu basteln.
Mit diesen Infos sollte es nun eigentlich möglich sein, einen Kreis in eine OpenGL-Welt zu basteln.
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Kreis Pseudocode, hat auch nichts mit OpenGL per se zu tun:
Könnte in OpenGL dann via GL_LINE_LOOP so aussehen:
Für eine Kugel könnte man der Einfachheit halber gluSphere_()
benutzen oder eben selbst erzeugen, dafür gibt es aber jede
Menge verschiedener Methoden...
"Zoomen" würde ich über die "Kamera" machen. Um den Kreis
darzustellen, bist Du ja ohnehin in einer 2D Ortho Ansicht.
Code: Alles auswählen
For i=0 To #NUMLINES-1
x.l = l * Cos(i * 2 * #PI / #NUMLINES)
y.l = l * Sin(i * 2 * #PI / #NUMLINES)
Next
Code: Alles auswählen
glBegin_(#GL_LINE_LOOP)
For i=0 To #NUMLINES-1
angle.f = i*2*#PI/#NUMLINES
glVertex2f_(Cos(angle), Sin(angle))
Next
glEnd_()
benutzen oder eben selbst erzeugen, dafür gibt es aber jede
Menge verschiedener Methoden...
"Zoomen" würde ich über die "Kamera" machen. Um den Kreis
darzustellen, bist Du ja ohnehin in einer 2D Ortho Ansicht.