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

Aktuelle Zeit: Do Jul 03, 2025 11:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Planar mapping...
BeitragVerfasst: Mo Dez 09, 2002 15:17 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

ist das jemand ein begriff ??
Ich suche gute Programmierinfos dazu...
Mathematics, sources usw...

Wird zu Texture Koordinaten Generation benutzt.
Nützlich wenn man eigenen 3D editor schreibt wie ich gerade :D

im DeleD 0.6 Editor steht in der readme:
- improved texturecoordinate generation using planar mapping

Daher hab ich das mit Planar mapping.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 09, 2002 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich kenn mich damit relativ gut aus, immerhin generiere ich so auch die Texturkoordinaten in meinem Editor.
Ausserdem hab ich mich mit Jeroen Commandeur (Programmierer von Delgine) über dieses Thema unterhalten und ihm meine Methode etwas näher erläutert...soweit ich informiert bin, nutzt er diese auch in der neuen Version von DeleD.

Hier mal ne kurze Erklärung der von mir genutzten Texturenkoordinatengeneration :

- Zuerst berechnet man die Fläche des Polygons (auf engl. "Plane")
- Dann berechnet man die Normale dieser Fläche
- Jetzt muss man nur noch prüfen, welche Koordinate (x,y oder z) dieser Normale am größten ist, und man weiss auf welcher Fläche (Plane->Daher auch planar Mapping) das Polygon (Dreieck) liegt
- Jetzt kann man die Texturenkoordinaten ganz einfach der entsprechenden Fläche nach zuordnen

Hier auch gleich entsprechende Codeschnippsel aus meiner Engine :

Herausfinden der Fläche auf welcher das Dreieck liegt...
Code:
  1.  
  2.  
  3. Plane.ConstructPlane(Vertex[0], Vertex[1], Vertex[2]);
  4.  
  5. if (Abs(Plane.Normal.x) > Abs(Plane.Normal.y)) and (Abs(Plane.Normal.x) > Abs(Plane.Normal.z)) then
  6.  
  7.  Result := 'YZ';
  8.  
  9. if (Abs(Plane.Normal.y) > Abs(Plane.Normal.x)) and (Abs(Plane.Normal.y) > Abs(Plane.Normal.z)) then
  10.  
  11.  Result := 'XZ';
  12.  
  13. if (Abs(Plane.Normal.z) > Abs(Plane.Normal.x)) and (Abs(Plane.Normal.z) > Abs(Plane.Normal.y)) then
  14.  
  15.  Result := 'XY';
  16.  
  17.  


Jetzt werden den Eckpunkten des Dreiecks seiner Fläche entsprechend die Texturkoordinaten gegeben...
Code:
  1.  
  2.  
  3. for i := 0 to 2 do
  4.  
  5.  begin
  6.  
  7.  if PolyPlane = 'YZ' then
  8.  
  9.   begin
  10.  
  11.   Vertex[i].u := Vertex[i].y;
  12.  
  13.   Vertex[i].v := Vertex[i].z;
  14.  
  15.   end;
  16.  
  17.  if PolyPlane = 'XZ' then
  18.  
  19.   begin
  20.  
  21.   Vertex[i].u := Vertex[i].x;
  22.  
  23.   Vertex[i].v := Vertex[i].z;
  24.  
  25.   end;
  26.  
  27.  if PolyPlane = 'XY' then
  28.  
  29.   begin
  30.  
  31.   Vertex[i].u := Vertex[i].x;
  32.  
  33.   Vertex[i].v := Vertex[i].y;
  34.  
  35.   end;
  36.  
  37.  end;


