[osg-users] combining Quats

Trajce Nikolov NICK trajce.nikolov.nick at gmail.com
Wed Feb 1 04:28:30 PST 2017


Hi again list

Actually the math is present in the osgGA::TerrainManipulator (void
TerrainManipulator::clampOrientation()) and it works just great with some
mods (the 3D transforms for nodes are bit different then for the View
matrix.  I am all set.

Sebastian, thanks a lot !

Cheers,
Nick

On Wed, Feb 1, 2017 at 12:43 PM, Trajce Nikolov NICK <
trajce.nikolov.nick at gmail.com> wrote:

> 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-opens
>>> cenegraph.org
>>>
>>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>
>
>
> --
> trajce nikolov nick
>



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


More information about the osg-users mailing list