Valgfag spiludvikling

3D Koordinatsystemer

I DirectX anvendes Left-handed Cartesian Coordinates, som vist på tegningen. Nogle grafiksystemer anvender det andet koordinatsystem.

Normalvektorer for planer og hjørner

Alle planer i et gitter (mesh) bestående af trekanter har en normalvektor, som er vinkelret på planet. Ideen med normalvektoren er at kunne afgøre, hvad der er forside og bagside på fladen. Bagsiderne bliver normalt ikke håndteret (beregnet eller tegnet). Man kan dog tvinge systemet til også at håndtere bagsiderne, hvis man ønsker det.

En fordel ved at opbygge gitteret af trekanter er, at planer defineret med tre punkter altid er plane. Hvis der er fire eller flere punkter kan flade være krum.

Normalvektorer for hjørnerne (vertices) bruges i forbindelse med beregning af visse effekter, såsom f.eks. lys og skygge. Effekterne beregnes bl.a. på basis af vinklerne mellem hjørnerne i figuren.

Vertexbuffer

Objekter, der skal indgå i spillet eller grafikken, opbygges af trekantede plane flader. Objekterne lagres i en vertexbuffer - f.eks. tre punkter ad gangen, som kan repræsentere hver af de trekantede flader. Hvis man f.eks. skal opbygge en 3-dimensional terning, skal man bruge 2 trekanter for hver af terningens 6 sider - altså i alt 12 trekanter. Vertexbufferen erklæres:

    VertexBuffer vertices = null;

Når vertexbufferen skal defineres, skal man tage stilling til, hvilken type vertex (hjørne) man vil anvende - de forskellige typer hjørner giver adgang til nogle forskellige muligheder, som vi skal se længere fremme i teksten.

    vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 3, dev, 0, 
        CustomVertex.TransformedColored.Format, Pool.Default);

I dette tilfælde er anvendt vertex-typen TransformedColored, som giver mulighed for at angive koordinater, som allerede er transformeret til skærmkoordinater. Ved denne type koordinatsystem skal man huske, at koordinatsystemets nulpunkt (0, 0) er i øverste venstre hjørne af skærmen. Hvis man angiver hjørnerne til en figur sådan, som man normalt ville tegne den, vil den på skærmen komme til at "stå på hovedet". Skærmen er i sagens natur 2-dimensionel, så selvom man angiver koordinaterne med 3 dimensioner, vil systemet ignorere den tredie dimension (Z-koordinaten).

Koordinaterne til trekanternes hjørner skal angives i en bestemt rækkefølge, som bestemmer beregningen af, hvad der er forside og bagside på fladen. Dette har betydning, fordi det som regel kun er forsiden, der fremvises på skærmen. For at det skal virke korrekt, skal koordinaterne angives højre rundt eller imod urets retning.

Herunder defineres en firkant betående af to trekanter, hvor den ene er hvid og den anden gul (for at man kan se forskel på dem). Først defineres et array af hjørner:

    device.VertexFormat = CustomVertex.TransformedColored.Format;
    CustomVertex.TransformedColored[] vertices = new CustomVertex.TransformedColored[6];

Derefter indsættes de 6 punkter i arrayet:

    int i = 0;
    vertices[i++] = new CustomVertex.TransformedColored(100, 100, 100, 1, System.Drawing.Color.White.ToArgb());
    vertices[i++] = new CustomVertex.TransformedColored(300, 100, 100, 1, System.Drawing.Color.White.ToArgb());
    vertices[i++] = new CustomVertex.TransformedColored(100, 300, 100, 1, System.Drawing.Color.White.ToArgb());
    vertices[i++] = new CustomVertex.TransformedColored(100, 300, 100, 1, System.Drawing.Color.Yellow.ToArgb());
    vertices[i++] = new CustomVertex.TransformedColored(300, 100, 100, 1, System.Drawing.Color.Yellow.ToArgb());
    vertices[i++] = new CustomVertex.TransformedColored(300, 300, 100, 1, System.Drawing.Color.Yellow.ToArgb());

Endelig overføres data om hjørnerne fra arrayet til vertexbufferen ved hjælp af en graphicsstream

    VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedColored),
        vertices.Length, device, 0, CustomVertex.TransformedColored.Format, Pool.Default);
    GraphicsStream stm = buf.Lock(0, 0, 0);
    stm.Write(vertices);
    buf.Unlock();
    

Vertex

Ved definitionen af hjørnerne kan man vælge mellem forskellige typer med forskellige karakteristiske egenskaber:

PositionColored Typen indeholder oplysninger om position (X, Y, Z) og farve
PositionColoredTextured Indeholder oplysninger om position (X, Y, Z), farve og texture
PositionNormal Indeholder position (X, Y, Z) og normal data
PositionNormalColored Indeholder position (X, Y, Z), farve og normal data
PositionNormalTextured Indeholder position (X, Y, Z), normal data og texture
PositionOnly Indeholder kun oplysninger om positionen (X, Y, Z)
PositionTextured Indeholder position og texture
Transformed Koordinater angives som skærmkoordinater
TransformedColored Skærmkoordinater og farve
TransformedColoredTextured Skærmkoordinater, farve og texture
TransformedTextured Skærmkoordinater og texture

 


Sidst opdateret: 3. februar 2007

Index