3D Kennfeld: beliebige Punkte im 3D-Raum zu einer Fläche verbinden
-
Ich denke mal eher, die Sichtweite müsste der Diagonale im Würfel entsprechen, und wenn du dich von -1000 bis +1000 freie bewegen kannst, dann ist die Kantenlänge dessen auch 2000.
Bye, TGGC (Demo or Die)
-
Danke für den Denkanstoß. Folgende Werte sehen am Besten aus:
zNear = 250.0;
zFar = -250.0;Übrigens sitze ich gerade an einer Funktion, die mir höhenabhängig einen Farbwert zurückgibt, also sowas:
// höhenabhängig die Farbe setzen void __fastcall TfrmMDI::SetVertexColor(float fHeigth) { float r, b, g; r = fHeigth/MAXGRIDSIZE; b = 1 - r; g = 1.0; glColor3f(r, g, b); }Mit dieser Funktion läßt sich ein Farbverlauf von Türkis nach Gelb realisieren. Jetzt möchte ich aber einmal im Farbkreis rum, sprich
Orange, Gelb, Grün, Türkis, Blau, Lila, Rot
Das müßte doch mit Winkelfunktionen gehen, oder? Aber wie setzt man da die Werte für r,g,b?
MfG F98.
-
F98 schrieb:
einen Farbwert zurückgibt
SetVertexColor
-
Jadoch.

Dann hab ich mich eben verschrieben. "Farbe einstellt" wäre besser. Nun?
-
also "einmal im farbkreis rum": dazu würde sich HSV eignen. du musst einfach nur beim V höher gehen, und wenn du bei 360° bist biste fertig.
http://de.wikipedia.org/wiki/HSV-Farbraum
-
zNear und zFar geben die Abstände der Near- bzw Far-Clipping-Plane zu deiner Kamera an. Es ist eigentlich nicht unbedingt optimal, wenn so ein Abstand negativ ist!
Wenn du also ein hohes zFar haben willst, dann solltest du, falls dein Z-Buffer streikt zNear ebenfalls erhöhen.z.B: zNear = 1, zFar = 5000
wenns dann noch flackert wählst du eben zNear = 10 usw.Um so kleiner der Quotient zNear / zFar ausfällt, umso schlechter sind deine Z-Buffer Ergebnisse.
-
Yo, ich hab schon etwas damit rumexperimentiert. Die besten Ergebnisse liefer eben solche Werte im Bereich -250, 250.
Übrigens habe ich eine feine Bibo zum Thema HSV2RGB und RGB2HSV gefunden:
http://www.tac.dk/software/viz/src/libviz/
und dort die Datei VizCM.C und VizCM.h
-
Ich habe nun die hsv2rgb-Funktion in meinen Kennfeld-Viewer eingebaut. Leider funktioniert das Ganze nicht so, wie ich mir das dachte. Meine Annahme war die:
Hue (Farbton): von 0°-360°
-> Mein Kennfeld geht in y-Richtung von Koordinate 0.0 - 1000.0. Dazu habe ich mir eine Funktion geschrieben, die mir den Grad-Wert 0-360 in die entsprechende Höhe skaliert (0-1000).
Saturation (Sättigung): 0.0 - 1.0
-> den Wert lasse ich Konstant auf 1.0
Value (Helligkeit): 0 - 255
-> wird ebenfalls auf 255 gelassen
Tja, was kommt dabei raus: Jedenfalls kein toller regenborgenartiger Farbverlauf , sondern harte Übergänge zw. Gelb, Türkis, Pink. Das Ganze sieht also total Asche aus. Was mache ich da falsch?
Hier nochmal die hsv2rgb-Funktion aus dem obigen Link:
// h: 0° - 360° (hue - Farbton) // s: 0.0 - 1.0 (saturation - Sättigung) // v: 0 - 255 (value - Helligkeit) void hsv2rgb(float h, float s, float v, float &r, float &g, float &b) { if (s == 0.0) r = g = b = v; else { if (h == 360.0) h = 0.0; h /= 60.0; int i = (int)(h); double f = h - i; double p = v * (1 - s); double q = v * (1 - (s * f)); double t = v * (1 - (s * (1 - f))); switch (i) { case 0: {r = (float)v; g = (float)t; b = (float)p; break;} case 1: {r = (float)q; g = (float)v; b = (float)p; break;} case 2: {r = (float)p; g = (float)v; b = (float)t; break;} case 3: {r = (float)p; g = (float)q; b = (float)v; break;} case 4: {r = (float)t; g = (float)p; b = (float)v; break;} case 5: {r = (float)v; g = (float)p; b = (float)q; break;} } } }und hier nochmal mein Aufruf:
// fHeigth: 0.0 - 1000.0 void __fastcall TfrmMDI::SetVertexColor(float fHeigth) { float r, g, b; switch (GPref.GraficColorMode) { case ColGradient : { r = fHeigth/MAXGRIDSIZE; b = 1 - r; g = 1.0; break; } case ColHeightlines : { r = cos(fHeigth); g = sin(fHeigth/MAXGRIDSIZE); b = 1.0; break; } case ColColorCircle : { hsv2rgb(EvalKR(fHeigth, 0.0, 360.0), 1.0, 255.0, r, g, b); break; } } glColor3f(r, g, b); } float __fastcall TfrmMDI::EvalKR(int iCoord, float fRealMin, float fRealMax) { // Min/Max im Bild-Koordinatensystem float fPya = 0.0; float fPye = MAXGRIDSIZE; // 1000.0 float fCoord = float(iCoord); // Bild-Koordinaten in reelle umrechnen return (((fCoord - fPya) / (fPye - fPya)) * (fRealMax - fRealMin)) + fRealMin; }