News:

No significant change

Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - AndersO

#217
Vet inte riktigt hur man ska göra.. Men borde väl bli nåt åt de här hållet:

1. Räkna ut planet/normalen som objektet står på
2. Räkna ut vinklar mellan objektets "upp vektor" och normal vektorn (borde väl bli två, roll & pitch)
3. Rotera objektet

De var iaf lätt att skriva. :)


#218
OK, va bra.. addade just :)
#219
Går den att tanka ned nånstanns fortfarande?
#220
*Rotar fram lite urgammal kod*

// Check if an object is within another objects polygon. (Seen from above)
short objectwithinpoly (object3dptr a, object3dptr b, polyptr p, vertexptr v)
{
       short c,i,j;
       float x,z,pxi,pzi,pxj,pzj;

       x=a->x;
       z=a->z;

       c=0;
       j=1;
       for (i=0;i<=p->nv;i++){
               pxi=v[p->vert].x+b->x;
               pzi=v[p->vert].z+b->z;
               pxj=v[p->vert[j]].x+b->x;
               pzj=v[p->vert[j]].z+b->z;

               if ((((pzi<=z) && (z<pzj)) ||
                    ((pzj<=z) && (z<pzi))) &&
                     (x < (pxj - pxi) * (z-pzi) / (pzj - pzi) + pxi)) c=!c;
               j++;
               if (j>p->nv) j=0;
       }
       return c;
}


Känns den igen så är den ursprungligen från CGA FAQ:n.

Lite lustigt namn på funktionen, kollar om en punkt är inom en polygon.
Returnerar 0 om utanför, om inte så är punkten x,z inom polygonen.

pxi, pzi, pxj, pzj är förstås punkter från polygonen.


Ett annat sätt skulle ju va att skapa normaler för triangelns kanter... Så att man får 3 st plan för triangeln, tänk visuellt en toblerone ask... Sen tar man bara 3 dotpodukter..

for (i=0;i<3;i++)
 dot=Dotproduct(punkt - triangelpunkt, edgenormal);

om alla dotprodukter är positiva (eller om de va negativa hmm..) så är punkten inuti toblerone asken, och därmed triangeln..

Eller så skulle man kunna räkna vinklar, om en punkt är inuti en triangel så är summan av alla vinklar 360 (en vinkel är vinkeln mellan punkten och 2 hörn av triangeln). Om summan är mindre än 360 så är punkten utanför. Den metoden funkar också på konkava polygoner..


Finns säkert fler metoder, kommer inte på fler nu bara.




#221
En bra grej med heightmap är att man vet direkt vilken "ruta" man är på genom att ta x och z och skala om dom lite.. Gör du så eller?. Behöver ju inte loopa igenom alla trianglarna i heightmapen för att kolla vilken man är i. När man väl vet vilken ruta så är det bara 2 trianglar att kolla, dom som gör upp rutan.

Om det är samma "skala" på heightmappen och koordinaterna så blir det typ så här:

vector p1,p2,p3,heightmap[10][10];

triangel1
p1=heightmap[(int)x][(int)z];
p2=heightmap[(int)x][1+(int)z];
p3=heightmap[1+(int)x][1+(int)z];

triangel2
p1=heightmap[(int)x+1][(int)z];
p2=heightmap[(int)x+1][1+(int)z];
p3=heightmap[1+(int)x][1+(int)z];


Eller nåt sånt, du förstår idén antar jag. :)

#222
Eller vänta nu, hmm.. Va så länge sen jag skrev de där, men när jag tittar på kodsnutten ser det ut som om den returnerar markkhöjden, dvs står du på mount everest så returnerar den 8848, eller va de nu är.

Så.. Du får ta din punkts y - retur värdet, om du nu vill ha meter över land dvs. Du hoppar en meter på everest:

8849-8848=1

Va pedagogisk jag är :)
#223
Hej

Om du vet vilken triangel som din punkt är ovanför (antar att det är en heightmap du har) skulle man kunna räkna ut höjden så här, tror jag:

a=y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
b=z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
c=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
d=-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);
return -(a*x+c*z+d)/b;

triangel=x1,y1,z1 - x2,y2,z2 - x3,y3,z3
punkt= x,y,z