Still had no time to check your problem in depth but I can already say that you 
do it the wrong way . You should not create a quaternion per orientation . That 
is the whole point of quaternion nature that it is capable to transform roll / 
pitch/ yaw/ together without causing such anomalies like gimbal lock or all 
kinds of ugly rotations. You should fill a quaternion from axis angles or Euler 
angles data in your case if I remember right those are Euler ( but not sure ) 
I have very little time to help on such a thing so if you want to speed the 
things  up send me a source code that I can plug and play so that I will be 
able to focus on the problem .

Sent from my iPhone

On Apr 30, 2011, at 2:11 PM, vangojames <[email protected]> wrote:

> By the way here is the clearQuat method:
> 
> /**
> * Clears all quaternions values
> */
> private function clearQuat(q:Quaternion):void
> {
>    q.w = 1;
>    q.x = 0;
>    q.y = 0;
>    q.z = 0;
> }
> 
> On Apr 30, 12:09 pm, vangojames <[email protected]> wrote:
>> Thanks for the quick response Michael. Here is my update method:
>> 
>> /**
>>  * Handles renders
>>  */
>> private function update(dt:Number):void
>> {
>>         // recalculate the movement (this just takes inputs and populates)
>>         // the _tempRot Vector with dt * _angularSpeed
>>         updateMovementRotation(dt);
>> 
>>         // reset quaternions
>>         clearQuat(_tempRotQuat);
>>         clearQuat(_tempYawQuat);
>>         clearQuat(_tempPitchQuat);
>>         clearQuat(_tempRollQuat);
>> 
>>         // recalculate temp quaternions
>>         _tempPitchQuat.fromAxisAngle(Vector3D.X_AXIS, _tempRot.x);
>>         _tempYawQuat.fromAxisAngle(Vector3D.Y_AXIS, _tempRot.y);
>>         _tempRollQuat.fromAxisAngle(Vector3D.Z_AXIS, _tempRot.z);
>> 
>>         // apply quaternion rotations
>>         _tempRotQuat.multiply(_tempRotQuat, _tempPitchQuat);
>>         _tempRotQuat.multiply(_tempRotQuat, _tempYawQuat);
>>         _tempRotQuat.multiply(_tempRotQuat, _tempRollQuat);
>> 
>>         // apply to current rotation
>>         _camRot.multiply(_camRot, _tempRotQuat);
>> 
>>         // clear cam mat and update with the new rotation
>>         _target = _camRot.rotatePoint(Vector3D.Z_AXIS);
>>         _up =_camRot.rotatePoint(Vector3D.Y_AXIS);
>> 
>>         // apply look at to new target and up
>>         lookAt(_target, _up);
>> 
>> }
>> 
>> I'm sure I'm doing lots wrong, I haven't looked at Quaternions since
>> University and I can't remember how they work!! I just know they will
>> get rid of the dreaded Gimbal Lock,
>> 
>> Thanks,
>> 
>> James
>> 
>> On Apr 30, 12:00 pm, Michael Iv <[email protected]> wrote:
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>>> If you can post the full code of your quaternion operation may be I can 
>>> help then .
>> 
>>> Sent from my iPhone
>> 
>>> On Apr 30, 2011, at 1:52 PM, vangojames <[email protected]> wrote:
>> 
>>>> Hi guys,
>> 
>>>> Please help me. I'm really stuck at trying to implement a Quaternion
>>>> based free camera. My current approach is this:
>> 
>>>> ON EACH UPDATE::
>> 
>>>> - Get yaw pitch and roll increase
>>>> - Create quaternions for yaw, pitch and roll (for example
>>>> Quaternion.fromAxisAngle(Vector3D.X_AXIS, pitch))
>>>> - Multiply together in order pitch * yaw * roll to get new temp
>>>> quaternion
>>>> - Multiply cameraRotation quaternion by this new temp quaternion
>>>> - Calculate target by doing
>>>> cameraRotation.rotatePoint(Vector3D.Z_AXIS);
>>>> - Calculate up by doing cameraRotation.rotatePoint(Vector3D.Y_AXIS);
>>>> - lookAt(trget, up)
>> 
>>>> Needless to say this doesn't work. I just get the tiniest amount of
>>>> movement and it isn't what is expected at all. Would someone be able
>>>> to explain the correct approach?
>> 
>>>> Thanks!!
>> 
>>>> James

Reply via email to