I programmerings verdenen er det stadig nye teknikker å finne og jeg skal her beskrive en utrolig interessant måte å lage en Sphere på. Det finnes vel i hovedsak 2 måter å lage den på:
- Ved å bruke lengde og breddegrader og bruk av trignometri
- Ved å lage et oktahedron og så divdidere alle trianglene et ønsket antall ganger
Det er den siste måten som er en utrolig artig måte å gjøre det på. Den er også svært rask og matematikken er utrolig enkel og man trenger ikke å bruke Cos, Sin og Tan. Man finner X, Y og Z ved enkel 3Dvektor regning. Hele kulen vil bli delt nøyaktig inn i like store triangler og man starter med en enkel oktahedron som er 2 paramider satt i mot hverandre. Hver paramide har 4 triangler (vi trenger ikke bunnen) og oktahedronet vil da ha 8 triangler.
Vi bruker en enhet på 1 og lager en liste med verticer og en liste med triangler
octahedron_vertices =
(1.0, 0.0, 0.0), (-1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0,-1.0, 0.0), (0.0, 0.0, 1.0), (0.0, 0.0,-1.0)
Her har vi x, y og z for de verticene vi trenger for oktahedronet.
octahedron_triangles =
[ 0, 4, 2 ], [ 2, 4, 1 ], [ 1, 4, 3 ], [ 3, 4, 0 ], [ 0, 2, 5 ], [ 2, 1, 5 ], [ 1, 3, 5 ], [ 3, 0, 5 ]
Her har vi de 8 trianglene, hvert triangel har som kjent 3 hjørner og x, y og z for hvert av disse hjørnene finnes ved indexene til verticene. La oss se på det første trianglet som er 0, 4, 2. Punktene er i såkaldt clockwise rekkefølge. Vi finner da x, y og z for det første punktet som er 0 ved å se på det første elementet i vericelisten som er 1.0, 0.0, 0.0
Så lager vi en funksjon som dividerer alle trianglene inn i 4 nye triangler og for å finne x, y og z for disse
Så kommer 3Dvektorregningen i bruk for å finne x, y og z for de nye vektorene a, b og c regner vi slik:
a = (V0 + V2) * 0.5 =
b = (V0 + V1) * 0.5 =
c = (V1 + V2)* 0.5 =
a.X = (V0.X + V2.X) * 0.5 = (1.0 + 0.0) * 0.5 = 0.5
a.Y = (V0.Y + V2.Y) * 0.5 = (0.0 + 1.0) * 0,5 ) = 0,5
a.Z = (V0.Z + V2.Z) * 0.5 = (0.0 + 0.0) * 0.5) = 0.0
b.X = (V0.X + V1.X) * 0.5 = (1.0 + 0.0) * 0.5 = 0.5
b.Y = (V0.Y + V1.Y) * 0.5 = (0.0 + 0.0) * 0,5 ) = 0,0
b.Z = (V0.Z + V1.Z) * 0.5 = (0.0 + 1.0) * 0.5) = 0.5
c.X = (V1.X + V2.X) * 0.5 = (0.0 + 0.0) * 0.5 = 0.0
c.Y = (V1.Y + V2.Y) * 0.5 = (0.0 + 1.0) * 0,5 ) = 0,5
c.Z = (V1.Z + V2.Z) * 0.5 = (1.0 + 0.0) * 0.5) = 0.5
Så normaliserer vi a, b og c
lens = ROT(a.X^2 + a.Y^2 + a.Z^2)
a.X = a.X / lens = 0.7071068
a.Y = a.Y / lens = 0.7071068
a.Z = a.Z / lens = 0
lens = ROT(b.X^2 + b.Y^2 + b.Z^2)
b.X = b.X / lens = 0.7071068
b.Y = b.Y / lens = 0
b.Z = b.Z / lens = 0.7071068
lens = ROT(c.X^2 + c.Y^2 + c.Z^2)
c.X = c.X / lens = 0
c.Y = c.Y / lens = 0.7071068
c.Z = c.Z / lens = 0.7071068
Så legger vi disse til i vericelisten og og oppdaterer trianglelisten.
Slik blir globen uten noen divideringer altså bare en oktahedron
etter 1 dividering blir den som vist under
etter 2 divideringer
Når denne divideringen av trianglene er utført 3 ganger får vi 8 * 4^3 = 512 triangler og disse er helt nydelig beregnet UTEN BRUK AV COS, SIN og TAN ....bare helt UTROLIG!!!!!
Så kan vi jo dele alle trianglene en gang til hvis vi har lyst og da får vi 8 * 4^4 = 2048 triangler som også bare er helt utrolig fine!
etter 5 divideringer
etter 6 divideringer
Men vi kan dele trianglene en gang til slik at vi får 8 * 4^7 = 131072 triangler og slik ser det ut:) Her er hvert triangel så lite at det trengs 97 triangler for å dekke overflaten av Norge.
Vi kan selvfølgelig fortsette å dividere men vi stopper her for denne gang... og utgangspunktet var altså et oktahedron eller 2 pyramider satt mot hverandre. Denne funksjonen finnes i VertexShow som kan lastes ned fra Downloads.