Jetzt noch die minimalen und maximalen U/V-Werte berechnen...
Code:
  1.  
  2.  
  3. uMin := Vertex[0].u;
  4.  
  5. vMin := Vertex[0].v;
  6.  
  7. uMax := Vertex[0].u;
  8.  
  9. vMax := Vertex[0].v;
  10.  
  11. for i := 0 to 2 do
  12.  
  13.  begin
  14.  
  15.  if Vertex[i].u < uMin then
  16.  
  17.  &nbsp;uMin := Vertex[i].u;
  18.  
  19.  if Vertex[i].v < vMin then
  20.  
  21.  &nbsp;vMin := Vertex[i].v;
  22.  
  23.  if Vertex[i].u > uMax then
  24.  
  25.  &nbsp;uMax := Vertex[i].u;
  26.  
  27.  if Vertex[i].v > vMax then
  28.  
  29.  &nbsp;vMax := Vertex[i].v;
  30.  
  31.  end;
  32.  
  33. uDelta := uMax-uMin;
  34.  
  35. vDelta := vMax-vMin;
  36.  
  37.  


...um die Texturkoordinaten dann letztendlich noch zu "normieren"...
Code:
  1.  
  2.  
  3. for i := 0 to 2 do
  4.  
  5.  begin
  6.  
  7.  Vertex[i].u := Vertex[i].u-uMin;
  8.  
  9.  Vertex[i].v := Vertex[i].v-vMin;
  10.  
  11.  Vertex[i].u := Vertex[i].u/uDelta;
  12.  
  13.  Vertex[i].v := Vertex[i].v/vDelta;
  14.  
  15.  end;
  16.  
  17.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 10, 2002 09:19 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Danke,

SOS du bist ein meister... ich verbeuge mich vor dir.
Deine Kenntnisse sind echt unerschöpflich ;)

matane,
Finalspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 10, 2002 11:23 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hab das grad mal ausprobiert, und funzt bei nem würfel fast perfect... er lässt mir aber irgendwie nen paar seiten aus... kann vielleicht sein, das meine normale falsch gesetzt sind... aber das kann man ja normalerweise testen, indem man einfach backface culling einschaltet und in den würfel reingeht und guckt obs dicht ist innen. Ist auch nich so, ich kann nach aussen schauen, und sobald ich wieder rausgehe, dann seh ich den würfel wieder...
Also müssten meine normale stimmen, es müsste dann an meiner programmierung liegen:

Sorry, en bissel unübersichtlich...hab meine alte engine zum testen benutzt.

Code:
  1.  
  2.  
  3.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Plane berechnen
  4.  
  5.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Plane := PlaneContruct(TriangleV);
  6.  
  7.  
  8.  
  9.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Herausfinden der Fläche auf welcher das Dreieck liegt...
  10.  
  11.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PlaneS := PlaneSide(Plane);
  12.  
  13.  
  14.  
  15.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Jetzt werden den Eckpunkten des Dreiecks seiner Fläche entsprechend die Texturkoordinaten gegeben...
  16.  
  17.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for planeloop := 0 to 2 do
  18.  
  19.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  20.  
  21.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case PlaneS of
  22.  
  23.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;psYZ:
  24.  
  25.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  26.  
  27.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].U := Triangle[planeloop].Y;
  28.  
  29.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].V := Triangle[planeloop].Z;
  30.  
  31.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  32.  
  33.  
  34.  
  35.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;psXZ:
  36.  
  37.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  38.  
  39.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].U := Triangle[planeloop].X;
  40.  
  41.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].V := Triangle[planeloop].Z;
  42.  
  43.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  44.  
  45.  
  46.  
  47.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;psXY:
  48.  
  49.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  50.  
  51.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].U := Triangle[planeloop].X;
  52.  
  53.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].V := Triangle[planeloop].Y;
  54.  
  55.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  56.  
  57.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  58.  
  59.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  60.  
  61.  
  62.  
  63.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Jetzt noch die minimalen und maximalen U/V-Werte berechnen...
  64.  
  65.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uMin := Triangle[0].u;
  66.  
  67.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vMin := Triangle[0].v;
  68.  
  69.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uMax := Triangle[0].u;
  70.  
  71.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vMax := Triangle[0].v;
  72.  
  73.  
  74.  
  75.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for planeloop := 0 to 2 do
  76.  
  77.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  78.  
  79.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Triangle[planeloop].u < uMin then
  80.  
  81.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uMin := Triangle[planeloop].u;
  82.  
  83.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Triangle[planeloop].v < vMin then
  84.  
  85.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vMin := Triangle[planeloop].v;
  86.  
  87.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Triangle[planeloop].u > uMax then
  88.  
  89.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uMax := Triangle[planeloop].u;
  90.  
  91.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Triangle[planeloop].v > vMax then
  92.  
  93.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vMax := Triangle[planeloop].v;
  94.  
  95.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  96.  
  97.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uDelta := uMax-uMin;
  98.  
  99.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vDelta := vMax-vMin;
  100.  
  101.  
  102.  
  103.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for planeloop := 0 to 2 do
  104.  
  105.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin
  106.  
  107.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].u := Triangle[planeloop].u - uMin;
  108.  
  109.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].v := Triangle[planeloop].v - vMin;
  110.  
  111.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].u := Triangle[planeloop].u / uDelta;
  112.  
  113.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Triangle[planeloop].v := Triangle[planeloop].v / vDelta;
  114.  
  115.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  116.  
  117.  
  118.  
  119.  


