Guten Abend,
ich hab mal wieder ein mathematisches Problemchen Ich möchte einen Zylinder mit dem Radius r zwischen den Punkten p1 und p2 zeichnen.
Ich könnte jetzt ausrechnen wie lang der Zylinder ist und wie stark ich ihn rotieren müsste, aber das halte ich für die uneleganteste Methode.
Es muss ja auch ohne Spielerei an der Matrix gehen. War da nicht irgendwas mit Normalen ausrechnen? Naja, mir fehlt das mathematische Wissen halt, Vektorrechnung macht man bei uns sowieso leider erst in der 12...
Habt ihr ne Idee?
Deine Bilder in dem Threat sind down.
Wie meinst du das nun? Eine der beiden Möglichkeiten, wie im angehängten Bild? Es gibt ungefähr unendlich viele Möglichkeiten, einen Zylinder zwischen zwei Punkten zu platzieren.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Da du ja sowohl Start- als auch Endpunkt hast, sollte das recht einfach gehen. Da brauchste keine Vektoren- und keine Matrixberechnungen, sondern einfach nur via Pythagoras die 3-Winkel für alle Achsen zwischen Start- und Zielpunkt auszurechnen und dann deine Vertices entsprechend von Hand per Sinus/Cosinus zu rotieren. Anhand der Differnez zwischen den zwei Punkten kannste ja den Kippwinkel des kompletten Zylinders errechnen, und dann musst du halt die Punkte des Zylinders (jetzt im Bezug auf den Boden/die Decke) entsprechend ihrer Entfernung zum Zentrum rotieren.
P.S. : Habe auch nie Vektoren oder Matrizen in der Schule gemacht. Wenn man 3D macht, dann schnappt man sich halt ein passendes Buch und bringts sich selbst bei. Ist gar nicht mal so schwer.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Wie wäre es wenn du die Modelview Matrix genau so einstellst das sich der Punkt 1 genau über dem Punkt 2 befindet. Dann könntest du mit Hilfe von Sin und Cos die Punkte auf den Oberen und unteren Kreis ermitteln und verbinden. Ich weis ja nicht was einfacher ist?
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Also, wenn ich mich bei meinen Zeichnungen nicht total vertan habe, sind das die "Kippwinkel":
Code:
dir.x:=p2.x-p1.x;
dir.y:=p2.y-p1.y;
dir.z:=p2.z-p1.z;
rot.x:=arctan(dir.y/dir.z);
rot.y:=arctan(dir.z/dir.x);
rot.z:=arctan(dir.y/dir.x);
Naja, mit der Rotation tuts sich dann schon etwas schwerer, hab mir nochmal das Mathe Tutorial hier angeschaut und daraus geht, wenn ich mich nicht irre, für eine Rotation um die Z Achse folgendes hervor:
Code:
vec.x:=vec.x*cos(rot.z)-vec.y*sin(rot.z);
vec.y:=vec.x*sin(rot.z)+vec.y*cos(rot.z);
Naja das funktioniert irgendwie nicht so ganz pralle:
Code:
glbegin(gl_points);
vec.x:=0;
vec.y:=0.25;
vec.z:=0;
rot.z:=ctime/1000000;
vec.x:=vec.x*cos(rot.z)-vec.y*sin(rot.z);
vec.y:=vec.x*sin(rot.z)+vec.y*cos(rot.z);
glvertex3fv(@vec);
glend;
=> Der Punkt sollte eigentlich einen Kreis "beschreiben", was er allerdings nicht tut (er beschreibet, naja, einen runden komischen Graphen) , ich vermute mal ich wende die Formel nicht richtig an oder ich hab mich irgendwo verhaspelt ...
Danke schonmal für eure Hilfe, hat mich aber leider nicht viel weitergebracht, das mit Winkeln ausrechnen und so hatte ich eigentlich schon vorher im Kopf.
Ich könnte jetzt ausrechnen wie lang der Zylinder ist und wie stark ich ihn rotieren müsste, aber das halte ich für die uneleganteste Methode.
Die andere Möglichkeit wäre, durch die beiden Punkte und den Differenzvektor als Normalvektor zwei Ebenen zu definieren, und auf diesen deine Kreise zu tesselieren und zu verbinden - da ist die obere Methode doch um einiges einfacher.
Die andere Möglichkeit wäre, durch die beiden Punkte und den Differenzvektor als Normalvektor zwei Ebenen zu definieren, und auf diesen deine Kreise zu tesselieren und zu verbinden - da ist die obere Methode doch um einiges einfacher.
Das wäre eigentlich gar nicht so ungeschickt...Aber bis man das wirklich für einfacher hält, muss man über Ebenen einiges gelernt haben
Zuletzt geändert von Delphic am Di Jul 14, 2009 08:48, insgesamt 1-mal geändert.
weils hier gerade so schön ins Thema passt. Das mit dem Zylinder zeichnen bekomme ich ja hin. Ich suche nun eine Möglichkeit bei den Zylindern die verdeckten Kanten auszublenden. Bei meinen anderen Objekten zeichne ich die einfach zweimal, einmal als fill und dann als line, aber das funktioniert bei Zylindern natürlich nicht...
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Also, wenn ich das richtig sehe, soll das ganze dann so aussehen wie das rechte Bild, oder?
Dann würde ich das ganze per Frustum-Culling zeichnen. Ist eleganter und spart sogar noch
Füllrate (?).
Einfach vor die Draw-Prozedur folgendes setzen:
Code:
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
//oder GL_CW
ZeichneObjekt;
glDisable(GL_CULL_FACE);
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich glaube er möchte trotzdem die Faces haben, aber nur die Umramungslinien.
Das was du suchst ist die Silhouette deines Körpers. Die grigst du über die Normalen Raus.
Jeweils die Kante, die zwischen zwei Flächen liegt, deren Winkel zwischen Normalen der Fläche und Linie(Betrachter<->Körper) einmal > 90° und einmal <=90° sind sind Kanten, die du nachzeichnen musst.
SoS hat hierzu bereits einmal was geschrieben, im zusammenhang im Schatten. Bemüh doch mal die Forumssuche mit Schatten und Silhouette. (Is noch gar net so lange her.)
EDIT: Ich mach mal nen Wiki Deadlink dazu. Eventuell füllt das mal jemand aus.
Ach ja...Im Wiki (unter Techniken&Algorithmen) war ein Artikel von SoS bezüglich Schatten. Vielleicht steht da auch noch was.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: Bing [Bot] und 0 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.