Navigationslinks überspringen  
Navigationslinks überspringen

Mathematische Grundlagen

Für 3D Programmierung sind díe Vektorrechnung und die Differentialrechnung so ziemlich das einzige,was man wissen muss. Man hat es mit den Objekten Punkt, Gerade, Ebene und Matrix zu tun. Das einzige Schwierigkeit sind Matrizen. Auf sie werden wir im Kapitel Transformationen zu sprechen kommen.
Daneben gibt es noch die Operationen Vektoraddition, Vektorsubtraktion, Skalarprodukt, Vektorprodukt und Skalare Multiplikation. Wer sich da nicht sicher ist , hat das schnell "herausgegoogelt".

 Geometrische Objekte und ihre Implementation

Objekte

Ein Überblick:

Geometrisches ObjektDrawing3d KlasseErzeugungBeschreibung
Vektor bzw. PunktxyzP = new xyz(1,2,3)P.x = 1,P.y = 2, P.z = 3
GeradeLineTypeP=new xyz(2,1,3);
Dir= new xyz(0,0,1);
L = new LineType(P , Dir);
Eine Gerade durch den Punkt P mit der Richtung Dir
EbenePlaneP=new xyz(2,1,3);
N= new xyz(0,0,1);
e = new Plane(P,N);
e ist Ebene durch den Punkt P
 mit Normalenvektor N
MatrixMatrixP ein Punkt,
T = Matrix.Translation(P);
g eine Gerade
Alfa ein double.
R = Matrix.Rotation(R,Alfa);
Plane eine Ebene
M = Matrix.Mirror(Plane);
T ist eine Translationsmatrix
R ist eine Rotationsmatrix
M ist eine Spiegelungsmatrix
Die entsprechenden 2d-Objekte haben den Typ xy bzw. LineType2D.

Operationen

Ein Überblick: P und Q seien vom Typ xyz, Lamda vom Typ double, A und B seien Matrizen.

OperationImplementation
VektoradditionP+Q
VektorsubtraktionP-Q
SkalarproduktP*Q
VektorproduktP&Q
Skalare MultiplikationP*Lamda
Multiplikation zweier MatrizenA*B
Multikaltion Matrix mit PunktA*P

Beispiel1: Berechnung des Volumens eines Tetraeders mit den Punkten A,B,C,D.
       xyz A = new xyz(4,1,1);
       xyz B = new xyz(2,5,4);
       xyz C = new xyz(1,-3,-6);
       xyz D = new xyz(9,0,7);
       
       double Volumen = ((B-A)&(C-A))*(D-A)*0.5;// Halbe Determinante
       Volumen = System.Math.Abs(Volumen); // der Absolutwert
       
Beispiel 2: Berechnung des Abstandes eines Punktes P von einer Ebene  gegeben durch A und dem Normalvektor auf die Ebene.
        xyz A = new xyz(4,-2,1);
        xyz Normal = new xyz(5,1,3);
        Normal = Normal.normalized(); // eine Methode von xyz
        double Abstand = (P-A)*Normal;
       
Beispiel 3: Drehung eines Punktes P(3,1,2) um 46° um die Gerade g, die durch die Punkte A(4,1,2) und B(-3,-2,5) gegeben ist.
        xyz P = new xyz(3,1,2);
        xyz A = new xyz(4,1,2);
        xyz B = new xyz(-3.-2,5);
        LineType g = new LineType(A, B-A);
        Matrix Rotation = Matrix.Rotation(g,46/180*System.Math.PI); // im Bogenmaß
        xyz DestinationP = Rotation*P;
        
       

Methoden

In der Drawing 3D Mathematikbibliothek gibt es eine Unzahl von Methoden und Funktionen, die sich mit diesen geometrischen Objekten beschäftigen,
z.B: Die Methode P.Cross(g,out double Lam,out xyz Crosspoint) liefert den Schnittpunkt der Ebene P mit der Geraden g. P.Cross(Q) ergibt die Schnittgerade der beiden Ebenen P und Q.

 

Funktionen

Definitionen

Eine Funktion oder Abbildun gordnet Elementen einer Menge A Elemente einer anderen Menge B zu. Die Menge A bezeichnen wir mit Definitionsbereich, wenn für jedes Element die Zuordung einen "vernünftigen" Wert in B ergibt. B bezeichnen wir als Zielmenge.
Symbolisch schreibt man f : A --> B.

Die reellen Zahle bezeichnen wir mit R.
RXR oder R² sind Abkürzungen und beduten einfach die Menge der reellen Zahlenpaare wie (1.4,2.5), (4,-3) usw.
Also kann man RXR auch verstehen als Menge von Punkten der Ebene. In der Literatur wird RXR als kartesisches Produkt bezeichnent.
RXRXR oder R³ bezeichnen die Menge der reellen Zahlentripel wie (1.4,2.5,4.2), (0.4,-3,7.2) usw.
Also kann man RXRXR auch verstehen als Menge von Punkten (oder Vektoren) im Raum.

