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

Aktuelle Zeit: Di Jul 29, 2025 18:46

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen "glätten"
BeitragVerfasst: So Sep 05, 2004 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi Leute!

ich habe gerade ein etwas...naja...für euch vielleicht lachhaftes problem. wie kann ich die normale einer fläche per-vertex anstatt per-plane berechnen? im tut steht nur ich soll die normale des anliegenden vectors berechnen und den durchschnitt bilden. aber wie berechne ich den durchschnitt von 2 normalen und viel wichtiger, wo übergebe ich die neue normale? zwischen dem zweiten u. dritten vektor? bei einer anliegenden fläche stell ich mir die übergabe noch relativ einfach vor, aber wie ist es mit zwei oder mehr flächen? (zum beispiel kugeln)
würde mich über formeln und ggf. ein paar codefetzen sehr freuen :)

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Benutz bitte die Suchfunktion, zu dem Thema habe ich (und andere auch) schon so oft (ausführliche Dinge) gesagt dass ich keine Lust habe dass nochmal zu tippen. Prinzipiell musst du halt zuerst die Normalen pro Dreiecke (Polygon) berechnen, diese dann allen Eckpunkten des Polygons zuweisen, und dann prüfen welche Vertices zu welchem Polygon gehören. Dann die Normalen addieren und am Ende normalisieren. Allerdings sind korrekte weiche Normalen sehr schwer zu realisieren, da man bei harten Kanten (z.b. Würfel) durch weiche Normalen die für so ein Objekt falschen Normalen erstellt. Deshalb sollte man nicht blind normalisieren, sondern die Winkel zwischen Polygonen beachten und nur unter einer bestimmten Gradzahl weiche Normalen berechnen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 15:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
This is how i do it in gl3ds, but i may be doing it wrong...

basicaly what i does is read out a vertex for a face, then it searches for other faces that share the same vertex.
For each face with the same vertex the normals are added to each other in a temp var. Also the number of found faces is stored.
when all faces have been found you do:
added normals / number of faces found
next i normalize the result to be sure.
now we start over and take a vertex for the next face.... etc

but somehow i do not find the result right, so for the moment it is not enabled in gl3ds

Code:
  1.  
  2.   //real smooth normals...
  3.   vnormal.x:=0.0;
  4.   vnormal.y:=0.0;
  5.   vnormal.z:=0.0;
  6.   shared:=0;
  7.   for m := 0 to FNumMeshes -1 do
  8.   begin
  9.     if FMesh[m].FNumIndices > 0 then
  10.     begin
  11.       f := 0;
  12.       while f < (FMesh[m].FNumIndices - 3) do // go through all vertexes and
  13.       begin
  14.        Find:=FMesh[m].FVertex[FMesh[m].FIndices[f]];
  15.        for J:=0 to FMesh[m].FNumIndices-1 do
  16.         if ((FMesh[m].FVertex[FMesh[m].FIndices[j]].x=Find.x) and (FMesh[m].FVertex[FMesh[m].FIndices[j]].y=Find.y) and (FMesh[m].FVertex[FMesh[m].FIndices[j]].z=Find.z)) then
  17.        begin
  18.          vnormal.x:=vnormal.x+FMesh[m].FVNormal[FMesh[m].FIndices[j]].x;
  19.          vnormal.y:=vnormal.y+FMesh[m].FVNormal[FMesh[m].FIndices[j]].y;
  20.          vnormal.z:=vnormal.z+FMesh[m].FVNormal[FMesh[m].FIndices[j]].z;
  21.          Inc(Shared);
  22.        end;
  23.  
  24.         vertexn.x:=vnormal.x / shared;
  25.         vertexn.y:=vnormal.y / shared;
  26.         vertexn.z:=vnormal.z / shared;
  27.  
  28.         FMesh[m].FVnormal[FMesh[m].FIndices[f]] := normalize(vertexn);
  29.  
  30.         Shared:=0;
  31.  
  32.         vnormal.x:=0;
  33.         vnormal.y:=0;
  34.         vnormal.z:=0;
  35.  
  36.         f := f + 3;
  37.       end;
  38.     end;
  39.   end;
  40.  


also for vertex normals you store the normals for each vector, so on rendering you first write the normals and then the vertex...

_________________
http://3das.noeska.com - create adventure games without programming


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 » Einsteiger-Fragen


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]