Autor Wątek: interpolacja wysokosci  (Przeczytany 1274 razy)

maxest

  • Gość
# Sierpień 01, 2006, 00:28:22
chcialem zrobic poruszanie po nierownym terenie. moj pomysl mial wygladac tak:

0       50


0       0

te liczby oznaczaja wysokosci czterech wierzcholkow. chcialem je usredniac. jednak jak usrednie w srodku gorny rzad to dostane 25, usrednie dolny rzad tez w srodku (bo akurat taka mam pozycje) to dostane 0, a jak 25 i 0 usrednie to dostane 12,5 podczas gdy poprawna wartoscia jest w tym miejscu 0.
mnie osobiscie interesuje interpolacja tylko jak to ma wygladac?

znalazlem i przetestowalem tez inny bardzo dobry sposob - rownanie plaszczyzny. po prostu znajac X i Z szukam wspolrzednej Y punktu, ktory nalezy do tej plaszczyzny. rozwiazanie bardzo proste i bardzo dobre. jednak bardzo interesuje mnie interpolacja



// EDIT
chyba juz wiem co bylo zlego w mojej koncepcji - nie mam interpolowac czworokata tylko jeden z dwoch trojkatow w ktorym sie znajduje zgadza sie? :)
« Ostatnia zmiana: Sierpień 01, 2006, 00:50:03 wysłana przez maxest »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Nargil

  • Użytkownik
    • projekty

# Sierpień 01, 2006, 11:13:50
Dzialasz na trojkatach.

Istnieje punkt G, ktorego x,z zawieraja sie obszarze pewnego trojkata ABC.
Teraz rozbijasz trojkat ABC na 3 trojkaty: AGB, BGC, AGC. Liczysz pole tych trojkatow.
Wtedy:
G.y = Pole(AGB) / Pole(ABC) * C.y +
    + Pole(BGC) / Pole(ABC) * A.y +
    + Pole(AGC) / Pole(ABC) * B.y

geometria jest piekna :)

edit: pole liczysz tylko z rzutow na osie x,z (olewasz y)
« Ostatnia zmiana: Sierpień 01, 2006, 11:18:57 wysłana przez Nargil »

maxest

  • Gość
# Sierpień 01, 2006, 14:47:34
widze ze tych sposobow jest naprawde duzo :)
moja interpolacja ktora w koncu udalo mi sie napisac wyglada tak:

float getInterpolatedValue(float Ax, float Ay, float Bx, float By, float Cx)
{
float Cy = Ay + (((Cx - Ax)/(Bx - Ax)) * (By - Ay));
return Cy;
}



void DoEngine()
{
float interpolatedY1, interpolatedY2;
float interpolatedX1, interpolatedX2;
float interpolatedY;

interpolatedY1 = getInterpolatedValue(vertices[0].z, vertices[0].y, vertices[2].z, vertices[2].y, player.z);
interpolatedY2 = getInterpolatedValue(vertices[1].z, vertices[1].y, vertices[2].z, vertices[2].y, player.z);

interpolatedX1 = getInterpolatedValue(vertices[0].y, vertices[0].x, vertices[2].y, vertices[2].x, interpolatedY1);
interpolatedX2 = getInterpolatedValue(vertices[1].y, vertices[1].x, vertices[2].y, vertices[2].x, interpolatedY2);

interpolatedY = getInterpolatedValue(interpolatedX1, interpolatedY1, interpolatedX2, interpolatedY2, player.x);
player.y = interpolatedY;
}