Z pogranicza

Programowanie 3D

  • 2008-04-26 12:39
  • 7 komentarzy
  • 1270 odsłon
  • Oceń ten tekst jako pierwszy
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ł="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 &gt;0 czyli odległość od obserwatora jest większa od zera

Układ 3D
           
       Y^  .|Z
         |  /
         |/
   -----*-----&gt;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.x*FOCUS/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

Rev 2008-04-29 16:14

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

crayze 2008-04-26 15:24

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

hexin 2010-06-16 20:20

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

Vogel 2004-06-29 17:11

kameRZe [i inne błędy :P]

wasyl 2004-06-02 21:45

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

Wolverine 2004-06-02 21:25

ale ci sie to rozjechalo