Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Sa 20.11.04 20:40 
Hi Leute,

ich glaube diese Woche krieg ich noch nen Koller.
Ich welchse jetzt schon das dritte mal wieder von DirectX zu OpenGL, weil ich immer wieder was finde was mit Delphi 3 net geht.

Hat man sich mit Mühe und Not einen läuffähigen DX8 header geschrieben und freud sich nen Keks, so zeichnet das blöde DirectX net. Die Scene ist da, sie ist schwarz, aber egal was ich mache sie bleibt schwarz. Kein dreickeck, nichts.

So nun bin ich wieder bei OpenGL und stehen vor dem nöchsten Nervenzusammenbruch.

MEIN DREIECK VERSCHINDET OHNE JEGLICHEN GRUND.

ich habe nach eurem Tutorial OpenGL Initialisiert, und gestartet.
habe mit ein Dreieck gebaut und wollte es zeichnen.
Wunderbar dachte ich mir: es hat dreiecken, ist rot und alles super.

Ich kanns nach rechts verschieben, nach links, nach oben, nach unten.

Da sag ich mir "verschiebst du es doch mal nach hinten".

und plop weg is es.
?????
hä?
also wieder nach vorne geholt und es ist wieder sichtbar.

So nun nehme ich einfach einen Scalierten Sinus. Der soll es mir immer von -2 über 0 nach +2 und wieder zurück nach 0 schieben, also hinten vorne hinten vorne.

Ob ihrs glaubt oder nicht, ab einem bestimmten Punkt ist es weg.
Was red ich eigentlich so viel, schaucht es euch einfach selber an.

OpenGL1.2 hab ich von
www.Koshigaya.de/Download/OpenGL.zip
aus eurem Tutorial

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Opengl12, ExtCtrls;

type
  Tmain = class(TForm)
    draw_timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure InitGL;
    procedure DrawScene;
    procedure draw_timerTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  main: Tmain;

implementation
{$R *.DFM}
//------------------------------------------------------------------------------
//Variablen
var
  DC: hDC;
  hrc: HGLRC;
    pfd: TPIXELFORMATDESCRIPTOR;
  nPixelFormat: GLUint;

//------------------------------------------------------------------------------
//Main Form

procedure Tmain.FormCreate(Sender: TObject);
begin
  //Initilasiere
  InitGL;
    //erstellet irgendein großes Hauptdingens
    hrc := wglCreateContext(DC);
    //setzt fals mehrere Zeichenfläche da sind DC auf die aktuelle
    wglMakeCurrent(DC,hrc);

    //Schrift einstellen
    main.canvas.font.size := 12;
    main.canvas.font.color := clblack;
    main.canvas.font.name := 'Comic Sans MS';
end;

procedure Tmain.InitGL;
begin
  //erzeugt alles wichtige in OpenGL
  InitOpenGL;

    //Zeichenfläche bestimmen
    DC := GetDC(main.handle);

    //Scene schwarz machen
    glClearColor(1,0,0,0);

    //Tiefenbuffer leeren
    glClearDepth(1);

    //Obejcte weiter vorne über decken Objecte weiter hinen
    glDepthFunc(GL_LESS);

    //Shading Technik
    glShadeModel(GL_SMOOTH);

    //ZBuffer aktivieren
    glEnable(GL_DEPTH_TEST);

    //Viewport einstellen
    glViewport(0,0,main.Width,main.Height);

    //Matrixmode auf Projection stellen
    glMatrixMode(GL_PROJECTION);

    //Matrix reseten
    glLoadIdentity;

    //Perspective einstellen
    gluPerspective(45,main.Width/main.Height,1,100);

    //in den normalen MAtrixmodus zurückwechseln
    glMatrixMode(GL_MODELVIEW);

    //Pixelformatdescriptor definieren
    pfd.nSize := sizeof(TPIXELFORMATDESCRIPTOR );
    pfd.nVersion := 1;
    pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    pfd.iPixelType := PFD_TYPE_RGBA;
    pfd.cColorBits := 24;
    pfd.iLayerType := PFD_MAIN_PLANE;
    pfd.cDepthBits := 32;

    //Pixelformat übernehmen
    nPixelFormat := ChoosePixelFormat(DC, @pfd);
    SetPixelFormat(DC,nPixelFormat,@pfd);
