Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 13:30

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 51 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:17 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach ich bin momentan auch dabei nen Compiler von .map in mein eigenes format zu kompilieren.
Zum mappen nutzt ich GTKRadiant, das speichert einen einzigen würfel so ab:

256x256x128 Quader:

Code:
  1.  
  2. // entity 0
  3. {
  4. "classname" "worldspawn"
  5. // brush 0
  6. {
  7. ( 128 128 -64 ) ( -128 128 -64 ) ( -128 -192 -64 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  8. ( -128 -192 64 ) ( -128 128 64 ) ( 128 128 64 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  9. ( -120 -128 8 ) ( 136 -128 8 ) ( 136 -128 0 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  10. ( 128 -192 8 ) ( 128 128 8 ) ( 128 128 0 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  11. ( 128 128 8 ) ( -128 128 8 ) ( -128 128 0 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  12. ( -128 128 8 ) ( -128 -192 8 ) ( -128 -192 0 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  13. }
  14. }
  15.  


Wenn man logisch denkt, mit normalem OpenGL Grundwissen und sieht so eine zeile:

Code:
  1.  
  2. ( 128 128 -64 ) ( -128 128 -64 ) ( -128 -192 -64 ) base_wall/atech2_c 0 0 0 0.500000 0.500000 0 0 0
  3.  


Dann meint man das hier:

( X Y Z ) ( X Y Z ) ( X Y Z ) Shadername TexOffsetX TexOffSetY TexRotation TextureScaleX TextureScaleY Flags ? ?

Alles nachden shadername sind texture informationen und eigentlich nicht notwendig, da man ja über Planar mapping einfach Texcoords berechnen kann, aber um dieses zu machen brauch man erstmal die geometrie.

Habe nen parser gemacht, der parset erstmal die gesamte .map datei in records bzw arrays ein damit man besser arbeiten kann ;)

Code:
  1.  
  2. Für E = alle Worldspawn entitys
  3.   Für B alle Entitys[E].BrushSides darin
  4.     Poly[0] := Entitys[E].BrushSides[B].Coord[0];
  5.     Poly[1] := Entitys[E].BrushSides[B].Coord[1];
  6.     Poly[2] := Entitys[E].BrushSides[B].Coord[2];
  7.  
  8.     // Was nun mit dem 3 x (X,Y,Z) daten machen ?
  9.  


Einfach als Polygon speichern ist nicht, das bringt übelste geometrie fehler.
Was macht man nun damit ? Ich nehme mal an, das zeugs ist noch nicht gecarvet und so.
Also muss man selber ne CSG routine machen... aber wollen wir erstmal polys rauslesen, der rest kommt dann.

Wäre mal nett wenn das mal einer Noobverständlich erklärt.

thx,
matane,
Final

Den compiler post ich dann mit quellcode als Opensource, damit jeder .map files in sein format kriegt ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
@SoS: Stimmt :D hab mir den code ma genauer angeguckt ..... ich versuchs ma umzukonstuieren...
denn in meiner Engine hab ich auch nen LightMapper benutzt der auf deinem Basiert... ein mod sozusagen...
hab aber noch ne frage zu dem lightmapper...
wie kann ich was ausserhalb seiner berechnungen zeichnen ?
z.b. die Player... die sind ganz schwarz... mit glDisable(gl_texture_2d); gehts nich..

@Finalspace:
<a href='http://collective.valve-erc.com/index.php?go=map_format' target='_blank'>http://collective.valve-erc.com/index.php?...p?go=map_format</a>
da müsste alles stehen was du brauchst...

cya

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
NiGhTmArE hat geschrieben:
@SoS: Stimmt :D hab mir den code ma genauer angeguckt ..... ich versuchs ma umzukonstuieren...
denn in meiner Engine hab ich auch nen LightMapper benutzt der auf deinem Basiert... ein mod sozusagen...
hab aber noch ne frage zu dem lightmapper...
wie kann ich was ausserhalb seiner berechnungen zeichnen ?
z.b. die Player... die sind ganz schwarz... mit glDisable(gl_texture_2d); gehts nich..

glDisable(GL_TEXTURE_2D) klappt schon, du musst allerdings das Texturemapping auf der TMU deaktivieren, auf der du die Lightmaps für deine Geometrie gebunden hast.Wenn du deine Basemap auf TMU0 hast und deine Lightmap auf TMU1, dann musst du, wenn du die Lightmaps für dein Modell nicht verwendest, auf die TMU1 wechseln (glActiveTextureARB(GL_TEXTURE1_ARB)) und dort dann via glDisable(GL_TEXTURE_2D) das Texturemapping auf dieser Unit deaktivieren, bevor du wieder auf TMU0 wechselst und dann die Textur für dein Playermodel bindest.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
stimmt .... danke !

du hast ja gesagt, das Worldcraft etc... auf Triangles nicht auf Quads basiert...
stimmt auch ... im prinzip....
aber er speichert für ein Quader nur 6 Triangles.... das heißt er muss die restlichen punkte selber ausrechnen... dann kann man doch gleich quads benutzen oder ?
oder kann ich das mit nem speziellen glBegin oder so automatisch machen lassen ?

Nachtrag : ausserdem hab ich noch nie ein Dreieck in HL gesehen...

cya

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Für jede Seite wird nicht ein Dreieck gespeichert, sondern drei Punkte, die die Ebene der Seite beschreiben. Brushs werden nur durch eine Reihe von Ebenen definiert. Um die ursprünglichen Flächen zu erhalten muß man für jede Ebene eine Fläche erstellen und diese an allen anderen Ebenen der Brush schneiden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
ehhhmmm ja :D
wollt ich auch sagen... :D

Zitat:
Um die ursprünglichen Flächen zu erhalten muß man für jede Ebene eine Fläche erstellen und diese an allen anderen Ebenen der Brush schneiden


Was, Wo, Wie schneiden lassen ?

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man errechnet zuerst aus den 3 Punkte die Ebene für jede Seite der Brush. Dann macht man eine riesige Fläche für jede Seite, die auf der Ebene liegt.

Was in den Flächen drin liegt ist die ursrpüngliche Brush.

Code:
  1.  
  2.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  3.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  4. -----------------
  5.  &nbsp; &nbsp;|xxxx |
  6.  &nbsp; &nbsp;|xxxx |
  7. -----------------
  8.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  9.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  10.  


Da jetzt überall abe die Kanten überstehen, schneidet man sie eben ab, indem man an allen anderen Ebenen, die nicht genau entgegengesetzt liegen schneidet

1.
Code:
  1.  
  2.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  3.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  4.  &nbsp; &nbsp;--------
  5.  &nbsp; &nbsp;|xxxx |
  6.  &nbsp; &nbsp;|xxxx |
  7. -----------------
  8.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  9.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  10.  


2.
Code:
  1.  
  2.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  3.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  4.  &nbsp; &nbsp;--------
  5.  &nbsp; &nbsp;|xxxx |
  6.  &nbsp; &nbsp;|xxxx |
  7.  &nbsp; &nbsp;--------
  8.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  9.  &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|
  10.  


3.
Code:
  1.  
  2.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |
  3.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |
  4.  &nbsp; &nbsp;--------
  5.  &nbsp; &nbsp;|xxxx |
  6.  &nbsp; &nbsp;|xxxx |
  7.  &nbsp; &nbsp;--------
  8.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |
  9.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |
  10.  


4.
Code:
  1.  
  2.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  3.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  4.  &nbsp; &nbsp;--------
  5.  &nbsp; &nbsp;|xxxx |
  6.  &nbsp; &nbsp;|xxxx |
  7.  &nbsp; &nbsp;--------
  8.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  9.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  10.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
axo...
also kann man aber keine Triangles benutzen... da ja alles aus Brushes besteht...
aber wie schneide ich die ab ?

glCut() ;D ?

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Doch man muß sich das selber in Dreiecke zerlegen und auch selber schneiden. Am besten nimmt man für das Erstellen der Brush Triangle Fans, die man dann selber zurechtsschneidet. Das macht man dann am besten nur einmal pro Level beim Berechnen. Dann kann man das ganze ja immer noch als Dreiecksliste abspeichern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 14:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
is schon klar... aber das problem is ja folgendes :
1.wie schneide ich die zurecht ?
2. wenn der eh Brushes macht kann ich die doch gleich als quads speichern oder ?

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 14:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es gibt ja auch 8-eckige oder 3-eckige Brushs. Da ist jede konvexe geschlossene Form erlaubt.
Beim Schneiden prüft man Punkt für Punkt welche Punkte auf der richtigen Seite der Ebene liegen und welche nicht. Wenn ein Punkt auf der falschen Seite liegt und sein Vorgänger auf der richtigen, dann berechnet man den Schnittpunkt der Verbindung mit der Ebene.

so ungefähr geht das:

Code:
  1.  
  2. für alle Punkte
  3.  p1=aktueller Punkt
  4.  p2=nächster Punkt
  5.  p1 vor der ebene,p2 vor der Ebene:
  6.  &nbsp; p1 hinzufügen
  7.  p1 vor der ebene,p2 hinter der Ebene: &nbsp; &nbsp;
  8.  &nbsp; p1 hinzufügen
  9.  &nbsp; Schnittpunkt von (P1 nach P2) mit &nbsp;der Ebene hinzufügen
  10.  p1 hinter der ebene,p2 vor der Ebene:
  11.  &nbsp; Schnittpunkt von (P1 nach P2) mit der Ebene hinzufügen
  12.  &nbsp;
  13.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
kannst du da mal ein beispiel (in form einer Unit oder hier im Forum) geben ? :D
p1: aktueller Punkt
p2: nächster Punkt
woher bekomm ich die Punkte ?
hab da gar keinen Durchblick grad ...

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
es geht dadrum eine Fläche an einer Ebene zu schneiden
Die Fläche ist ein Triangle Fan.
p1 ist dann Fläche.punkt[i]
p2 ist dann Fläche.punkt[(i+1) mod AnzahPunkte]
p2 ist also der nächste Punkt.

dann erstellt man eine neue Fläche.
Punkt hinzufügen heißt in dem Zusammenhang den Punkt z uder neuen Fläche hinzuzufügen:
So könnte das im Code aussehen.
EPSILON ist ein kleiner Wert=0.1 um Fehler durch die Gleitkommazahlen zu vermeiden.
Plane_Hit berechnet wo die Ebene getroffen wird, wenn man von p1 nach p2 geht. AddPoint fügt den neuen Punkt hinzu. Zu Begin werden die Punkte in ein temp Array kopiert und dann wird die ursprüngliche Punkteliste gelöscht.

Code:
  1. procedure TPolygon.Clip(const pl:TPlane);
  2. var
  3.  temp:array of TDrawVertex;
  4.  i:integer;
  5.  v1,v2,v3:TVertex;
  6. begin
  7. setlength(temp,length(points));
  8. for i:=0 to length(points)-1 do
  9.  temp[i]:=points[i];
  10. points:=nil;
  11. for i:=0 to length(temp)-1 do
  12. begin
  13. v1:=temp[i].pos;
  14. v2:=temp[(i+1) mod length(temp)].pos;
  15. if plane_dist(pl,v1)>-EPSILON then
  16. begin
  17.  if plane_dist(pl,v2)>-EPSILON then
  18.  begin
  19.  &nbsp;  AddPoint(v1);
  20.  end
  21.  else
  22.  begin
  23.  &nbsp;  AddPoint(v1);
  24.  &nbsp;  Plane_Hit(pl,v1,v2,v3);
  25.  &nbsp;  AddPoint(v3);
  26.  end;
  27. end
  28. else
  29. begin
  30.  if plane_dist(pl,v2)>-EPSILON then
  31.  begin
  32.  &nbsp;  Plane_Hit(pl,v1,v2,v3);
  33.  &nbsp;  AddPoint(v3);
  34.  end
  35. end;
  36. end;
  37. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
das prinzip hab ich verstanden...
also man macht ne ebene auf die 3 punkte... (egal wie groß nur groß genug, das man nichts hinzufügen muss anstatt des abschneidens)
dann setzt man punkte entlang einer der 4 linien und prüft, wann sie die anderen seiten schneiden..
aber die anderen muss man doch auch ausrechnen :D ?!?! oder
man hat also keinen anfang oder wie ?

unnd durch den code blick ich nich durch .... was is ein TPlane ?
was für ein array ist points ?
und was macht diese epsilon da ?

das is zu hoch für mich glaub ich .. <_< :( :unsure: :blink:

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja, das muß man mit allen Flächen und Ebenen machen.

Der Rest sieht dann so aus: pl sind alle Ebenen, die aus der Map Datei gelesen wurden. Plane_Mirror dreht die Ebene nur um, damit die richtige Seite geclipt wird.

Code:
  1.  
  2. procedure TMesh.CreateFromPlaneList(const pl:array of TPlane);
  3. var
  4.  i,j:integer;
  5.  p:TPolygon;
  6. begin
  7. Clear;
  8. for i:=0 to length(pl)-1 do
  9. begin
  10. p:=TPolygon.Create;
  11. p.CreateFromPlane(pl[i]);
  12.  for j:=0 to length(pl)-1 do
  13.  &nbsp;if (i<>j) and not Vec_Equal(pl[i].normal,vec_Scale(pl[j].normal,-1)) then
  14.  &nbsp; p.Clip(Plane_Mirror(Pl[j]));
  15. if length(p.points)>0 then
  16.  AddPolygon(p)
  17. else
  18.  p.free;
  19. end;
  20. end;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 51 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 17 Queries | GZIP : On ]