Dreieck ohne Cull face
-
Ich hab folgendes Problem:
Immer wenn ich ein Tetraedron rendern will muss ich (es sei denn ich benutz CULL FACE) muss ich die Ecken so sortieren, dass alle Seiten in meine richtung blicken.
d.h ernn ich in dem Tetraedron bin muss ich nichts vom Tetraedron sehen können, da nur die aussenseite gerendert wird.
Jetzt hab ich mich gefragt, ob schon jemand auf einen Algorithmus gekommen ist, der das automatsch übernehmen kann.
Also etwa so
void sortcorner(Vector in[4],Vector& out[4]);
kennt jemand so einen?
-
alterbro schrieb:
Tetraedron
Das hier: http://en.wikipedia.org/wiki/Tetraedron ? Btw. gib dir bei deiner Frage bitte mehr Muehe! Rechtschreibung, Ausdruck, Problemstellung.
-
Wo genau liegt das Problem, die Dreiecke einfach richtig herum zu orientieren?
Es kann wohl schon rein prinzipiell keinen solchen Algorithmus für den allgemeinen Fall geben, da es für einen beliebigen Haufen Dreiecke eben kein allgemeines "Richtig" oder "Falsch" gibt. Das wäre gleich, wie die Frage nach einem Algorithmus, der ein für alle Mal klären soll, ob grün nun besser ist als blau...
Natürlich kann man z.B. was machen, das allen zusammenhängenden Dreiecke die selbe Orientierung verpasst. Dann muss man nur noch entscheiden, welche Orientierung nun die gewünschte ist. Das ist im Allgemeinen wohl auch wieder nicht unbedingt trivial. Aber z.B. für einen konvexen Körper kann man die Orientierung wählen, mit der alle Normalen vom geometrischen Schwerpunkt wegzeigen...
Ich würd mich aber schon fragen, ob das alles so sinnvoll ist, wo man doch einfach die Dreiecke beim Modellieren von vornherein so orientieren könnte, wie man es eben haben will und fertig...oder schreibst du grad ein Modelling Tool?
-
Nein, aber ich mach ein Kollisions-testool, und ich möcht die Dreiecke zufällig berechnen
-
Wo liegt dann das Problem, dann kannst du die Dreiecke doch einfach von vornherein so generieren, wie du sie brauchst!?
-
ja aber dann sind die Punkte eben falsch sortiert
-
Dann generierst du die Punkte eben falsch!?
-
wie sooll ich sie deiner meineung nach generieren?as ist ja mein Problem, ich hab kiene Ahnung, wie die funktion dfäur aufgebaut sein soll
-
Woher soll ich das wissen, ich weiß ja noch nichtmal, was genau du eigentlich generieren willst!?
-
also ich hab eine VErtex[4] Array, der ein tetraedron darstellt, die Punkte sollen nun so verteilt werden, dass das Dreick nur von aussen sichtbar ist
-
Und wo genau liegt dabei das Problem? Wenn die Topologie des Körpers eh schon feststeht, brauchst du doch nur die Indices entsprechend wählen!?
-
naja bis jetzt hab ich ich noch keine Kombination gefunden, die Funktioniert.
Aber ich hab grad rausgefunden das es wahrscheinlich unmöglich ist.
hat sich also erledigt.
TRozdem danke.
-
Was ist unmöglich? Ich hab leider immer noch nicht verstanden, was genau du erreichen willst und solange du mir das nicht verrätst, kann ich dir leider nicht helfen. Also nochmal: Was genau willst du erreichen. Und sag einfach mal nur das Was unabhängig vom Wie du gedenkst, es erreichen zu wollen. Verbeiß dich also mal nicht in die Tatsache, dass du glaubst, irgendwo irgendas irgendwie sortieren zu müssen, sondern sag mir einfach mal nur, was eigentlich am Ende rauskommen soll und wofür du das dann verwenden willst...
-
Okay noch mal von vorne:
ein tetraeder=Vector[4] (ein tetraeder hat vier Ecken)
zeichen:render methode:
glenable(gl_cull_face);
for(int i=0;i<4;i++){
glbegin(gl_triangle);
for(int j=0;i<3;j++){
glvertex(points[(i+j)%4].x,points[(i+j)%4].y,points[(i+j)%4].z);
}
glend();
}Problem:
wie füll ich das tetraeder (vector array)zufällig(funktion), so dass alle seiten so gerendert werden, dass sie gegen aussen zeigen?
-
Mit
(i+j)%4
wirst du da nicht weit kommen.Wenn das dein Tetrahedron ist...
1 /|\ / | \ / | \ 2-------3 \ | / \ | / \|/ 4
(Kante 2-3 ist vorne)
...und wir "counterclockwise" als "nach vorne guckend" annehmen...Dann sind die Dreiecke mit passendem Drehsinn:
1, 2, 3
2, 4, 3
1, 4, 2
1, 3, 4Wenn du die Punkte zufällig erzeugst, kann es höchstens noch sein dass die Punkte des Tetrahedron "falsch rum" zueinander im Raum liegen liegen, und daher alle Seiten "falsch rum" gerendert werden. In dem Fall musst du einfach nur zwei beliebige Punkte vertauschen, dann liegen sie wieder richtig rum.
Um das rauszubekommen kannst du z.B. einfach den Normalvektor der von einem Dreieck aufgespannten Fläche ausrechnen (Kreuzprodukt zweier Seiten), und dann gucken ob der 4. Punkt in der Raumhälfte liegt in die der Normalvektor "reinzeigt" oder auf der anderen (Skalarprodukt).
-
Ok, ich kann zwar immer noch nur raten, aber ich versuch's mal: Du willst also ein Tetraeder erzeugen, mit zufälligen Koordinaten für die Eckpunkte!? (Ist es wirklich so schwer, das einfach zu sagen?)
Mein Ansatz: Nimm ein normales, regelmäßiges Tetraeder und verschieb dessen Eckpunkte jeweils um einen zufälligen Wert vom Mittelpunkt weg: Voilà.
Oder anders ausgedrückt: Zieh vier zufällige, positive Werte und multiplizier jeden Wert mit einer der vier entsprechenden Richtungen , , und .
-
stimmt, es lag an meiner render methode, ich bin gerade daran sie zu überdenken.