[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