• Keine Ergebnisse gefunden

Codierung von Grafik-Modellen

N/A
N/A
Protected

Academic year: 2022

Aktie "Codierung von Grafik-Modellen"

Copied!
16
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

8 ; Anzahl Punkte

; Koord. Pkt[0] etc.

6 ; Anzahl Flaechen

4, 4, 4, 4, 4, 4 ; Pkte je Flaeche 0, 1, 2, 3 ; Pkt-Idx ab Flaeche[0]

1, 5, 6, 2 2, 6, 7, 3 3, 7, 4, 0 4, 7, 6, 5 5, 1, 0, 4

Speicherung eines Grafik-Objekts (z.B. eines Würfels):

cube.cgf ; Objekt-Name - CGF Version 0.0

-1., -1., 1.

1., -1., 1.

1., 1., 1.

-1., 1., 1.

-1., -1., -1.

1., -1., -1.

1., 1., -1.

-1., 1., -1.

(7)---(6) / | / | / | / | / (4)--/--(5) (3)---(2) / | / | / | / | / (0)---(1)

(Xface?)

Geometrie der Objektpunkte (ihre räumliche Lage)

Topologie der Objektpunkte (Beziehungen zwischen ihnen)

(2)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

Anmerkung zur Codierung von Grafik-Objekten (z.B. Würfel):

Grundsätzlich zwei technisch realisierbare Codierungs- philosophien für die (4D-)Flächenecken (z.B.: facePnt ):

1. Individuelle Speicherung aller Flächenecken-Koord., d.h.

(6 Flächen x 4 Punkte/Fläche x 4Koord./Punkt=) 96 Werte:

float facePnt[6][4][DIM]; #define DIM 4  Unnötig erhöhter Speicherbedarf

Bei Formänderungen (z.B.: Erhöhung einer Kuppelspitze) ist zu berücksichtigen, daß jeder Objektpunkt in mehreren (beim Würfel: in 3) Flächen vorkommt:

 Unnötig erhöhter Rechenzeitbedarf

 Kaum wartbare Fehler-Quelle

 nicht gebräuchlich, nicht zu empfehlen (quick & dirty) 2. Alternative: Trennung von Objekt-Geometrie u. -Topologie

(3)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

2. Geometrie-Codierung von 3D-Objekten durch (einmalige) Speicherung der Koordinaten – z.B. Würfel:

float cubVrtx[8][DIM]; /*32 Koordinaten*/

Zwei gebräuchliche Verfahren zur Topologie-Erfassung:

2a) Erfassung der Punkt-Indizes für jede Fläche – z.B.:

int facePnt[6][4]; /*24 Indizes*/

Bsp. Zuordnung Flächen- / Objektpunkt:

facePnt[5][3]=7; /*4.Pkt d.6.Flaeche≡8.ObPkt*/

 Unhandliche, fehleranfällige Ausdrücke, z.B.:

float x; /*...*/ x=cubVrtx[facePnt[5][3]][0];

 Gebräuchlich eher in„Rapid-Prototyping“-Programmen 2b) Erfassung der Punkt-Adressen für jede Fläche – z.B.:

float *facePnt[6][4], x; /*...*/

facePnt[5][3]=cubVrtx[7]; x=facePnt[5][3][0];

 Intuitive, übersichtliche, robuste Ausdrücke

(4)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

Beispiel: „Harte“ Codierung eines Würfels

int main() { int j1=0;

float cubVrtx[8][DIM]; //Koordinaten der Wuerfelecken float *facePnt[6][4]; //Flaechen-Def.: Punkt-Adressen /*Koordinaten-Zuweisung fuer Wuerfel-Punkt (z.B.):*/

for(j1=0;j1<DIM;j1++) cubVrtx[7][j1]=4.f-j1;//=4,3,2,1 /*Verknuepfung Flaechen-Ecke / Wuerfel-Punkt (z.B.):*/

facePnt[5][3] = cubVrtx[7]; /* = &cubVrtx[7][0]; */

for (j1=0; j1<DIM; j1++) /*Koordinaten-Ausgabe: */

{ printf ("\n\r facePnt[5][3][%d]=%5.2f"

" = cubVrtx[7][%d]=%5.2f", j1, facePnt[5][3][j1],

j1, cubVrtx[7][j1]);

printf (" =%5.2f \n\r",*(*(*(facePnt+5)+3)+j1));

} _getch(); return 0; }

