[osg-users] combining Quats
Sebastian Messerschmidt
sebastian.messerschmidt at gmx.de
Wed Feb 1 03:36:55 PST 2017
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.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-openscenegraph.org
> <http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.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-openscenegraph.org
> <http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org>
>
>
>
>
> --
> trajce nikolov nick
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
More information about the osg-users
mailing list