[Interest] Rotating leaves

Igor Mironchik igor.mironchik at gmail.com
Mon Apr 2 06:42:35 CEST 2018


Hi,


On 01.04.2018 23:56, Bin Chen wrote:
> Hi, Igor,
>
> 1. plainAngle is between 0~180, you want to know when you need to 
> invert it?
>     I assumed m_transform is for leaf, then swap branch and leaf in 
> QVector3D::crossProduct.
>     No need lessZero() function.

Big thanks. Great, swapping helped. So the rule is when you need to 
rotate something around some axis then first argument of 
QVector3D::crossProduct and QVector3D::dotProduct should be that vector 
that should be rotated?

>
> 2. In this case, be careful when branch and leaf are in the same line 
> (same or opposite directions)  , crossProduct produces null vector3d.
>
> Regards,
>
> Bin
>
>
>> On 1 Apr 2018, at 8:56 pm, Igor Mironchik <igor.mironchik at gmail.com 
>> <mailto:igor.mironchik at gmail.com>> wrote:
>>
>> Hi,
>>
>> Sure, I know this...
>>
>> const QVector3D branch(...);
>> const QVector3D leaf( 0.0f, 1.0f, 0.0f );
>> const QVector3D axis = QVector3D::crossProduct( branch, leaf );
>> const float cosPlainAngle = QVector3D::dotProduct( branch, leaf );
>> const float plainAngle = qRadiansToDegrees( std::acos( cosPlainAngle ) );
>> const QQuaternion quat = Qt3DCore::QTransform::fromAxisAndAngle( 
>> axis, plainAngle );
>> m_transform->setRotation( quat );
>>
>> But in a view of Qt 3D this is only a half of the solution. In a half 
>> of cases this works, but in another cases I need -plainAngle.
>>
>> So at this point I found the next solution:
>>
>> static inline bool lessZero( const QVector3D & v )
>> {
>>     return ( v.x() < 0.0f || v.y() < 0.0f || v.z() < 0.0f );
>> }
>>
>> if( lessZero( branch ) )
>>         plainAngle = -plainAngle;
>>
>> So I actually asked not for the math as it is but for checking of my 
>> solution for correctness.
>>
>> On 01.04.2018 12:48, Konstantin Shegunov wrote:
>>> Hi Igor,
>>> What Bin Chen wrote is probably the most painless way of achieving 
>>> what you want. If you are however interested in the math, here goes 
>>> my stab:
>>> If I understand you correctly, you know the leaf normal, and the 
>>> branch direction vector, then you're searching for the matrix that 
>>> transforms the former to the latter.
>>> Basically you need to find the matrix that satisfies: b = A  * n (b 
>>> is the branch direction, n is the leaf normal).
>>> This equation however is underdetemined, meaning you can have 
>>> several rotations done in sequence that give you the same result, so 
>>> you'd need to do some "trickery". One of the usual ways to solve 
>>> such a problem is to use Euler angles[1], where the idea is to make 
>>> elemental rotations with respect to the principle axes of the 
>>> (global) coordinate systems. To that end you'd need to calculate the 
>>> projections (i.e. dot products) of b and n to the principal axes and 
>>> extract the angles of rotation from there, then construct each 
>>> rotation matrix around a principal axis of the coordinate system and 
>>> finally multiply them to obtain the final transformation.
>>>
>>> [1]: https://en.wikipedia.org/wiki/Euler_angles 
>>> <https://urldefense.proofpoint.com/v2/url?u=https-3A__en.wikipedia.org_wiki_Euler-5Fangles&d=DwMDaQ&c=-0XTxx5JZxtPyuSXdvX8qQ&r=_JxpcpJpSMrVwuVMK05qMw&m=JDoIqjY-zYljVJcp8DYX1co3l1ElN2hO1_68-23VIAU&s=tezn68iaGXO6oGne6GHcWtS-CoDkU-Uj0fztStttyik&e=>
>>>
>>> I hope that helps.
>>> Konstantin.
>>
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org <mailto:Interest at qt-project.org>
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.qt-2Dproject.org_mailman_listinfo_interest&d=DwICAg&c=-0XTxx5JZxtPyuSXdvX8qQ&r=_JxpcpJpSMrVwuVMK05qMw&m=JDoIqjY-zYljVJcp8DYX1co3l1ElN2hO1_68-23VIAU&s=iR7_jc5oqZY41bU9FD_ergWeOPoFC0aUG4SyhsDkHIY&e=
>
> Confidentiality Notice: This message (including attachments) is a 
> private communication solely for use of the intended recipient(s). If 
> you are not the intended recipient(s) or believe you received this 
> message in error, notify the sender immediately and then delete this 
> message. Any other use, retention, dissemination or copying is 
> prohibited and may be a violation of law, including the Electronic 
> Communication Privacy Act of 1986.   ­­ 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20180402/46d0a494/attachment.html>


More information about the Interest mailing list