Thanks Tony and Joel for more awesome help. I didn't get as much time as I
would have liked to work on it tonight. I will have to continue tomorrow
night (and probably into the weekend). I'll keep the thread posted. Thanks!

P.S. cool flight sim vid, Joel. Are you a fellow X-Wing/Tie Fighter fan?
Freespace perhaps?


On Thu, Mar 1, 2012 at 10:29 PM, Joel R. <joelru...@gmail.com> wrote:

> http://www.youtube.com/watch?v=5y6a_oFtNiI
>
>
> On Thu, Mar 1, 2012 at 10:35 PM, Tony "omega" Sergi 
> <omegal...@gmail.com>wrote:
>
>> This actually will work in Source, as the input/view stuff is basically
>> identical:
>> http://articles.thewavelength.net/269/
>> -Tony
>>
>>
>>
>> On Fri, Mar 2, 2012 at 5:09 AM, Craig Louie <craiglo...@gmail.com> wrote:
>>
>>> 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
>>>
>>>
>>>
>>
>>
>> --
>> -Tony
>>
>>
>> _______________________________________________
>> 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