![]() |
Dreidimensionales Array darstellen.
Hallo DP,
habe ein Array
Delphi-Quellcode:
und möchte dieses gerne in 3D darstellen. Habe gedacht, dass ich für jedes Element einen kleinen Würfel mache.
var cuar: array[1..5][1..5][1..5] of integer
Habe gelesen, dass das mit OpenGL funktioniert. Hat jmd. dafür einen Code, oder ein kleines Tutorial indem das erklärt wird??? Danke euch schonmal. |
AW: Dreidimensionales Array darstellen.
![]() Hier gibt es alle Tutorials. Den Würfel mit OpenGL zu machen ist recht einfach. Bis Du OpenGL am Laufen hast, dauert es aber.... Gruss Jens |
AW: Dreidimensionales Array darstellen.
Zitat:
![]() |
AW: Dreidimensionales Array darstellen.
Also, ich hab jetzt das
![]() Meine Frage jetzt, wie kann ich das ganze auf einem Panel zeichnen, d.h. das Panel als Darstellung nutzen. Und wie bilde ich jetzt die Würfel??? |
AW: Dreidimensionales Array darstellen.
Zitat:
Zum "mal schnell was zusammenklicken" mag das ganz nett sein und es hat wirklich mächtige Funktionen, allerdings lässt die Performance ganz schön zu wünschen übrig, sobald man Shader benutzt (für jedes Material und jedes Objekt wird der einzeln Shader initialisiert->gerendert->finalisiert anstatt Objekte mit dem gleichen Shader in einem Aufwasch zu rendern), was das K.O. für jede moderne Applikation ist. Und um das gerade zu biegen, muss man tief in den Source :D Ausserdem verstecken sich in GLScene massig Bugs, die extrem nerven können. Und hat man dann keine Ahnung von OpenGL, so ist man fast hoffnungslos verloren. Ich finde die Idee dahinter wirklich gut und verwende es teilweise auch, aber man muss meiner Meinung nach vorher schon in OpenGL halbwegs firm sein, um die Bugs und Fallstricke suchen und eliminieren zu können. @Müllermilchtrinker: Willst du dir ne Anzeige für einen LED-Cube bauen? :D Sollte ich die Tage mal Zeit haben, wurschtel ich mal ne Routine zusammen. Generell sollte dir dabei aber auch folgendes NeHe-Tutorial helfen: ![]() Ganz unten gibts dafür auch einen Delphi-Quellcode. Zitat:
|
AW: Dreidimensionales Array darstellen.
Ich habe da mal etwas vorbe...
So etwas ? ![]() ![]() |
AW: Dreidimensionales Array darstellen.
Ihr habt's erraten. Soll eine Mustererstellung für meinen LED Cube werden. Aber der ist nur 5³. Es steht bis jetzt alles, außer die 3D Ansicht. :D
Das mit dem Panel hat sich erledigt. |
AW: Dreidimensionales Array darstellen.
Du solltest Dich hiermit beschäftigen, wenn Du genanntes Tut durch hast :
![]() Ich würd sagen GL_QUADS und GL_QUAD_STRIP sind wichtig für Dich. ein Würfel könnte so aussehen :
Delphi-Quellcode:
glBegin(GL_QUADS);
//vorderseite glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 1, 0); glVertex3f(0, 1, 0); //Seite rechts glVertex3f(0, 1, 0); glVertex3f(1, 1, 0); glVertex3f(1, 1, 1); glVertex3f(0, 1, 1); //Seite links .. usw glEnd; |
AW: Dreidimensionales Array darstellen.
Hat keiner ein Beispiel für mich???
|
AW: Dreidimensionales Array darstellen.
Wo hängst Du?
Wenn Du mein Beispiel vervollständigst, hast Du einen ganzen Würfel! Das ist dasselbe, wie aus dem NeHe Tut, welches blackfin verlinkt hat. Für viele kleine Würfel mußt Du entweder jeden Würfel einzeln eingeben oder mit einer Schleife die Würfel erzeugen. Mach mal den ganzen Würfel und guck obs läuft! |
AW: Dreidimensionales Array darstellen.
Ich hab jetzt einen großen Cube, aber der ist nicht so schön quadratisch, es ist eher ein Quader.
Dann drehe ich noch so: Das im Render:
Delphi-Quellcode:
Und dann ein zweiten Timer mit einem Interval von 1s:
glRotatef(RotateX, 1, 0, 0);
glRotatef(RotateY, 0, 1, 0); glRotatef(RotateZ, 0, 0, 1);
Delphi-Quellcode:
Doch leider ist die Drehung sehr ruckelig. Wie bekomme ich das flüssiger??? Und wie bekomme ich den Cube sauber quadratisch.
procedure TForm1.Timer2Timer(Sender: TObject);
begin RotateY := RotateY - 0.15; if RotateY <= 0 then RotateY := RotateY + 360; RotateX := RotateX - 0.15; if RotateX <= 0 then RotateX := RotateX + 360; end; |
AW: Dreidimensionales Array darstellen.
Zitat:
Irgendwo wird bei Dir das stehen:
Delphi-Quellcode:
Entweder gewöhnst Du Dich an den Anblick oder Du nimmst den Ortho-Modus
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
![]() ![]() Guck Dir bitte gluOrtho2D an. Zitat:
Delphi-Quellcode:
RotateY := RotateY + 1
|
AW: Dreidimensionales Array darstellen.
Zitat:
Zum Orthomodus: Das versteh ich nicht. Kann mir nicht jemand die Zeile geben und sagen, wo ich das ändern soll??? PS: Mich kotzt das ganze OpenGL an. Wieso geht das nicht einfacher??? Ich will jetzt endlich mein Programm fertig haben und mich nicht über dieses blöde OpenGL rumärgern. Ich bräuchte eigentlich nur einen Code, der mir viele kleine Würfel darstellt. Und dann noch mein Array überprüft, ob eine eins, dann soll die Farbe des Würfels anders sein, als wenn dort eine null steht. |
AW: Dreidimensionales Array darstellen.
Zitat:
Delphi-Quellcode:
Ich glaube, diese Zeile hat in Deinem Code den Ärger gemacht.
if RotateY <= 0 then RotateY := RotateY + 360;
Zitat:
Delphi-Quellcode:
mit gluOrhto2D ersetzen.
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
Zitat:
|
AW: Dreidimensionales Array darstellen.
Zitat:
EDIT: Das mit dem flüssig hat sich erledigt, ich nutze ja die Timer Methode und musste da einfach die Framezahl bzw. Das Interval ändern. Zitat:
Zitat:
|
AW: Dreidimensionales Array darstellen.
Keiner ne Ahnung???
|
AW: Dreidimensionales Array darstellen.
Okay, Du gibst nicht auf. Also ..
Zitat:
GLScene ist ganz sicher auch eine gute Komponente, die es für D2009 bei sourceforge gibt. Zitat:
Hier sind aber gute Beispiele und einige Übungen -auch für diese Ortho-Sache. Das Buch mußt Du DIr ja nicht unbedingt kaufen. ![]() |
AW: Dreidimensionales Array darstellen.
Ohne nen büschen Arbeit und Einsatz geht's halt nicht. Du willst ne 3D-Darstellung, also musst du eine bauen. Die nötigen Infos hast du, und die OpenGL Docs sind nicht wirklich schlecht. Was fix und fertiges gibt's so wohl nicht. Eigentlich ist das sogar ein 1A Einstiegsprojekt für OpenGL, da es ein wunderbares und simples Beispiel ist.
|
AW: Dreidimensionales Array darstellen.
Zitat:
Zitat:
Aber ich werd mir deine Seite demnächst mal anschauen. Jetzt steht erstmal Urlaub auf dem Plan. :D Einen CubeEditor sollte ja auch 3D-Ansicht enthalten und der dazugehörige Simulator dafür, brauch ja auch was als Ausgabe. Werd mich wieder melden, wenn ich ein Problem hab (wird noch öfters vorkommen :stupid:). |
AW: Dreidimensionales Array darstellen.
Nur so als Gedanke, wie wärs wenn dus anstatt als Würfel also Tabellen darstelltst und die z Achse die anzahl der Tabellen sind und die quasi so durchblättern lässt?
|
AW: Dreidimensionales Array darstellen.
Zum ändern/erstellen der Muster hab ich ja die Ebenen, die ich dann durchschalten kann.
Ich möchte aber noch eine 3D Ansicht machen, damit man das Muster auch "real" sieht. |
AW: Dreidimensionales Array darstellen.
Okay, bis dahin.
Meld Dich auch bei DGL an, die Leute sind richtig fit bei OpenGL. Und sag, was ist Urlaub!?:shock: |
AW: Dreidimensionales Array darstellen.
Zitat:
Aber back to topic: PROBLEM GELÖST Ich hab das Problem gelöst (ohne gluOrtho2D :shock:). Mir wurde auf DGL geraten diese Zeile:
Delphi-Quellcode:
durch diese Zeile zu ersetzen:
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
Delphi-Quellcode:
Und es hat geklappt. Begründung: mit meinem vorherigen Code hab ich alles auf die Formulargröße gesetzt. MIt diesem Code mach ich das auf mein Panel und das ist ja so schön quadratisch. :-D Und jetzt ist mein Würfel ein Würfel. :stupid:
gluPerspective(45.0, panel1.ClientWidth/panel1.ClientHeight, NearClipping, FarClipping);
Weiter gehts: Ich hab mir jetzt diese Prozedur geschrieben:
Delphi-Quellcode:
Damit mache ich mein Cube und kann die Farbe beeinflussen. aber das ist ja nur ein Cube. Ich brauch aber mehrere (genau: 125). Wie schaffe ich die Verschiebung (je nach Koordinate)??? Zwischen den Cubes sollte auch ein bisschen Platz sein.
procedure TForm1.Cube(Color:Integer);
begin if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0,-1.0); // Top Right Of The Quad (Top) glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Top) glVertex3f(-1.0, 1.0, 1.0); // Bottom Left Of The Quad (Top) glVertex3f( 1.0, 1.0, 1.0); // Bottom Right Of The Quad (Top) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0,-1.0, 1.0); // Top Right Of The Quad (Bottom) glVertex3f(-1.0,-1.0, 1.0); // Top Left Of The Quad (Bottom) glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Bottom) glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Bottom) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0, 1.0); // Top Right Of The Quad (Front) glVertex3f(-1.0, 1.0, 1.0); // Top Left Of The Quad (Front) glVertex3f(-1.0,-1.0, 1.0); // Bottom Left Of The Quad (Front) glVertex3f( 1.0,-1.0, 1.0); // Bottom Right Of The Quad (Front) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0,-1.0,-1.0); // Bottom Left Of The Quad (Back) glVertex3f(-1.0,-1.0,-1.0); // Bottom Right Of The Quad (Back) glVertex3f(-1.0, 1.0,-1.0); // Top Right Of The Quad (Back) glVertex3f( 1.0, 1.0,-1.0); // Top Left Of The Quad (Back) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f(-1.0, 1.0, 1.0); // Top Right Of The Quad (Left) glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Left) glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Left) glVertex3f(-1.0,-1.0, 1.0); // Bottom Right Of The Quad (Left) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0,-1.0); // Top Right Of The Quad (Right) glVertex3f( 1.0, 1.0, 1.0); // Top Left Of The Quad (Right) glVertex3f( 1.0,-1.0, 1.0); // Bottom Left Of The Quad (Right) glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Right) end; |
AW: Dreidimensionales Array darstellen.
|
AW: Dreidimensionales Array darstellen.
Delphi-Quellcode:
Gibt leider nicht das Ergebnis. Ich glaub ich hab irgendwo in der Routine ein Problem.
for x := 1 to 5 do
begin for y := 1 to 5 do begin for z := 1 to 5 do begin glTranslatef(x/10,y/10,z/10); glBegin(GL_QUADS); Cube(0); glEnd; end; end; end; |
AW: Dreidimensionales Array darstellen.
Kurz nur draufgesehen, mögliches Problem:
Du verschiebst in deiner Routine ja immer weiter, ohne dass du den Zeichenstift zurücksetzt :) OpenGL ist eine State-Machine, das heisst, wenn du verschiebst, verschiebt er immer relativ! Also: Ursprung vor jedem Cube setzen:
Delphi-Quellcode:
for x := 1 to 5 do
begin for y := 1 to 5 do begin for z := 1 to 5 do begin glMatrixMode(GL_MODELVIEW) ; // optional, falls ModelView-Matrix nicht aktiv glLoadIdentity() ; // <---- möööp :D glTranslatef(x/10,y/10,z/10); glBegin(GL_QUADS); Cube(0); glEnd; end; end; end; |
AW: Dreidimensionales Array darstellen.
Ich persönlich würde hier eine bzw mehrere Schleifen bevorzugen.
ganz grob z.B.:
Delphi-Quellcode:
procedure WholeCube;
var i: Integer; i2: Integer; i3: Integer; x, y,z : Double; begin Ebene := 5; Reihe := 5; Spalte := 5; z := 0; for i := 0 to Ebene - 1 do begin y := 0; for i2 := 0 to Reihe - 1 do begin x := 0; for i3 := 0 to Spalte - 1 do begin Cube(x, y, z); x := x + Abstand end; y := Y + Abstand; end; z := z + Abstand; end; end;
Delphi-Quellcode:
Also das ist jetzt eine ganz grobe Skizze (das funktioniert so 1:1 noch nicht). Für den Würfel selbst sollte man vielleicht auch eine Schleife nutzen.
procedure Cube(x,y,z: Double);
begin glVertex3f( 1.0 + x, 1.0 + Y,-1.0 + z); // Top Right Of The Quad (Top) glVertex3f(-1.0 + x, 1.0 + Y,-1.0 + z); // Top Left Of The Quad (Top) glVertex3f(-1.0 + x, 1.0 + Y, 1.0 + z); // Bottom Left Of The Quad (Top) glVertex3f( 1.0 + x, 1.0 + Y, 1.0 + z); // Bottom Right Of The Quad (Top) ... end; Jetzt hast Du 2 Möglichkeiten! |
AW: Dreidimensionales Array darstellen.
Wenn schon optimieren: Ich würde das Zeichnen eines einzelnen Cubes in eine Display-Liste speichern, die man nur noch aufrufen muss. (Stichwörter: GlNewList und GLEndList).
Das ist wesentlich schneller als dauernd glbegin / glvertex / glend. Aber das ist erst dann angesagt, wenn die "normale" routine funzt :D |
AW: Dreidimensionales Array darstellen.
Liste der Anhänge anzeigen (Anzahl: 1)
Also mein aktueller Code sieht so aus:
Delphi-Quellcode:
Rauskommt nun das: siehe Video in der Zip Datei: Anhang 31950 PS: Das ruckeln kommt von der Aufnahme. In Wirklichkeit ist es schön flüssig. Leider sieht es noch nicht so aus, wie in diesem Beispiel:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, dglOpenGL; Type TVector2f = Array [0..1] of Single; TVector3f = Array [0..2] of Single; type TForm1 = class(TForm) Panel1: TPanel; Timer1: TTimer; Timer2: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); private { Private-Deklarationen } FrameCount : Cardinal; //FrameCounter procedure SetupGL; procedure Render; procedure ErrorHandler; procedure Cube(x,y,z:Double;Color:Integer); public { Public-Deklarationen } DC : HDC; //Handle auf Zeichenfläche RC : HGLRC;//Rendering Context end; var Form1: TForm1; const NearClipping = 1; FarClipping = 1000; var RotateX : single; // Rotation um die X-Achse RotateY : single; // Rotation um die Y-Achse RotateZ : single; // Rotation um die Z-Achse PosVect : TVector3f; // Vector mit der Position des Objektes. implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin DC:= GetDC(Panel1.Handle); if not InitOpenGL then Application.Terminate; RC:= CreateRenderingContext( DC, [opDoubleBuffered], 32, 24, 0,0,0, 0); ActivateRenderingContext(DC, RC); SetupGL; end; procedure TForm1.SetupGL; begin glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe: glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren glEnable(GL_CULL_FACE); //Backface Culling aktivieren RotateX := 0; RotateY := 0; RotateZ := 0; PosVect[0] := 0; PosVect[1] := 0; PosVect[2] := -5; end; procedure TForm1.Cube(x,y,z:Double;Color:Integer); begin if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0+x, 1.0+y,-1.0+z); // Top Right Of The Quad (Top) glVertex3f(-1.0+x, 1.0+y,-1.0+z); // Top Left Of The Quad (Top) glVertex3f(-1.0+x, 1.0+y, 1.0+z); // Bottom Left Of The Quad (Top) glVertex3f( 1.0+x, 1.0+y, 1.0+z); // Bottom Right Of The Quad (Top) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0+x,-1.0+y, 1.0+z); // Top Right Of The Quad (Bottom) glVertex3f(-1.0+x,-1.0+y, 1.0+z); // Top Left Of The Quad (Bottom) glVertex3f(-1.0+x,-1.0+y,-1.0+z); // Bottom Left Of The Quad (Bottom) glVertex3f( 1.0+x,-1.0+y,-1.0+z); // Bottom Right Of The Quad (Bottom) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0+x, 1.0+y, 1.0+z); // Top Right Of The Quad (Front) glVertex3f(-1.0+x, 1.0+y, 1.0+z); // Top Left Of The Quad (Front) glVertex3f(-1.0+x,-1.0+y, 1.0+z); // Bottom Left Of The Quad (Front) glVertex3f( 1.0+x,-1.0+y, 1.0+z); // Bottom Right Of The Quad (Front) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0+x,-1.0+y,-1.0+z); // Bottom Left Of The Quad (Back) glVertex3f(-1.0+x,-1.0+y,-1.0+z); // Bottom Right Of The Quad (Back) glVertex3f(-1.0+x, 1.0+y,-1.0+z); // Top Right Of The Quad (Back) glVertex3f( 1.0+x, 1.0+y,-1.0+z); // Top Left Of The Quad (Back) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f(-1.0+x, 1.0+y, 1.0+z); // Top Right Of The Quad (Left) glVertex3f(-1.0+x, 1.0+y,-1.0+z); // Top Left Of The Quad (Left) glVertex3f(-1.0+x,-1.0+y,-1.0+z); // Bottom Left Of The Quad (Left) glVertex3f(-1.0+x,-1.0+y, 1.0+z); // Bottom Right Of The Quad (Left) if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0+x, 1.0+y,-1.0+z); // Top Right Of The Quad (Right) glVertex3f( 1.0+x, 1.0+y, 1.0+z); // Top Left Of The Quad (Right) glVertex3f( 1.0+x,-1.0+y, 1.0+z); // Bottom Left Of The Quad (Right) glVertex3f( 1.0+x,-1.0+y,-1.0+z); // Bottom Right Of The Quad (Right) end; procedure TForm1.FormDestroy(Sender: TObject); begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end; procedure TForm1.Render; Const voffset : TVector3f = (0.0, 0.0, 0.0); toffset : TVector2f = (0.0, 0.0); tscale : TVector2f = (1.0, 1.0); var x,y,z:Integer; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(150.0, Panel1.ClientWidth/Panel1.ClientHeight, NearClipping, FarClipping); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef(0, 0, 0); // Das Objekt auf seine aktuelle Position setzen. glTranslatef( PosVect[0], PosVect[1], PosVect[2]); { Das Objekt noch drehen, damit denn wir haben bis jetzt ja nur den } { Vector gedreht. } glRotatef(RotateX, 1, 0, 0); glRotatef(RotateY, 0, 1, 0); glRotatef(RotateZ, 0, 0, 1); glBegin(GL_QUADS); for x := 0 to 4 do for y := 0 to 4 do for z := 0 to 4 do Cube(x*3,y*3,z*3,0); glEnd; SwapBuffers(DC); end; procedure TForm1.Timer1Timer(Sender: TObject); begin inc(FrameCount); Render; If FrameCount = 20 then begin ErrorHandler; FrameCount := 0; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin RotateY := RotateY + 0.5; // if RotateY <= 0 then RotateY := RotateY + 360; // RotateX := RotateX + 0.5; // if RotateX <= 0 then RotateX := RotateX + 360; // RotateZ := RotateY + 0.5; end; procedure TForm1.ErrorHandler; begin Form1.Caption := string(gluErrorString(glGetError)); end; end. ![]() Farben sind die gleichen. Hab von turboPASCAL schon den Code bekommen. Blick aber nicht ganz so durch und ich will es ja selber machen. Farben sind die gleichen wie in dem Programm von turboPASCAL |
AW: Dreidimensionales Array darstellen.
von der Bewegung her, solltest Du Dich mit dem Kamera-Thema auseinandersetzen.
![]() Der Autor hat ein Programmteil veröffentlicht, welches (bis auf Kleinigkeiten) gut läuft. Es läßt sich auch in Dein Programm einfacher einbinden, als man am Anfang vermuten würde. Ggf kannst Du den Autor auch einfach ansprechen. Bei Deinem Problem mit den Farben mußt Du konkreter werden. |
AW: Dreidimensionales Array darstellen.
wie bekomme, ich das so schön wie in dem beispiel von turboPASCAL??? bei ihm sind ja die würfel halb durchsichtig.
Die Farbe hab ich aus seinem Code |
AW: Dreidimensionales Array darstellen.
Das mit den transparenten Farben stell erst einmal nach ganz hinten. Das kann richtig kompliziert werden! Im schlimmsten Fall mußt Du tiefensortieren.
(Ich weiß nicht wie es turboPascal gemacht hat.) |
AW: Dreidimensionales Array darstellen.
Oh man. Ich dachte da müsste man nicht soviel beachten.
|
AW: Dreidimensionales Array darstellen.
Zitat:
Mach mal einfach folgendes nach glEnable(GL_CULL_FACE);
Delphi-Quellcode:
Edit: und schalte dazu mal glEnable(GL_DEPTH_TEST); aus! also auskommentieren! Der Tiefentest beisst sich nämlich in diesem konkreten Fall mit dem Alphablending.
glEnable(GL_BLEND) ;
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); achja und setz beim Aufruf von Cube den letzten Parameter auf 1 statt 0! In deiner Cube-Routine setzt du auch dauernd die color neu, das brauchst du gar nicht, da OpenGL eine Statemachine ist, einmal genügt, bis du ne andere Farbe brauchst. Und warums sch**** aussieht in deinem Fall, liegt an der Kamera. Eine Nearclippingplane von 1 und eine Farclippingplane von 1000 ist Mist hoch 8! :D Durch diese riesen Grenzen wird nur die Genauigkeit extrem verschlechtert. Nimm mal probeweise lieber:
Delphi-Quellcode:
NearClipping = 0.1;
FarClipping = 100; Zitat:
Willkommen in der Matrix! |
AW: Dreidimensionales Array darstellen.
Also, das mit dem transparent ist jetzt so, wie ich es mir vorgestellt hab.
Ich denke jetzt fehlt nur noch die Kamera, um eine ordentliche Anzeige zu haben. Oder??? |
AW: Dreidimensionales Array darstellen.
Zitat:
Stichwort: Translate vor Rotate / Rotate vor translate usw. :D |
AW: Dreidimensionales Array darstellen.
Ich hab heute nen lieben Tag....:lol:
Also, folgendes ändern:
Delphi-Quellcode:
dann...
PosVect[2] := -20;
Bei allen Schleifen anstatt von 0 bis 4:
Delphi-Quellcode:
und eben die Nearclipping und Farclipping wie im obigen Beitrag
for xyz := -2 to 2 do
und:
Delphi-Quellcode:
gluPerspective(90.0, Panel1.ClientWidth/Panel1.ClientHeight, NearClipping, FarClipping);
|
AW: Dreidimensionales Array darstellen.
Danke, Danke.
Ich glaub jetzt ist alles fertig und ich kann es in mein Programm einbauen. Hatte bis jetzt nur ein extra Programm um alles zu testen und meinen originalen Code vom richtigen Programm zu schonen. :stupid: EDIT: Ich frag lieber euch: Fehlt noch was??? :stupid: |
AW: Dreidimensionales Array darstellen.
Fragst du nach Optimierungs-Möglichkeiten? Frag lieber nicht :stupid:
Ansonsten...Licht fehlt bzw. generell kann ein Cube ja nur zwei farben haben (an/aus). Ist das kein RGB-Teil? |
AW: Dreidimensionales Array darstellen.
Ich sch**ß auf Optimierungen. :D
Nein der Cube ist ein stinklangweiligernormaler 5³ LED Cube mit blauen LEDs. :lol: Obwohl schon die Software (Bascom) steht und alles funktioniert und ich mir nur meine Muster von Hand (Bytes zusammenklicken) müsste, bin ich so verrückt und nutze meine letzten zwei Pins vom AtMega32 für eine RS232-Anbindung. Damit ich dann auch meine Musik anzeigen kann und mit dem Editor dann sofort das Muster auf dem Cube hab. :lol: Glücklicherweise waren die letzten zwei Portpins RxD und TxD. Hab ich ein Glück. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz