[PD] Free rotation in GEM

PSPunch shima at pspunch.com
Thu Jul 17 15:14:48 CEST 2008


Cyrille,


With your advise, I think I've successfully implemented the algorithm I 
had in mind.

The sad thing is, the algorithm I imagined did not exactly function in 
the way I wanted.

i.e. 1,
during one "drag session", when rotating the Y axis (dragging right or 
left) 180 degrees and then the x axis (up or down), it rotates as 
expected. However, when moving the axis in reverse order (making the 
teapot upside down, and then rotate) it does not rotate in the expected 
direction.

i.e. 2,
Behavior when dragging from one corner diagonally across the screen is 
not as expected.

I've attached a sample patch.


Probably the two problems are related. I need to look into this a bit more..

--
David Shimamoto


> ok.
> i think i undersand.
> 
> there is an other possibility based on the gemlist_info object that get 
> curent transformation matrix and convert it to rotation / translation ...
> 
> 
> so, what i think is the most simple is :
>     gemhead
>     |
>     rotateXYZ (for the drag rotation, should be (0 0 0) when you don't 
> drag)
>     |
>     rotateXYZ (for a feedback loop thanks to the rotation given by by 
> the last object on the chain)
>     |
>     object primitive
>     |
> gemlist         (the gemlist should be banged only at the end of the drag)
> |
> gemlist_info (get curent rotation at the end of the drag, and send it to 
> the 2nd rotate)
> 
> 
> you can save few cpu using gemlist_matrix and GEMglMultMatrix.
> 
> this is a bit like the algorythm you describ, execpt that everything is 
> computed on the GPU (it is more the Gem way to do).
> 
> cyrille
> 
> PSPunch a écrit :
>> Hi,
>>
>>
>> My primary goal is to place an object you can rotate by dragging the 
>> mouse.
>>
>>
>> Basically, whenever the mouse is clicked to start drag, I want to 
>> rotate the object on the X & Y axises. Up to this point is no problem, 
>> but I want the rotation to begin assuming the direction of the viewer 
>> being the bases of the axis.
>>
>> Using one [rotate] object, I can get the object to rotate in the 
>> behavior I expect only on the first drag.
>>
>> Ideally, each time the mouse button is released, the base (fundus? 
>> basal?) of the rotation vector should be updated... I think.
>>
>> By chaining [rotate] objects, I can use one to rotate the rotation 
>> axis and another to rotate the object from that point.
>> However, I have not found a method of summing multiple drag actions.
>>
>>
>> Although I may be wrong, I think what I need to do is,
>>
>>
>> 1. Prepare two rotation axises
>>     I. Angle of the axis
>>     II.Angle of the current drag session
>>
>> 2. When the mouse button is clicked, rotate object to
>>     angles I + II
>>
>> 3. When the mouse button is released, sum I + II and wait for
>>     a new click.
>>
>>
>> And again, although I may be wrong, my current understanding is that 
>> step 3 will require multiplying the X-Y-Z angles converted to 
>> quaternion, or some other method which will rotate the Z axis at some 
>> point by summing rotations based only on the X&Y axises.
>>
>>
>> Using procedures completely different from the one mentioned abouve, I 
>> was able to achieve the expected behavior based on [accumrotate] but I 
>> found no simple way of managing the current angle.
>>
>> Unfortunately I have torn down the patch. If it would clarify 
>> anything, I will try to put together another one later today.
>>
>>
>> Thanks for replies.
>> -- 
>> David Shimamoto
>>
>>
>>> Indeed,
>>>
>>> Seems to me all the matrix discussion does not get to the heart of the
>>> question.
>>>
>>> So, Pspunch, what are you really trying to do?
>>>
>>> I agree with cyrille that It's very likely the normal rotation objects
>>> will do what you want it to.
>>>
>>> If you are just wanting to rotate many times, using huge numbers then
>>> tricks like: wrap 0 359 work well...
>>>
>>> ..b
>>>
>>> cyrille henry wrote:
>>>> hello
>>>>
>>>> sorry if i misunderstand.
>>>> rotateXYZ will rotate in X direction, then in Y, finally in Z.
>>>> if you wish to rotate in Z, then in X, you just need 2 rotate objects:
>>>> the 1st for the rotation in Z, then an other for the rotation in X.
>>>>
>>>> anyway, there is no matrix manipulation that i was not able to do 
>>>> with rotate/rotateXYZ/translateXYZ/scaleXYZ/shearXY..
>>>> so i'm quite sure you don't need anything else than this standard 
>>>> objects for simple matrix rotation.
>>>>
>>>> so i think you need 1 [rotate] to rotate the vector axis of the 
>>>> object, then a accumrotate.
>>>> if i misunderstood, could you please describe your problem better.
>>>>
>>>> I think you can also use GEMgl objects to multiply the matrix with a 
>>>> custom one, but it's to much complex for what you need.
>>>>
>>>> cyrille
>>>>
>>>>
>>>>
>>>> PSPunch a écrit :
>>>>> Hi Mathieu,
>>>>>
>>>>>
>>>>> I have not looked into GridFlow much, but I had the impression that 
>>>>> its main concept was to add matrix manipulation features to Pd, all 
>>>>> of its visual capabilities being just one of the many results of 
>>>>> data you can manipulate with matrix. (or is the egg first?)
>>>>>
>>>>>
>>>>> Anyway, understanding its marvelous potentials, I have lately been 
>>>>> stuck with Windows platforms. At least I got your point that 
>>>>> utilizing GridFlow only for crunching numbers may work but not so 
>>>>> efficient.
>>>>>
>>>>>
>>>>>
>>>>> What I am trying to do is rotate the vector axis of the object 
>>>>> before applying [rotation]. This also calls for a method of summing 
>>>>> the rotations when applying multiple times (and my current 
>>>>> understanding is that this can only be done by multiplying the 
>>>>> quaternion on each rotation)
>>>>>
>>>>> If there is no solution at the moment, perhaps Gem could use a few 
>>>>> extra objects to ease advanced rotations?
>>>>>
>>>>> I feel like I am complaining about lack of features without 
>>>>> pointing out what exactly is missing, when I should be blaming my 
>>>>> lack of math skills.
>>>>>
>>>>> hmmm..
>>>>>
>>>>> -- 
>>>>> David Shimamoto
>>>>>
>>>>>
>>>>>
>>>>>> On Wed, 16 Jul 2008, PSPunch wrote:
>>>>>>
>>>>>>> Trying to achieve free rotation *without* using [accumrotate], I 
>>>>>>> have
>>>>>>> come across concepts such as multiplying matrixs and converting a 
>>>>>>> matrix
>>>>>>> to "quarternion"
>>>>>>> How do you implement precise control of rotation matrixs?
>>>>>>> Is this exactly what people use GridFlow for?
>>>>>> If you tried GridFlow's bundled examples you'd see what I use 
>>>>>> GridFlow for. I suppose that I could add some other people's 
>>>>>> examples in the package, if they sent it to me for that purpose. 
>>>>>> There is already one patch by Roman Häfeli in GridFlow's examples 
>>>>>> though.
>>>>>>
>>>>>> GridFlow does not support quaternions. I bet it's possible to add 
>>>>>> support for it using abstractions, but it wouldn't be fast. But 
>>>>>> I'm willing to add it to the core... there's already a 
>>>>>> complex-number section in number.c, why not quaternion product? It 
>>>>>> would be called [# H.*] where H stands for Hamilton (in math the 
>>>>>> letter Q is already reserved for rationals, so I'd use H even 
>>>>>> though the concept of rational reasonably couldn't appear in that 
>>>>>> particular place).
>>>>>>
>>>>>>  _ _ __ ___ _____ ________ _____________ _____________________ ...
>>>>>> | Mathieu Bouchard - tél:+1.514.383.3801, Montréal, Québec
>>>>> _______________________________________________
>>>>> Pd-list at iem.at mailing list
>>>>> UNSUBSCRIBE and account-management -> 
>>>>> http://lists.puredata.info/listinfo/pd-list
>>>>>
>>>>>
>>>> _______________________________________________
>>>> Pd-list at iem.at mailing list
>>>> UNSUBSCRIBE and account-management -> 
>>>> http://lists.puredata.info/listinfo/pd-list
>>>>
>>>
>>
>>
>> _______________________________________________
>> Pd-list at iem.at mailing list
>> UNSUBSCRIBE and account-management -> 
>> http://lists.puredata.info/listinfo/pd-list
>>
>>
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: rotate_test.pd
Type: application/puredata
Size: 1482 bytes
Desc: not available
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20080717/d5ec73a7/attachment.bin>


More information about the Pd-list mailing list