also und das steht in meiner mathe unit:

Code:
  1.  
  2.  
  3.  
  4.  
  5. function Normal(vPolygon: array of TR3D_Vector3f) : TR3D_Vector3f;
  6.  
  7. var
  8.  
  9.  &nbsp;vVector1,
  10.  
  11.  &nbsp;vVector2,
  12.  
  13.  &nbsp;vNormal : TR3D_Vector3f;
  14.  
  15. begin
  16.  
  17.  &nbsp;vVector1 := VectorSub(vPolygon[2], vPolygon[0]);
  18.  
  19.  &nbsp;vVector2 := VectorSub(vPolygon[1], vPolygon[0]);
  20.  
  21.  &nbsp;vNormal := Cross(vVector1, vVector2);
  22.  
  23.  &nbsp;vNormal := Normalize(vNormal);
  24.  
  25.  &nbsp;result := vNormal;
  26.  
  27. end;
  28.  
  29.  
  30.  
  31. function PlaneContruct(va : array of TR3D_Vector3f) : TR3D_Plane;
  32.  
  33. var
  34.  
  35.  &nbsp;N : TR3D_Vector3f;
  36.  
  37. begin
  38.  
  39.  &nbsp;N := Normal(va);
  40.  
  41.  &nbsp;Result.x := N.x;
  42.  
  43.  &nbsp;Result.y := N.y;
  44.  
  45.  &nbsp;Result.z := N.z;
  46.  
  47. end;
  48.  
  49.  
  50.  
  51. function PlaneSide(p : TR3D_Plane) : TR3D_PlaneSide;
  52.  
  53. begin
  54.  
  55.  &nbsp;if (Abs(p.x) > Abs(p.y)) and (Abs(p.x) > Abs(p.z)) then
  56.  
  57.  &nbsp; &nbsp;Result := psYZ;
  58.  
  59.  &nbsp;if (Abs(p.y) > Abs(p.x)) and (Abs(p.y) > Abs(p.z)) then
  60.  
  61.  &nbsp; &nbsp;Result := psXZ;
  62.  
  63.  &nbsp;if (Abs(p.z) > Abs(p.x)) and (Abs(p.z) > Abs(p.y)) then
  64.  
  65.  &nbsp; &nbsp;Result := psXY;
  66.  
  67. end;
  68.  
  69.  
  70.  
  71.  


was ist daran falsch ??? würd mich ma interessieren.

Danke,

PS: hier noch nen kleiner screen:

Bild

und noch einer:

Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 19, 2002 21:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
@all

Danke, was Neues was ich in meinen Mcad Sourcegenerator einbauen kann, simpel und auf den ersten Blick ziemlich funktional.

viel Spaß beim Programmieren,

Mars

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 25, 2002 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
ALSO ICH MUSS HIER ERSTMA EN GROSSES LOB AN SoS SCHICKEN, JUNGE DU WEISST SO ZIEMLICH ALLES, RESPEKT.

Gleichzeitig möchte ich auch für dieses Post danken, denn bei mir funzt das planar mapping hervorragend. VIELEN VIELEN DANK.

RSWM

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.016s | 16 Queries | GZIP : On ]