[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