Thanks Joel! I'll also try out your method when I get home. I'll keep
everyone posted on my results.

Thanks!


On Thu, Mar 1, 2012 at 11:12 AM, Joel R. <joelru...@gmail.com> wrote:

> Quaternion.h
> http://pastebin.com/hxTBab3T
>
> Quaternion.cpp
> http://pastebin.com/2WizAewD
>
> Quaternion Rotation Formulas (Yaw/Pitch/Roll)
> http://pastebin.com/BHRvcbCG
>
> I got most of the quaternion stuff from Ogre engine and converted to work
> on Source Engine.  The functions you will be interested in using are
> FromRotationMatrix, ToRotationMatrix, AxisAngle, ToAxisAngle,
> GetRotationTo, ToAxes, Slerp, GetAngles, GetMatrix
>
> So basically you'll do what's below: (this is psuedocode, function names
> are not exact!)
>
>
> Quat current, target;
> current.FromRotationMatrix( ent->EntityWorldTransform() );
>
> target = current;
> target = yaw( target, 10 ); //10 degrees to the right, this function is
> not part of Quat class for some reason
>
> current = Slerp( current, target, 0.2 ); //This is only 20%, you'll need
> to calculate the angle difference between current/target, and then move
> based on your angles per second speed.
>
> matrix3x4_t newRot;
> current.ToRotationMatrix( newRot );
> ent->SetWorldTransform( newRot );
>
>
>
> Enjoy!
>
>
>
>
>
>
> On Thu, Mar 1, 2012 at 12:46 PM, Joel R. <joelru...@gmail.com> wrote:
>
>> The quaternion calculations you're doing are similar to just manipulating
>> the Euler Angles, which cause Gimbal Lock.
>>
>> The way I did it in my flight simulation is to create a Current
>> Quaternion (from the starting Matrix Transformation when user spawns) and
>> Target Quaternion (where they want to rotate to).  I also used some
>> formulas to rotate the quaternion in the individual yaw/pitch/roll
>> orientations, I recommend googling for these formulas.  I then used the
>> Slerp formula to animate from the Current quaternion to the Target
>> quaternion. Slerp will avoid Gimbal-Lock entirely, which is very neat.
>>
>> After you do those calculations, just convert the new Current Quaternion
>> into a Matrix Transformation and set the Entity to take that transform.
>>
>> I've used this to control the entity rotation as well as the camera, it
>> allows you to do some pretty nifty tricks.
>>
>> I'll look for the code, if I still have it, and I'll post it here for
>> you.  Or if you figure out, please post a video =D
>>
>> Regards,
>>
>> Joel
>>
>>
>>
>> On Thu, Mar 1, 2012 at 11:55 AM, Minh <minh...@telus.net> wrote:
>>
>>>  You can try spitting out the results to a file so you can observe the
>>> hitch more closely.
>>> Look for a function called COM_Log
>>>
>>> COM_Log ( "viewangle_hitch.txt", "%.2f  %.2f  %.2f  \n",   viewangles.x,
>>> viewangles.y, viewangles.z );
>>>
>>> On 3/1/2012 3:55 AM, Craig Louie wrote:
>>>
>>> Thanks for the reply Saul. I hadn't thought of disabling prediction. I
>>> just gave it a shot. I changed to "engine->ClientCmd( "cl_predict 0" );" in
>>> cdll_client_int.cpp. With another test, the unsmooth rotation when looking
>>> straight up/down still occurs.
>>>
>>> My main theories at this point:
>>> 1) Something is occurring in VectorAngles(vec_for_out, vec_up_out,
>>> viewangles) to cause this. VectorAngles() might not produce straight
>>> up/down Euler angles properly - choking because of aliasing perhaps? This
>>> is a big guess because I don't know the inner workings of VectorAngles().
>>> 2) There is some code somewhere else that is conflicting with the full,
>>> unclamped rotation I've implemented. I've tried to remove all instances of
>>> pitch clamping, for example. But I may have missed something. Also, it's
>>> possible mouse rotation is somehow conflicting with my changes to joystick
>>> rotation.
>>>
>>> Here's a video of the issue I'm seeing. It happens a few times in the
>>> video. You'll see it happen the first time at about 11 seconds in when the
>>> text on the floor twists/shakes.
>>> http://www.youtube.com/watch?v=PLN641Qsn08
>>>
>>> Thanks!
>>>
>>>
>>>
>>> On Wed, Feb 29, 2012 at 11:34 PM, Saul Rennison <saul.renni...@gmail.com
>>> > wrote:
>>>
>>>> The hitching is most likely something trying to revert your angle
>>>> changes (I.e. in prediction). Have you tried disabling prediction?
>>>>
>>>>
>>>> On Thursday, March 1, 2012, Craig Louie wrote:
>>>>
>>>>> Hello Coders,
>>>>>
>>>>> I'm trying to create a space flight combat game with the Source SDK.
>>>>> Currently, I am trying to achieve rotation around the player's local axes
>>>>> for airplane-like pitch, yaw and roll. Below is the code I'm using to try
>>>>> to implement full 3D rotation. I'm running into a problem where the
>>>>> player's view twists and hitches unsmoothly when the player looks straight
>>>>> up or straight down. I think this may be because of the inherent problem 
>>>>> of
>>>>> aliasing/Gimbal-lock when using Euler angles. Any advise?
>>>>>
>>>>> //#########################################
>>>>> //Take the Euler angles for the player's orientation (viewangles) and
>>>>> convert them to vectors.
>>>>> Vector vec_for, vec_rt, vec_up, vec_for_out, vec_rt_out, vec_up_out;
>>>>> AngleVectors(viewangles, &vec_for, &vec_rt, &vec_up);
>>>>>
>>>>> //Take the resulting vectors and the desired rotation amounts and
>>>>> convert them to Quaternions.
>>>>> Quaternion turn_q, look_q, roll_q;
>>>>> // NOTE: Assumes axis is a unit vector, non-unit vectors will bias the
>>>>> resulting rotation angle (but not the axis)
>>>>> VectorNormalize(vec_up);
>>>>> AxisAngleQuaternion(vec_up, turn_angle, turn_q);
>>>>>
>>>>> VectorNormalize(vec_rt);
>>>>> AxisAngleQuaternion(vec_rt, look_angle, look_q);
>>>>>
>>>>> VectorNormalize(vec_for);
>>>>> AxisAngleQuaternion(vec_for, roll_angle, roll_q);
>>>>>
>>>>> //Convert the quaternions to matrices.
>>>>> matrix3x4_t xform0, xform1, xform2;
>>>>> QuaternionMatrix(turn_q, xform0);
>>>>> QuaternionMatrix(look_q, xform1);
>>>>> QuaternionMatrix(roll_q, xform2);
>>>>>
>>>>> //Combine matrices.
>>>>> matrix3x4_t xformA, xformB;
>>>>> MatrixMultiply(xform0, xform1, xformA);
>>>>> MatrixMultiply(xformA, xform2, xformB);
>>>>>
>>>>> //Rotate the vectors with our combined rotation matrix.
>>>>> VectorRotate(vec_for, xformB, vec_for_out);
>>>>> VectorRotate(vec_rt, xformB, vec_rt_out);
>>>>> VectorRotate(vec_up, xformB, vec_up_out);
>>>>>
>>>>> //Determine the new viewangles based on our rotated vectors.
>>>>> VectorAngles(vec_for_out, vec_up_out, viewangles);
>>>>> //#########################################
>>>>>
>>>>> I put this code into in_joystick.cpp in the JoyStickMove( float
>>>>> frametime, CUserCmd *cmd ) function.
>>>>>
>>>>>
>>>>> Thanks!
>>>>>
>>>>>
>>>>>
>>>>
>>>>  --
>>>>
>>>>
>>>>  Kind regards,
>>>> *Saul Rennison*
>>>>
>>>> _______________________________________________
>>>> To unsubscribe, edit your list preferences, or view the list archives,
>>>> please visit:
>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>>>>
>>>>
>>>>
>>>
>>>
>>> _______________________________________________
>>> To unsubscribe, edit your list preferences, or view the list archives, 
>>> please 
>>> visit:https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>>>
>>>
>>>
>>> _______________________________________________
>>> To unsubscribe, edit your list preferences, or view the list archives,
>>> please visit:
>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>>>
>>>
>>>
>>
>
> _______________________________________________
> To unsubscribe, edit your list preferences, or view the list archives,
> please visit:
> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>
>
>
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders

Reply via email to