#include <conio.h>

#include <stdio.h>

s.Projekt: 010ObjCod

(5)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

 Besonders interessanter Spezialfall: Zuweisung von phys.

Eigenschaften (z.B. Farbe) einem bestimmten Objektpunkt

 Ermittlung des Objektpunkt-Index aus der Objpkt.-Adresse Beispiel:

#define DIM 4

float cubVrtx[8][DIM];

float *facePnt[6][4]; /*...*/

facePnt[5][3]= facePnt[4][1]= cubVrtx[7];

Gemeinsamkeit aller Instanzen facePnt eines Objektpunktes cubVrtx auf unterschiedlichen Flächen:

Adressen-Abstand zu cubVrtx[0] – z.B.:

printf("Idx=%d\n",(facePnt[5][3]-cubVrtx[0])/DIM);

printf("Idx=%d\n",(facePnt[4][1]-cubVrtx[0])/DIM);

(Ausgabe beider Anweisungen: „Idx=7“) s.Projekt: ObjCod

6 Startadressen (facePnt[i]) von Eckpunkt-Listen mit je 4 Startadressen (facePnt[i][j]) von Startadressen (cubVrtx[k])

von Koordinaten-Listen

(6)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

Veränderte Aufgabenstellung in der Praxis:

 Anzahl von Punkten u. Flächen erst beim Laden bekannt ( Speicherplatz-Belegung zur Laufzeit)

 Anzahl von Punkten pro Fläche zudem i.d.R. ungleich ( z.T. verkettete Listen statt Feldern)

 Je nach Anwendung:

Anzahl von Objektpunkten und -flächen, aber auch Identität von Flächen-Eckpunkten variabel

(7)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

#define X 0

#define Y 1

#define Z 2

#define W 3 F[k].Pnt[0]

/*(...)*/

F[k].Pnt[j]

Vrtx[0][X]

Vrtx[0][Y]

/*(...)*/

Vrtx[i][X]

Vrtx[i][Y]

/*(...)*/

Vrtx[0]

/*(...)*/

Vrtx[i]

Vrtx F[k].Pnt

F[k].Pnt[0]

/*(...)*/

F[k].Pnt[j]

F[k].Pnt

Pnt als float***: Beibehaltung der Reihenfolge in Vrtx

auf gleich viel Speicherplatz Pnt als float**:

Codierung der Objektpkt-Identität, minimale Abstraktion

Codierung d. Objekt-/Eckpkt-Zuordnung prinzipiell wählbar:

(Bsp.: Eckpunkte Pnt[j] der Fläche F[k])

Vrtx≡&Vrtx[0]

Vrtx[i]≡&Vrtx[i][X]

F[k].Pnt≡&F[k].Pnt[0]

(8)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

Codierung von Geometrie (Vrtx) u. Topologie (Pnt) in der Praxis:

Speicherreservierung für Objektpunkte je nach Objektgröße:

Vrtx = (float**) calloc (nVrtx,sizeof(float*));

for (j=0; j<nVrtx; j++)

Vrtx[j] = (float*)calloc(NDIM,sizeof(float));

Speicherreservierung für Flächenpkte je nach Codiergskonzept:

Flächenpunkt als float*** vs. float**: for (j1=0; j1<nFace; j1++)

{ Face[j1].Pnt =

(float***)calloc(Face[j1].nPnt,sizeof(float**));

(float**)calloc(Face[j1].nPnt,sizeof(float*));

for (j2=0; j2<Face[j1].nPnt; j2++) { /*idx=...*/

Face[j1].Pnt[j2] = &Vrtx[idx];

Face[j1].Pnt[j2] = Vrtx[idx]; } }

(9)

Prof. Dr. Aris Christidis • SS 2017

typedef struct {

} Polygon;

Codierung von Grafik-Modellen

Allgemeine programm-interne Darstellg. eines 3D-Objektes:

typedef char String[LENGTH];

