Entwickler-Ecke

Multimedia / Grafik - 3d kugel erstellen


Sebo - So 14.12.03 19:27
Titel: 3d kugel erstellen
Hi Leute
kann mir jemand sagen wieviel vertices ich für eine 3d Kugel nehmen sollte, und wie ich die koordinaten für die einzelnen vertices ermittle...
in delphi und mit den directx 8 header dateien von jedi
thx Sebo


Lhid - So 14.12.03 19:32

Meinung und mich grundlegend verändert.--> Beiträge gelöscht


Raphael O. - So 14.12.03 21:08

habe von DirectX programmierung keine Ahnung...
wieviele Vertices du nehmen soltlest hängt davon ab, wie gut diene Kugel aussehen soll und wie schnell das ganze sein soll ;)
beim Aussehen kann man durch die BEleuchtung auch noch was ausgleichen..

um die VertexPositionen zu ermitteln musst du ein bißchen mit schleifen (du brauchst 2 Stück und sin bzw cos rumspielen ;) )
wenn dus nicht hinbekommst, nachdem du es versucht hast (!), dann kann ich dir noch mehr helfen :)


Sebo - So 14.12.03 21:16

hab schon versucht hab aber nur eine röhre hinbekommen ;(


Raphael O. - So 14.12.03 21:27

habs grad leider nur für ne Halbkugel da, aber dass sollte sich erweitern lassen und dann brauch ich mir jetzt nicht die Mühe machen ;) :mrgreen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  for i := 0 to 19 do
    for k := 0 to 19 do
    begin
      xrot := 90 * ((i + 1) / 20);
      YRot := 360 * ((k + 1) / 20);
      Skydome[i, k][0] := cos(degtorad(yrot - 90)) * cos(degtorad(xrot)) * 5;
      Skydome[i, k][1] := -sin(degtorad(xrot)) * 5 + 1;
      Skydome[i, k][2] := -cos(degtorad(yrot)) * cos(degtorad(xrot)) * 5;
    end;

Skydome ist ein 2-Dimensionales Array, in dem die Werte gespeichert werden, weil die bei jedem Renderdurchlauf neu zu errechnen unnötiger Ressourcenverbrauch wäre...

zeichnen zue ich das wie folgt (3Vertices werden jeweils als 3Eck dargestellt...)





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:
 glBegin(GL_TRIANGLES);
  for i := 0 to 19 do
    for k := 0 to 19 do
    begin
         if k <> 19 then glVertex3f(Skydome[i, k + 1,0], Skydome[i, k + 1,1], Skydome[i, k + 1][2])
      else
        glVertex3f(Skydome[i, 0,0], Skydome[i, 0,1], Skydome[i, 0,2]);

      glVertex3f(Skydome[i, k,0], Skydome[i, k,1], Skydome[i, k,2]);

        if i <> 19 then glVertex3f(Skydome[i + 1,k,0], Skydome[i + 1,k,1],          Skydome[i + 1,k,2])
      else
        glVertex3f(Spitze[0], Spitze[1], Spitze[2]);


      if i <> 19 then glVertex3f(Skydome[i + 1,k,0], Skydome[i + 1,k,1],
          Skydome[i + 1,k,2])
      else
        glVertex3f(Spitze[0], Spitze[1], Spitze[2]);


      if (i <> 19) AND (k <> 19) then glVertex3f(Skydome[i + 1,k + 1][0],
          Skydome[i + 1,k + 1,1], Skydome[i + 1,k + 1,2])
      else
      begin
        if i = k then  glVertex3f(Skydome[0,0][0], Skydome[0,0][1], Skydome[0,0,2])
        else if k = 19 then   glVertex3f(Skydome[i + 1,0,0], Skydome[i + 1,0,1],
            Skydome[i + 1,0,2])
        else
          glVertex3f(Skydome[0,k + 1,0], Skydome[0,k + 1][1], Skydome[0,k + 1,2]);
      end;

       if (k <> 19) then glVertex3f(Skydome[i, k + 1,0], Skydome[i, k + 1,1],Skydome[i, k + 1,2])
      else
        glVertex3f(Skydome[i, 0,0], Skydome[i, 0,1], Skydome[i, 0,2]);
    end;
glEnd();


ich weiß nicht mehr inwieweit die verschachtelung nötig war... kommt mir im Moment etwas kompliziert vor :-/
Spitze ist übrigens so definiert:

Delphi-Quelltext
1:
2:
const
  Spitze : array[0..2] of Integer = (0,1,0);