Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Splinestä bezieriksi

pieslice [18.01.2008 08:52:40]

#

Eli ongelmana on miten sarja 3d-pisteitä (spline) voidaan muuttaa bezier-muotoon?

Onko kenelläkään tähän mitään ratkaisua.

Apuna olen käyttänyt seuraavaa sivua:
http://lipas.uwasa.fi/~mla/haku02/mon/ch4/nm4e.html

Oletettavasti itse bezier-interpolaatio toimii, joten vika on todennäköisesti juuri tuon käyrän datassa.

Olen kokeillut seuraavaa huonoin tuloksin.

void ConvertCatmullRomToSmoothBezier( Math::Vector3D* pNodes, int firstNode, int nodeCount )
{

   for ( int n = firstNode + 4; n < nodeCount - 4; n += 4 )
    {
        Math::Vector3D root      = pNodes[n - 1];
        Math::Vector3D refVector = Math::VectorNeg( root, pNodes[n - 2] );
        Math::Vector3D altVector = Math::VectorNeg( pNodes[n + 1], root );

        const float a_n = Math::VectorLength( altVector );
        //Math::Normalize( refVector );
        //refVector = Math::VectorMulScalar( refVector, a_n );

        pNodes[n] = root;
        pNodes[n + 1] = Math::VectorNeg( root, refVector );
   }
}

Eli tarkoituksena olisi saada kulmakerroin pisteestä nodes[n] pisteeseen nodes[n + 1] samaksi kuin pisteestä nodes[n - 1] pisteeseen nodes[n - 2].

Käyrän ei tarvitse loopata omassa käyttötarkoituksessani.

User137 [18.01.2008 18:48:57]

#

Eikös noiden Catmull-rom ja bezier erona ole että catmull-käyrä kulkee pisteiden kautta ja bezier taas käyttää jonkinlaisia tukipisteitä. ts. aivan eri logiikalla, liekkö muunto edes mahdollista... jos yleensä olen oikeilla jäljillä? :)

catmull: http://upload.wikimedia.org/wikipedia/en/9/9b/Cardinal_Spline_Example.png
bezier: http://upload.wikimedia.org/wikipedia/en/0/0c/BezierInterpolation.gif

Markus [18.01.2008 20:04:06]

#

Jos Catmull-Rom -käyrä "C" kulkee pisteiden P0, P1, P2 ja P3 kautta niin, että C(0)=P1 ja C(1)=P2 ja halutaan luoda Bezier-käyrä "B" niin, että B(0)=P1 ja B(1)=P2 ja B(t)=C(t) ja B'(t)=C'(t) pitää Bezier käyrälle luoda kaksi uutta kontrollipistettä Pa ja Pb. Tällöin käyrän kontrollipisteet ovat P1, Pa, Pb ja P2 (mutta se kulkee tietenkin vain pisteiden P1 ja P2 kautta). Pisteille Pa ja Pb saadaan yksinkertaisella yhtälöryhmän ratkaisulla arvot:

Pa = (P2+6*P1-P0)/6
Pb = -(P3-6*P2-P1)/6

pieslice [19.01.2008 00:07:06]

#

Kiitoksia, Markuksen ohjeilla sain toimimaan oikein.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta