[osg-users] combining Quats

Trajce Nikolov NICK trajce.nikolov.nick at gmail.com
Wed Feb 1 03:43:16 PST 2017


Thanks Sebastian!

I will write you off-list

On Wed, Feb 1, 2017 at 12:36 PM, Sebastian Messerschmidt <
sebastian.messerschmidt at gmx.de> wrote:

> 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>(ori
> entation);
>                 target_quat = gmtl::slerp(target_quat, smooth_factor,
> quat, target_quat);
>                 orientation = gmtl::makeRot<gmtl::EulerAngle
> ZXYd>(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.messerschmidt at gmx.de <mailto:sebastian.messerschmidt at 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 at lists.openscenegraph.org
>>         <mailto:osg-users at lists.openscenegraph.org>
>>         http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>> cenegraph.org
>>         <http://lists.openscenegraph.org/listinfo.cgi/osg-users-open
>> scenegraph.org>
>>
>>     _______________________________________________
>>     osg-users mailing list
>>     osg-users at lists.openscenegraph.org
>>     <mailto:osg-users at lists.openscenegraph.org>
>>     http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>> cenegraph.org
>>     <http://lists.openscenegraph.org/listinfo.cgi/osg-users-open
>> scenegraph.org>
>>
>>
>>
>>
>> --
>> trajce nikolov nick
>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>



-- 
trajce nikolov nick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20170201/60043bfb/attachment-0003.htm>


More information about the osg-users mailing list