int nPnt; //Anzahl Eckpunkte float ***Pnt; //Punkt-Indizes char symbol;//Zeichn f.Konsole

typedef struct {

} CGFobject;

#define DIM 4

#define LENGTH 80

String Name; //Obj.-Name, Header int nVrtx; //Anzahl Objektpkte int nFace; //Anzahl Flaechen float **Vrtx; //Objektpunktkoord.

Polygon *Face; //Flaechenliste float posMat[DIM*DIM];//Positionsmatrix Als Zeiger:

Größen, die zur Compi- lierungszeit nicht

bekannt sein können

stellv. für Flächen-Eigensch.:

Farbe, Textur, Rauhigkeit,...

(10)

Prof. Dr. Aris Christidis • SS 2017

Übung

Übung: Codieren und Laden grafischer Modelle

LoadSetCGF.exe

Codierung eines Dreieck-Modells Speicherplatz-Reservierung, Belegung der Struktur, Erweiterung um Rückseite

Routine zum Laden aus formatierter Datei

(11)

Prof. Dr. Aris Christidis • SS 2017

Codierung von Grafik-Modellen

Typische Vorgänge beim Laden eines grafischen Objektes:

 Bereitstellung von (Struktur-)Variablen für bekannte Merkmale

 Belegung der (Struktur-)Variablen mit Werten aus Datei

 Sukzessive Speicherplatzreservierg. für restliche Merkmale – z.B. (in Funktion mit CGF-Objekt obj):

obj->Vrtx=(float**)calloc(obj->nVrtx, sizeof(float *));

 Berechnung (i.d.R. auch Speicherung) wiederholt benötigter, abhängiger Merkmale – z.B. (vgl. Übungen)

Bounding Box (umhüllender Quader, zur schnellen Überprüfg.

von Sichtbarkeit im Sichtvolumen, Verdeckung, Kollision etc.)

Flächennormalen (zur Ermittlung der Lage gegenüber Lichtquellen oder dem Augenpunkt, z.B. zur Eliminierung abgewandter Objektflächen – engl. back face culling)

(12)

Prof. Dr. Aris Christidis • SS 2017

3D-Punkte, 3D-Vektoren

In den Naturwissenschaften häufig: Rechnen mit 3D- Vektoren und -Punkten –z.B.: Stärke, Richtung d. Gravitation g(x,y,z) an einem bestimmten Punkt im Weltraum p(x,y,z)

Darstellung von 3D-Vektoren und -Punkten meist identisch:

kartesische Koordinaten als Zahlentripel (x, y, z) – aber:

 Vektoren haben Betrag und Richtung, aber keine Position.

 Punkte haben Position, aber weder Betrag noch Richtung.

Typische Umgehung der Unwegsamkeit: Darstellung eines Punktes über seinen Ortsvektor, d.h. über seinen Versatz gegenüber d.Koordinaten-Ursprung (V.-Betrag, V.-Richtung!) Verbleibendes Problem: Darstellung bei Verwendung mehrerer Koordinatensysteme.

 Erweiterung des Begriffs des (3D-)Koordinatensystems:

(13)

Prof. Dr. Aris Christidis • SS 2017

3D-Punkte, 3D-Vektoren

Ein Coordinate Frame (CF, Koord.rahmen,-netz) besteht aus

 3 senkrecht zueinander stehenden Einheitsvektoren i,j,k

 einem besonderen Punkt φ, dem Ursprung (engl. origin).

(i,j,k,φ können nur über andere CF spezifiziert werden!)

„Homogene“ Vektor- u. Punkt-Darstellung (4 Komponenten):

Vektor v = v1 i + v2 j + v3 k = [ v1, v2, v3, 0 ]T Punkt p = p1 i + p2 j + p3 k + φ = [ p1, p2, p3, 1 ]T

Übereinstimmend mit bisherigen Feststellungen (vgl. Ortsv.):

Die Differenz zweier Punkte ist ein Vektor.

Die Summe eines Punktes und eines Vektors ist ein Punkt.

Die Summe zweier Vektoren ist ein Vektor.

Skalierung eines Vektors ist sinnvoll.

Addition von Punkten ist nicht sinnvoll / nicht zulässig.