end;

procedure Tmain.DrawScene;
begin
  //Scene löschen
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    //Matrixmode auf Model ändern
    glMAtrixMode(GL_MODELVIEW);
    //Modelmatrix reseten
    //ich weiß, ich weiß, man kann keine Matrix reseten :-p
    glLoadIdentity;

    //verschieben
    gltranslate(0,0,sin(draw_timer.tag*pi/180)*2);

    //Dreicek erstellen
  glBegin(GL_TRIANGLES);
      glColor3f(1,0,0);
      glVertex3f(0,0,0);
        glVertex3f(0,0.5,0);
      glVertex3f(0.5,0.5,0);
        glVertex3f(0.5,0,0);
  glEnd;

    //Bufferwechseln, Zeichenen
    SwapBuffers(DC);
end

procedure Tmain.draw_timerTimer(Sender: TObject);
begin
  main.DrawScene;
    draw_timer.tag := draw_timer.tag + 1;
    main.Canvas.TextOut(0,0,inttostr(draw_timer.tag));
end;

end.
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: Sa 20.11.04 20:52 
Das Problem liegt warscheinlich bei gluPerspective. Die letzten 2 Ziffern geben den Renderbereich an. Du renderst von z=1 bis 100. Der Sinus kann aber auch <1 werden.
Ersetze Zeile 116 mal durch folgendes:
ausblenden Delphi-Quelltext
1:
gltranslate(0,0,sin(draw_timer.tag*pi/180)*2+2);					

_________________
Linux und OpenSource rulez!
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Sa 20.11.04 20:57 
hört sich logisch an :-)

hast du es mal ausprobiert?

also bei mir gehts leider nicht :-(

Aber es muss doch irgendwie was mit der Render reichweite zutun haben
oder muss man die dritte dimension erst erstellen?
also keine ahnung irgend ein bestimmtest parameter aktivieren

ich kann es ja nach rechts links oben unten verschieben

nur ich kann es nicht mla im geringesten nach hinten verschieben oder nach vornen
es tut sich nichts. ich sehe nicht mal das kleiner werden mit dem sinus es verschwindet einfach ohne seinen größer auch nur verändert zu haben. Und es tauscht genau so groß wie vorher wieder auf. :-(

Gruß Tobi
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: Sa 20.11.04 21:01 
Schreib mal nach Zeile 74

ausblenden Delphi-Quelltext
1:
  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);					


rein. Ich glaub zwar nicht, dass es hilft, aber probiern geht über studirn.

P.S.: Ich habs nicht ausprobiert.

_________________
Linux und OpenSource rulez!
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Sa 20.11.04 21:05 
Hilft leider auch nicht :-(

Aber erst mal DAAAAANKE für deine Mühen.:-)

Ich kann mir einfach nicht erklären warum

Gruß Tobi
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Sa 20.11.04 22:39 
Erstmal habe ich eine bitte. Seit der Thematik nicht mit Zorn begegnet. Ich zähle es zu den Künsten und keine davon wird sich voll offenbaren, wenn man ihr mit Zorn begegnet.
Mein erster Versuche w#re ebenfalls gluPerspective. Allerdings gerade in Anbetracht deiner D3D-Vergangenheit, lass mich eines fragen. Bist Du Dir bewußt, dass OpenGL wie die Mathematik die dritte Achse anders ausrichtet als Direct3D? Die Z-Achse wird nach vorne (in den Bildschirm hinein) negativ und nicht wie bei D3D positiv. Hast Du beim verschieben nach vorne dies vielleicht nicht bedacht?
Versuch auch einmal nach dem glLoadIdentity die Szene nach hinten zu transformieren. Ah, sorry, mein Geist ist nicht mehr so klar, sollte aber sein:
glTranslatef(0,0,5);

Nun solltest Du das Dreieck eigentlich vollständig bei der Sinusbewegung sehen. Ist dem so?

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."