Koordinatni sustav
Problemi su sljedeći:
function Ortho(g,xmin, xmax, ymin, ymax, xsize, ysize)
{
sx = xsize/(xmax-xmin);
sy = ysize/(ymin-ymax);
px = -sx*xmin;
py = -sy*ymax;
gr = g;
XMIN = xmin;
XMAX = xmax;
YMIN = ymin;
YMAX = ymax;
}
XMIN, XMAX,YMIN i YMAX nam služe da bi odredili duljine X i Y osi. Argumenti xsize i ysize predstavljaju širinu i dužinu canvas
elementa koji smo kreirali prije (npr.width="500" height="500"). canvas = document.getElementById("naziv_naseg_canvasa");
c = canvas.getContext('2d');
c.moveTo(x1,y1);
c.lineTo(x2,y2);
function x_to_pix(x)
{
return parseInt(sx*x+px);
}
function y_to_pix(y)
{
return parseInt(sy*y+py);
}
function postaviNa(x, y, z)
{
xLast = matrica[0][0]*x + matrica[0][1]*y + matrica[0][2]*z+matrica[0][3];
yLast = matrica[1][0]*x + matrica[1][1]*y + matrica[1][2]*z+matrica[1][3];
zLast = matrica[2][0]*x + matrica[2][1]*y + matrica[2][2]*z+matrica[2][3];
}
function linijaDo(x, y, z)
{
var x1, y1, x2, y2;
x1 = x_to_pix(xLast);
y1 = y_to_pix(yLast);
xLast = matrica[0][0]*x + matrica[0][1]*y + matrica[0][2]*z+matrica[0][3];
yLast = matrica[1][0]*x + matrica[1][1]*y + matrica[1][2]*z+matrica[1][3];
zLast = matrica[2][0]*x + matrica[2][1]*y + matrica[2][2]*z+matrica[2][3];
x2 = x_to_pix(xLast);
y2 = y_to_pix(yLast);
c.lineWidth = 1;
c.beginPath();
c.moveTo(x1,y1);
c.lineTo(x2,y2);
c.stroke();
}
Metode potrebne za crtanje i rotaciju/translaciju 3D objekata.
Nakon što smo imeplementirali metode za realizaciju koordinatnog sustava, pretvorbi točaka i metoda za crtanje preostaje nam samo još implementirati metode za translaciju i rotaciju objekata (pošto su one jedine bile potrebne u ovom projektu).
function rotirajX (kut)
{
var fi = kut * Math.PI / 180;
var cosfi=Math.cos(fi);
var sinfi=Math.sin(fi);
var m1 = izradiMatricu(4,4,0);
m1[0][0]=1;
m1[1][1]=cosfi;
m1[1][2]=-sinfi;
m1[2][1]=sinfi;
m1[2][2]=cosfi;
m1[3][3]=1;
mult(m1);
}
function rotirajY (kut)
{
var fi = kut * Math.PI / 180;
var cosfi=Math.cos(fi);
var sinfi=Math.sin(fi);
var m1 = izradiMatricu(4,4,0);
m1[0][0]=cosfi;
m1[0][2]=sinfi;
m1[1][1]=1;
m1[2][0]=-sinfi;
m1[2][2]=cosfi;
m1[3][3]=1;
mult(m1);
}
function rotirajZ (kut)
{
var fi = kut * Math.PI / 180;
var cosfi=Math.cos(fi);
var sinfi=Math.sin(fi);
var m1 = izradiMatricu(4,4,0);
m1[0][0]=cosfi;
m1[0][1]=-sinfi;
m1[1][0]=sinfi;
m1[1][1]=cosfi;
m1[2][2]=1;
m1[3][3]=1;
mult(m1);
}
function pomakni(px, py, pz)
{
var m1 = izradiMatricu(4,4,0);
m1[0][0]=1;
m1[1][1]=1;
m1[2][2]=1;
m1[3][3]=1;
m1[0][3]=px;
m1[1][3]=py;
m1[2][3]=pz;
mult(m1);
}
Matrične reprezentacije geometrijskih transformacija u 3D
U ovom dijelu ćemo Vam prikazati na koji način ručno nacrtati 3D objekte u 2D Canvas-u.
Prvo je trebalo na 2d ekranu (500x500) omogućiti prikaz modela sa 3 dimenzije. Ovo se realiziralo na način da se z-os ignorira te se 3D efekat dobije tek nakon rotiranja objekta. Praktičan primjer možete vidjeti na primjeru kocke.Primjer pretvorbe modela kocke iz 2D u 3D
Kontrole (velika slova):
OS X = +H -Z
OS Y = +J -U
OS Z = +K -I
Reset = R
Primjer rotacije kocke oko proizvoljne osi
Na sljedećom Canvas elementu možete vidjeti kocku koja na početku izgleda kao kvadrat. Na slici je također prikazan i pravac koji je određen točkom (x1,y1,z1) i svojim vektorom smijera(u1,u2,u3). Da bi se vidjela 3d rotacija oko proizvoljnog pravca trebate pritisnuti tipku "A" da bi se kut rotacije povećao za 1 stupanj. Ukoliko želite da cijela stvar izgleda kao animacija tada je potrebno držati pritisnutu navedenu tipku.
Primjer rotacije kocke oko proizvoljne osi - animacija slijeda
Na sljedećom Canvas elementu možete vidjeti kocku koja na početku izgleda kao kvadrat. Na slici je također prikazan i pravac koji je određen točkom (x1,y1,z1) i svojim vektorom smijera(u1,u2,u3). Za pokretanje animacije slijeda pritisnite tipku "S". Svake dvije sekunde će se odvijati jedna od 7 transformacija koje su potrebne da bi mogli ostvariti 3D rotaciju objekta oko proizvoljne osi.
Da bi cijela stvar bila moguća trebamo odrediti gde ćemo nacrtati kocku i pravac oko kojeg ćemo ju rotirati. U našem primjeru kocka se nalazi u središtu koordinatnog sustava sa duljinom stranice 2 (njezine koordinate vrhova su (2,2,2),(2,2,-2) itd). Da bi odredili pravac u 3D prostoru možemo ga definirat na više načina:
Cijela stvar se realizira na način da se prije crtanja kocke odrade transformacije translacije i rotacije te nakon toga se crta 3D objekt. Postupak se sastoji od 7 koraka
function izracunaj(x1,y1,z1,x2,y2,z2)
{
var nazivnik = Math.sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1))+((z2-z1)*(z2-z1)));
u1=(x2-x1)/nazivnik;
u2=(y2-y1)/nazivnik;
u3=(z2-z1)/nazivnik;
var fi =nas_zadani_kut;
var d = Math.sqrt((u2*u2)+(u3*u3));
var alfa=(Math.asin(u2/d))*(180/3.14);
var beta=(Math.asin(u1))*(180/3.14);
}
Za pokretanje animacije slijeda pritisnite tipku "S".