Jede Linearkombination von Vektoren ergibt einen Vektor.

(14)

Prof. Dr. Aris Christidis • SS 2017

3D-Punkte, 3D-Vektoren

Zur Erinnerung:

Linearkombination von Vektoren = Summe skalierter Vektoren:

v = α1 v1 + α2 v2 + ... (αiR)

Affine Kombination von Vektoren = Summe skalierter Vektoren mit Summe der Skalierungsfaktoren =1:

v = α1 v1 + α2 v2 + ... (αiR, Σαi = 1)

Konvexe Kombination von Vektoren = Summe skalierter Vektoren mit Summe der Skalierungsfaktoren =1 und mit nichtnegativen Skalierungsfaktoren :

v = α1 v1 + α2 v2 + ... (αiR, Σαi = 1, αi ≥ 0)

Affine u. konvexe Kombinationen von Punkten sind zulässig!

(15)

Prof. Dr. Aris Christidis • SS 2017

5 5

x y

P1

P2

3D-Punkte, 3D-Vektoren

Beispiel: Konvexe (K), affine (A) und lineare (L) Punkt- Kombinationen von P1=[2, 4]T und P2=[4, 1]T :

A = 2 P1 – 1 P2

= [4, 8]T – [4, 1]T = [0, 7]T

K = 0.25 P1 + 0.75 P2

= [0.5, 1]T + [3, 0.75]T = [3.5, 1.75]T

L = 1 P1 + 1 P2

= [2, 4]T + [4, 1]T = [6, 5]T

A

K

L

(16)

Prof. Dr. Aris Christidis • SS 2017

3D-Punkte, 3D-Vektoren

Beispiel: Konvexe (K), affine (A) und lineare (L) Punkt- Kombinationen von P1=[2, 4]T und P2=[4, 1]T bei Wechsel des Koordinatensystems zu P1'=[0, 3]T und P2'=[2, 0]T:

A' = 2 P1' – 1 P2'

= [0, 6]T – [2, 0]T = [-2, 6]T

K' = 0.25 P1' + 0.75 P2'

= [0, 0.75]T + [1.5, 0]T = [1.5, 0.75]T

L' = 1 P1' + 1 P2'

= [0, 3]T + [2, 0]T = [2, 3]T

 Nur affine (u. somit auch konvexe) Punkt-Kombinationen sind unabhängig von der Wahl des Koordinatensystems!

y'

x' (P1')

(P2') (K') (A')

5 5

x y

P1

P2

A

K

L

L'

Referenzen

ÄHNLICHE DOKUMENTE

a) Die Trägerschaft ist verpflichtet, die Sportanlage der Öffentlichkeit und allen nicht ge- winnorientierten Benutzergruppen unentgeltlich oder zu höchstens kostendeckenden

Stellen wir uns folgende Aufgabe vor: Es soll eine Zahl oder mehrere Zahlen auf der Zahlengerade bestimmt werden, deren Abstand von Null gleich 3 ist... Abstände

Steuerliche Förderung dauerhaft bezahlbarer Wohnungen: Bis 1990 gab es in der Bundesrepublik Steuervergünstigungen für Wohnungsunternehmen, die sich verpflich- tet hatten,

Diese Verfahren sind oft mühsam und werden in erster Li- nie in Kommunen praktiziert, die über eine gute finanzielle und personelle Ausstattung ver- fügen und in der

Der DGB und seine Mitgliedsgewerkschaften erwarten sowohl von den Hochschulen als auch von den betrieblichen Praxispartnern, dass sie sich im Kontext des dualen Studiums für

Wir plädieren für eine Kombination aus differenzierten Mietobergrenzen und einem Mieterhöhungsstopp: Für Mieten in angespannten Wohnungsmärkten, die über ei- ner zu

Eine weitere Möglichkeit der Stärkung der Tarifbindung ist die Tariftreue in der öffentlichen Auftragsvergabe: Wenn öffentliche Aufträge nur an Unternehmen vergeben werden, die

Soweit dual Studierende durch Tarifverträge und/oder Dienst- oder Betriebsvereinbarungen erfasst werden, gelten für den betrieblichen Teil des dualen Studiums die entsprechenden