Re: [osg-users] combining Quats

2017-02-01 Thread Trajce Nikolov NICK
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.n...@gmail.com> wrote:

> Thanks Sebastian!
>
> I will write you off-list
>
> On Wed, Feb 1, 2017 at 12:36 PM, Sebastian Messerschmidt <
> sebastian.messerschm...@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.
>>
>> 
>> IN: gmtl::Vec3d local_normal; gmtl::EulerAngleXZYd
>> orientation;
>>
>>
>> //extract heading
>> const gmtl::Quatd quat  = gmtl::make(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(ori
>> entation);
>> target_quat = gmtl::slerp(target_quat, smooth_factor,
>> quat, target_quat);
>> orientation = gmtl::makeRot> ZXYd>(gmtl::makeRot(target_quat));
>> }
>> 
>>
>> 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
>>> >
>>>
>>> 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
>>> 
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>>> cenegraph.org
>>> >> scenegraph.org>
>>>
>>> ___
>>> osg-users mailing list
>>> osg-users@lists.openscenegraph.org
>>> 
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>>> cenegraph.org
>>> 

Re: [osg-users] combining Quats

2017-02-01 Thread Trajce Nikolov NICK
Thanks Sebastian!

I will write you off-list

On Wed, Feb 1, 2017 at 12:36 PM, Sebastian Messerschmidt <
sebastian.messerschm...@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.
>
> 
> IN: gmtl::Vec3d local_normal; gmtl::EulerAngleXZYd
> orientation;
>
>
> //extract heading
> const gmtl::Quatd quat  = gmtl::make(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(ori
> entation);
> target_quat = gmtl::slerp(target_quat, smooth_factor,
> quat, target_quat);
> orientation = gmtl::makeRot ZXYd>(gmtl::makeRot(target_quat));
> }
> 
>
> 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
>> >
>>
>> 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
>> 
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>> cenegraph.org
>> > scenegraph.org>
>>
>> ___
>> osg-users mailing list
>> osg-users@lists.openscenegraph.org
>> 
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-opens
>> cenegraph.org
>> > scenegraph.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
>



-- 
trajce nikolov nick

Re: [osg-users] combining Quats

2017-02-01 Thread Sebastian Messerschmidt

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.



IN: gmtl::Vec3d local_normal; gmtl::EulerAngleXZYd  orientation;


//extract heading
const gmtl::Quatd quat  = gmtl::make(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(orientation);
target_quat = gmtl::slerp(target_quat, smooth_factor, quat, 
target_quat);
		orientation = 
gmtl::makeRot(gmtl::makeRot(target_quat));

}


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
>
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


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





--
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


Re: [osg-users] combining Quats

2017-02-01 Thread 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> 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
>> 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
>



-- 
trajce nikolov nick
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] combining Quats

2017-02-01 Thread Sebastian Messerschmidt

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
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