HTML

transzformacio

sc3n3 2011.12.28. 10:47

Hogyan lehet elforgatni valamit? Matrix transzformacioval. 

Az  bemeno ertekeket a vizesflakon koordinatarendszerebe kell atalakitani, a kimeno ee.obj es ee.norm-okat vissza a vilag-koordinatarendszerbe,

 

A normalnal es a ray-nel nincs pozicio, igy eleg egy 3x3 matrixxal szorozni. A tobbit 4x4-essel szokas, de most egyszerubb az m11 matrix transzponaltjat /m22/ eloallitani, igy marad a pozicionalas es a 3x3-as szorzas. Az eredmeny ugyan az, de 4x4.essel szebb a kod.

Mostmar eleg komplex sceneket ossze lehet heggeszteni 3d editor nelkul, egy szimpla browserben.

Mint kitunik a blogbol, a hatar soha nem ott van, ahol hisszuk. Mindig akad valamilyen csel, amivel kitolhatoak a latszolag atlephetetlen hatarok.

 

pack chk_fig(vec3 pos,vec3 col,pack ee)
{

mat3 m11 = mat3( 0.00, 0.80, 0.60,
-0.80, 0.36, -0.48,
-0.60, -0.48, 0.64);
mat3 m22 = mat3( 0.00, -0.80, -0.60,
0.80, 0.36, -0.48,
0.60, -0.48, 0.64);


vec3 bbox1=vec3(-40,0,-40);//pos+
vec3 bbox2=vec3(40,120,40);//pos+

vec3 srco=ee.src;
vec3 rayo=ee.ray;
ee.src=(ee.src-pos)*m11; //boxchk4 hez!
ee.ray=ee.ray*m11;


vec3 pnt1=boxchk4(ee,bbox1,bbox2,0);
vec3 pnt2=boxchk4(ee,bbox1,bbox2,1);

// if(t1<ee.tmin) if(t2<ee.tmin)//nem biztos hogy lesz hit, bug
if(pnt1.x!=-1.0 || pnt2.x!=-1.0)
{
vec3 w1=pnt1-ee.src; float t1=dot(w1,w1);
w1=pnt2-ee.src; float t2=dot(w1,w1);
if(t2<t1) {w1=pnt1;pnt1=pnt2;pnt2=w1;}///xchg

vec3 axis=vec3(0,0,0);//pos;//forgastengely, magassag=y valtozik csak
vec3 pnt=pnt1;
vec3 dpnt=normalize(pnt2-pnt1);
vec3 spnt=vec3(0,0,0);
float tmin=1e16;
float step=12.0;//12 t3 atallitja!
int hit=0;

for(int i=0;i<16;i++)
{
axis.y=pnt.y;
vec3 dir=pnt-axis;// radialis vektor
float ld=dot(dir,dir);//length(dir);dir=normalize(dir);

float rd=getcurve(pnt.y);
float t1=rd*rd-ld;//pnt a feluleten belul
float t3=abs(t1)*9.0;//step korrekcio, felulet kozeleben korrigal, 2=szemcses, 5=durva 3^2
if(t3<step) step=t3;
if(t1>=0.0)//hit
{
pnt-=dpnt*step;
step*=0.5;//fele akkora lepessel tovabb

if(step<0.5) hit=1;//0.1 eleg kicsi, itt a felulet!
}
pnt+=dpnt*step;
}
spnt=pnt;
t2=length(spnt-ee.src);

if(hit==1)//real hit
if(t2<ee.tmin)
if(t2>0.1)//self, 0.1 kell!
{
ee.col=col;
ee.obj=spnt*m22+pos;
// ee.obj=spnt;
ee.tmin=t2;
ee.hit=1;
ee.type=2;

#if 1
//felulet normal
float rd=getcurve(spnt.y);
axis.y=spnt.y;
vec3 dir=spnt-axis;
dir=normalize(dir);
vec3 obj1=axis + dir*rd;

dir+=vec3(dir.z,0.0,-dir.x)*0.2;//meroleges , mellete levo pnt
dir=normalize(dir);
vec3 obj2=axis + dir*rd;//rd ua!

spnt.y+=0.2;//felette levo pnt
rd=getcurve(spnt.y);
axis.y=spnt.y;
dir=spnt-axis;
dir=normalize(dir);
vec3 obj3=axis + dir*rd;

ee.norm=normalize(cross(obj2-obj1, obj3-obj1))*m22;

#endif
}
}
ee.src=srco;//restore
ee.ray=rayo;

return ee;
}
 

 

 

komment

süti beállítások módosítása