Hi Trajce,

based on Euler with optional smoothing (to avoid jaggy movement), this algorithm will adapt a local pose conserving heading. The smoothing part is mainly to get a smooth transition between adjacend terrain normals. Sorry for the cluttered code.

<code>
        IN:     gmtl::Vec3d local_normal; gmtl::EulerAngleXZYd  orientation;
                        

        //extract heading
        const gmtl::Quatd quat  = gmtl::make<gmtl::Quatd>(orientation);
                
gmtl::Vec3d heading = gmtl::xform(heading, quat, gmtl::Vec3d(0.0,1.0,0.0));
        //project heading to plane and normalize
        heading = gmtl::makeNormal(gmtl::Vec3d(heading[0], heading[1], 0.0));
        // get a vector perpendicular to projected heading and the normal
        const gmtl::Vec3d perpendicular = gmtl::makeCross(local_normal, 
heading);
const gmtl::Vec3d perpendicular_2 = gmtl::makeCross(perpendicular, local_normal);
        // construct a new orientation leaving the heading untouched
        orientation = gmtl::EulerAngleZXYd      (
                                                                                
orientation[0]
                                                                                
,gmtl::Math::aSin(perpendicular_2[2])
                                                                                
,gmtl::Math::aTan2(perpendicular[2], local_normal[2])
                                                                                
);
        if (smooth_factor < 1.0)
        {
                gmtl::Quatd target_quat = 
gmtl::makeRot<gmtl::Quatd>(orientation);
                target_quat = gmtl::slerp(target_quat, smooth_factor, quat, 
target_quat);
orientation = gmtl::makeRot<gmtl::EulerAngleZXYd>(gmtl::makeRot<gmtl::Matrix44d>(target_quat));
        }
</code>

Cheers
Sebastian

P.S. If you got further questions, simply drop me a private message/email.




Am 2/1/2017 um 11:27 AM schrieb Trajce Nikolov NICK:
Hi Sebastian,

the code will be welcome. I was expecting that the proper way is to go
through Eulers

Thanks a lot!


On Wed, Feb 1, 2017 at 9:48 AM, Sebastian Messerschmidt
<sebastian.messerschm...@gmx.de <mailto:sebastian.messerschm...@gmx.de>>
wrote:

    Hi Trajce,

    Did I miss the question :-) If it is working: fine. :-)

    In general you are extracting the heading I guess (with the
    modelOrientation) and put it on top the tilted normal, which will
    put you on in this pose. The problem might be, that you introduce
    unwanted roll with this. I can give you some code (not based on OSG,
    but you'll get the idea) adapting a EulerAngle pose to a terrain
    normal using a local tangent plane.

    Cheers
    Sebastian




        Hi community,

        this is sort of easy math question (btw, I missed that part in my
        classes ;-) ) I want to check it with you.

        It is about node following terrain. my node is MatrixTransform and I
        have to set it in world coordinates. The node has it's own
        rotation and
        I just need to take the terrain normal into account. Here is the
        pseudocode that produces some acceptable results (not sure if
        they are
        correct though, thus asking you for hints)

        Vec3 terrainNormal;

        Quat terrainOrientation;
        terrainOrientation.makeRotate(Vec3(0,0,1), terrainNormal);

        Quat modelOrientation;
        modelOrientation.makeRotate(Vec3(0,1,0), whatever);

        Quat q;
        q = terrainOrientation * modelOrientation; // not sure about this

        MatrixTransform mxt = ...
        mxt->setMatrix(Matrixd:;rotate(q) * ...);

        Any hints?

        Thanks a bunch as always!
        Nick


        --
        trajce nikolov nick


        _______________________________________________
        osg-users mailing list
        osg-users@lists.openscenegraph.org
        <mailto:osg-users@lists.openscenegraph.org>
        
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
        
<http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org>

    _______________________________________________
    osg-users mailing list
    osg-users@lists.openscenegraph.org
    <mailto:osg-users@lists.openscenegraph.org>
    http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
    <http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org>




--
trajce nikolov nick


_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to