[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