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

Aktuelle Zeit: Mi Mai 15, 2024 04:07

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen für Bumpmappieng
BeitragVerfasst: Mi Okt 15, 2003 14:10 
Offline
DGL Member

Registriert: Di Okt 07, 2003 12:26
Beiträge: 23
Also ich versuche zur zeit mit OpenGL eine Isometrische Landschaft zu
zeichnen. Dabei will ich auf die Quads der Landschaft Bumpmaping anweneden.
Die Richtung des Sonnenlichtes will ich mit einem Vektor angeben im World - Space angeben. Jetzt muss ich aber den Vektor fürs Bumpmapping relativ zum Quad angeben muss.
Meine frage jetzt: Wie rechne ich das um.
Ich bin erst in der 9. Klasse und da haben wir eigentlich noch keine Vektorrechnung gehabt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 15, 2003 15:01 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also das was du brauchst nennt sich Tangent Space, für Bumpmapping brauchst du 3 Vectoren aus denen du den Lichtvektor berechnest...

Tangente
BiNormale
Poly bzw Vertex Normale

Auf Delphi3d.net gibts einige Tangent Space Bump berechnung z.b. diese die ich in meiner engine verwende:

Code:
  1.  
  2.   TR3DTangentSpaceVertex = record
  3.     Position,
  4.     Normal,
  5.     Tangent,
  6.     Binormal : TVector;
  7.     Texcoord : TTexcoord;
  8.   end;
  9.  
  10. procedure TangentSpaceCalculate(var V1, V2, V3 : TR3DTangentSpaceVertex);
  11. var
  12.   V1_,
  13.   T1_,
  14.   V2_,
  15.   T2_  : TVector;
  16.   DDX,
  17.   DDY,
  18.   DDZ  : TVector;
  19.   dudx,
  20.   dvdx,
  21.   dudy,
  22.   dvdy,
  23.   dudz,
  24.   dvdz : Single;
  25.   Tangent,
  26.   Binormal : TVector;
  27. begin
  28.   V1_.X := V1.Position.X - V2.Position.X;
  29.   V1_.Y := V1.Position.Y - V2.Position.Y;
  30.   V1_.Z := V1.Position.Z - V2.Position.Z;
  31.   T1_.X := V1.Texcoord.U - V2.Texcoord.U;
  32.   T1_.Y := V1.Texcoord.V - V2.Texcoord.V;
  33.   T1_.Z := 0;
  34.  
  35.   V2_.X := V3.Position.X - V1.Position.X;
  36.   V2_.Y := V3.Position.Y - V1.Position.Y;
  37.   V2_.Z := V3.Position.Z - V1.Position.Z;
  38.   T2_.X := V3.Texcoord.U - V1.Texcoord.U;
  39.   T2_.Y := V3.Texcoord.V - V1.Texcoord.V;
  40.   T2_.Z := 0;
  41.  
  42.   DDX := VectorCrossProduct(Vector(V1_.X, T1_.X, T1_.Y), Vector(V2_.X, T2_.X, T2_.Y));
  43.   DDY := VectorCrossProduct(Vector(V1_.Y, T1_.X, T1_.Y), Vector(V2_.Y, T2_.X, T2_.Y));
  44.   DDZ := VectorCrossProduct(Vector(V1_.Z, T1_.X, T1_.Y), Vector(V2_.Z, T2_.X, T2_.Y));
  45.  
  46.   dudx := - ddx.y/ddx.x;
  47.   dvdx := - ddx.z/ddx.x;
  48.   dudy := - ddy.y/ddy.x;
  49.   dvdy := - ddy.z/ddy.x;
  50.   dudz := - ddz.y/ddz.x;
  51.   dvdz := - ddz.z/ddz.x;
  52.  
  53.   Tangent.Setup(dudx, dudy, dudz); Tangent.Normalize;
  54.   Binormal.Setup(dvdx, dvdy, dvdz); Binormal.Normalize;
  55.  
  56.   V1.Tangent.Add(Tangent);
  57.   V2.Tangent.Add(Tangent);
  58.   V3.Tangent.Add(Tangent);
  59.  
  60.   V1.Binormal.Add(Binormal);
  61.   V2.Binormal.Add(Binormal);
  62.   V3.Binormal.Add(Binormal);
  63. end;
  64.  


Die Procedure berechnet dir die Tangent und BiNormale und überschreibt den zugehörigen vektor dazu.
Das einzigste was du machen musst, sind die Daten V1-V3 mit daten zu füllen:

Position = Welt Position XYZ
Normal = Normale XYZ
Texcoord = Texture Koordinate UV

aus den 3 Komponten berechnet er dann des ;)

Aber um den endgültigen Lichtvector zu bekommen, rechnest du "während der laufzeit":

Code:
  1.  
  2. procedure r3d_CalculateLightAndHalfAngle(var _Poly : TR3DPolygon; const _CamPos : TR3DVector);
  3. var
  4.   I : Integer;
  5.   LightVector,
  6.   HalfAngleVector,
  7.   CamCoord,
  8.   NormalLightVector : TR3DVector;
  9. begin
  10.   For I := 0 to 2 do
  11.   begin
  12.     // _Poly.Basis[0] = Tangent
  13.     // _Poly.Basis[1] = BiNormal
  14.     // _Poly.Basis[2] = Normal
  15.  
  16.     LightVector := r3d_VectorSub(gActiveLight.Position, _Poly.Vecs[I].Coord);
  17.     _Poly.Vecs[I].Light.X := r3d_VectorDotProduct(LightVector, _Poly.Basis[0]);
  18.     _Poly.Vecs[I].Light.Y := r3d_VectorDotProduct(LightVector, _Poly.Basis[1]);
  19.     _Poly.Vecs[I].Light.Z := r3d_VectorDotProduct(LightVector, _Poly.Basis[2]);
  20.  
  21.   end;
  22. end;
  23.  


Mehr kann ich dir aber auch nicht helfen, hoffe mal das reicht ;)
Ansonsten findest du infos auf delphi3d.net und nvidia.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 15, 2003 15:13 
Offline
DGL Member

Registriert: Di Okt 07, 2003 12:26
Beiträge: 23
danke


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.027s | 17 Queries | GZIP : On ]