Ein Intervall [0,1] bezeichnet alle reellen Zahlen zwischen 0 und 1, z.B.: 0.2345,0.456456,0.13216,0, 1,... usw

Kurven und Fächen

Eine Kurve in der Ebene wird dargestellt durch eine Funktion
f:[0,1] -->RXR.
z.B.: Ein Kreis:

       
       x = radius*Cos(t*2*PI));
       y = radius*Sin(t*2*PI));
       

0<= t, und t <=1.
Hier wird jedem t ein Paar von Zahlen x,y zugordnet. Diese Paare als Punkte der Ebene aufgefasst bilden einen Kreis.

Eine Kurve im Raum wird dargestellt durch eine Funktion
f:[0,1] -->RXRXR.
z.B.: Eine Spirale:

       
       x = radius*Cos(t*2*PI));
       y = radius*Sin(t*2*PI));
       z = 10*t;
       

0<= t, und t <=1.
Durchläuft t die Werte von 0 bis 1, so ergeben x und y einen Kreis. Überlagert wird er von einer stetigen Erhöung des z-Wertes, der schließlich den Wert 10 erreicht. Somit ergibt sich eine Spirale mit der Höhe 10 mit einer Windung.

 

Polygone

Die wichtigsten Objekte bei einer 3D Darstellung sind Polygone. Letzt endlich wird alles zurückgeführt auf die Darstellung von Polygonen.

Drawing 3D implementiert zwei- und dreidimensionlae Polygone:
  • xyzArray: Enhält einen Array von Punkten vom Typ xyz
  • xyArray: Entält einen Array von Punkten vom Type xy

Zusäzlich werden Listen von xyzArrays und xyArrays definiert:

  • Loxyz : Eine Liste von xyzArray
  • Loxy: Eine Liste von xyArray

Diese Listen werden verwendet. wenn eine Fläche "Löcher" hat. In diesem Fall ist der erste Array von Loxyz die Kontur, alle anderen Arrays sind "Löcher".
Definition eines xyzArray mit 4 Punkten:

        ...
        xyzArray A = new xyzArray(4);
        A[0] = new xyz(1,1,0);
        A[1] = new xyz(1,11,0);
        A[2] = new xyz(11,11,0);
        A[3] = new xyz(11,1,0);
        
        ...
        

Die Klasse xyzArray enthält eine Menge von Methoden und Eigenschaften:

A sei vom Typ xyzArray

  • Enthält A Count Punkte so ist A.Value eine Funktion, die das reelle Intervall [0, Count] auf die Punkte Polygons abbildet.
    Ist z.B.: Count = 8 , so ist  A.Value(3.5) der Halbierungspunkt der Strecke A[3]A[4].
  • Mit A.Transformation(Matrix) kann ein Polygon transformiert werden.
  • A.LengthToParam und A.ParamToLength können Parameter, wie sie von Value verwendent werden in die tatsächliche Länge umgerechnet werden und umgekehrt.
  • A.MaxBox() lieftert den kleinsten Quader, in dem A enthalten ist.
  • u.v.a

Polygone kännen in 2 Modi ausgegeben werden.
  • Im Linemodus: Device.PolygonMode = Polygonme.Line;
    Dies entspricht der Graphicsmethode DrawPolygon
  • Im Fillmode :Device.PolygonMode = Polygonme.Fill;
    Dies entspricht Graphics.FillPolygon.
    Wichtig
    In Füllmodus muss der Uhrzeigersinn berücksichtigt werden. Ein 3D-Polygon stellt eigentlich zwei Seiten dar. Eine die im Uhrzeigersinn und eine ("darunter"), die im Gegenuhrzeigersinn berandet ist.
    Die Drawing 3D Device zeichnet nur jene Seite, die im Uhrzeigersinn ist. Die andere Seite kann trotzdem angezeigt werden, wenn die Egenschafft Culling auf false gesetzt wird.
Code Beispiel in c#.
Der Codeinhalt vom Form1
     public partial class Form1 : Form
    {
        MyDevice Device = new MyDevice();
      
        public Form1()
        {
            InitializeComponent();
            Device.WinControl = this;
        }
    }
    public class MyDevice:OpenGlDevice
    {
        xyzArray A = new xyzArray(5);
        public override void OnPaint()
        {
           base.OnPaint();
           drawPolyLine(A);
        }
        protected override void OnCreated()
        {
            base.OnCreated();
            BackColor = Color.White;
            A[0] = new xyz(-3, 0, 0);
            A[1] = new xyz(0, 4, 0);
            A[2] = new xyz(3, 0, 0);
            A[3] = new xyz(0, -4, 0);
            A[4] = new xyz(-3, 0, 0);
        
        }

    }
    
 

Und so siehts aus :

Links ist die Ausgabe im Füllmodus, rechts im Linemodus. Dabei ist lediglich in der Paintmethode "Device.PolygonMode = PolygonMode.Fill;" zu setzen.

Die Drawing 3d Device besitzt die Eigenschaften PenWidth, PenColor und PenStyle. Probier diese mal aus.

 

 
Copyright © Drawing3D inc