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