Programowanie 3D

ADuch

W tym artykule zajmiemy się podstawami programowania 3D, jeśli będą zainteresowani to postaram się napisać nieco więcej na ten temat.

Podstawowe informacje:

  • Przestrzeń składa się z układu współrzędnych o trzech osiach X,Y, Z
    X - jest to pozioma oś skierowana na lewo od obserwatora
    Y - Oś pionowa oznacza wysokość.
    Z - Oś perspektywy czyli odległość od obserwatora <przód, tył>
  • pozycja <0; 0; 0> to pozycja obserwatora
  • obrót standardowy odbywa się dookoła obserwatora(kamery)
  • Punkt 3D przeliczamy na 2D tylko gdy 3D.z >0 czyli odległość od obserwatora jest większa od zera

Układ 3D

   Y^  .|Z
     |  / 
     |/

-----*----->x
/
/

Jak wiadomo nie możemy wyświetlić punktu 3D bezpośrednio na ekran, musimy go przeliczyć na punkt 2D. Jest to bardzo proste działanie, można je sobie wyobrazić jako sprowadzanie punktów 3D do tej samej odległości Z metodą proporcji, a oto wzór

p2d.x := p3d.xFOCUS/p3d.z + Correct_x;
p2d.y := p3d.y
FOCUS/p3d.z + Correct_y;

Focus jest to odległość Z do której zostaną sprowadzone punkty 3D, kiedy już wszystkie punkty mają tę samą odległość Z to można wyłączyć tą oś, czyli zostaje nam już tylko oś X, Y czyli ekranowa <lol> Focus zazwyczaj wynosi 256 zabawa jego wielkością symuluje zmianę soczewki w kamerze.

Correct_x - jest to połowa rozdzielczości ekranu X
Correct_y - jest to połowa rozdzielczości ekranu Y

Teraz wystarczy putpixel(p2d.x,p2d.y,kolor) - i mamy piękny punkt 3D :D

Może mały przykładzik (W Pascalu):

{$N+,G+}
program as;
 
var
 x,y,z :real
 x2,y2 :integer;
 
{procedura rysuje pixel w trybie 320x200 256 kolorów }
procedure plot(x,y:integer; k:byte); assembler;
 asm
  mov ax,0a000h
  mov es,ax
  mov di,x
  mov ax,y
  shl ax,6
  add di,ax
  shl ax,2
  add di,ax
  mov al,k
  stosb
 end;
 
{ procedura włącza tryb 320x200 256 kolorów }
procedure Start; assembler;
 asm
  mov ax,0013h
  int 10h
 end;
 
begin
 start;
 x:=5;
 y:=5;
 z:=100;
 repeat
  x2:=round(x*256/z + 160);
  y2:=round(y*256/z + 100);
  if (x2&gt;=0)and(x2<320)and
     (y2>=0)and(y2&lt;200) then plot(x2,y2,100);
  z:=z-10;
 until z&lt;20;
end.

Powyższy program narysuje parę punktów w jednej linii, fizycznie punkty różnią się tylko
odległością od obserwatora na osi Z ale dzięki zniekształceniu perspektywy( czyli zmniejszanie się obiektów w oddali) będą wyglądać jak by były ułożone na skos.

O obrotach 3D, macierzach, ścianach, teksturach, światłach, metodach sortowania powierzchni w kolejnych częściach artykułu jeśli się wam pomysł spodobał :D

7 komentarzy

Ja również poczytałbym sobie o grafice 3D z perspektywy podstaw matematyki itd.

Mi się podoba, czekam na więcej...
Podstawy do napisania swojej biblioteki 3D i zrobienia konkurencji DX M$ :D

przepisalem ten kod do turbo pascala ale wyskoczyl mi w tym miejscu "syntax error"->" if (x2>=0)"??????

kameRZe [i inne błędy :P]

Poza rozwalonym ukladem strony i ortami to bardzo fajne, przyda sie cosik o innych rzeczach w 3d :) ...

ale ci sie to rozjechalo