[QUOTE=PixelTwitch;496068]THIS IS A POST I STOLE!
However after reading it multiple times I can assure you that this is the EXACT problem I am facing… I am a 3.6Sensitivity gamer at 800dpi
Quakes Method is as follows: (assuming no mouse acceleration)
Code:
θ = MouseInputX * Sensitivity * M_Yaw
M_Yaw is by default 0.022 degrees. So if in game sensitivity is 1, 1 inch of travel on an 1800dpi mouse to the right will rotate the player by 39.6 degrees.
UDK’s Method is similar:
Code:
θ = MouseInputX * Sensitivity * 0.00549316540360483
So if we want the same feel as in the Quake example we can set the sensitivity to around 4, giving us 39.6 degrees of movement on 1800 dpi mouse over 1 inch of horizontal travel.
So where is the problem then?
UDK stores most rotations in a “rotator” struct
Code:
struct immutable Rotator
{
var() int Pitch, Yaw, Roll;
};
Where “rotator units” of rotation are stored as euler angles across 3 integers.
Taking this into account, UDK’s actual mouse translation looks like this,
Code:
int UnrRot = (int)(MouseInputX * Sensitivity)
So for every “UnrRot” of movement there is an amount of rotation, in degrees, of (UnrRot * UnrRotToDeg ) Where UnrRotToDeg = 0.00549316540360483;
You cannot move .5 UnrRots! It is an integer, you must move by whole numbers only!
Every decimal movement of the mouse is converted (rounded) to an integer. And C++ by default truncates (rounds down). If I move 1 dot to the right and have a sensitivity of 0.9 there is no rotation whatsoever.
Example:
Suppose two players want 1 inch of mouse movement to be 15 degrees of rotation. Player one has a 400dpi mouse and Player two has an 1800 dpi mouse. Player one sets his sensitivity to 6.82, and Player two sets his to 1.51.
If both players move their mice slowly, over an inch, to where every frame their mouse moves only one dot (MouseInputX = 1) Player one moves 13.18 degrees and Player two moves 9.88 degrees. That’s an error of 13.8% and 66% respectively.
Now both players move their mice by an inch but quicker. Now at 2 dots per frame instead of one(MouseInputX = 2) Player one moves 14.28 degrees and Player two moves 14.83. Their errors are suddenly very different, 5% and 1.1%.
But if Player 2 wants to play at zoom level 2 at low sensitivity, his lowest choice of sensitivity is 1. If the sensitivity is any lower the amount of error will sky rocket. The only way to safely lower the amount of rotation per unit of mouse travel is to lower the mouse dpi.
Why does this affect High DPI players more? It doesn’t, It affects all people who have decimal sensitivities, with the most affected being lower sensitivity players as the error caused by rounding is greatest. It’s just that high dpi players tend to play at lower sensitivities.
How to alleviate this problem:
Set your sensitivity to whole numbers or slightly above whole numbers (ex: 10.0 or 10.01)
Either set “bEnableFOVScaling=False” in your input.ini or understand how fov affects sensitivity.*
If fov scale is on your sensitivity is multiplied by (fov * .01111)
I’m guessing that at zoom level one your fov is (fov - (fov - 40)/2) aka halfway between normal and 40. And zoom level two your fov is 40.
If you set fov scaling off you should look for a sensitivity macro. Most games set the sensitivity to the ratio between the two fov’s (90->45 = .5 sensitivity) If you want it to feel like default cs 1.6 you multiply the ratio by 1.2 (90->45 = 1.2(.5 sensitivity))
How Hi-Rez should handle it:
Level 0: Do nothing
Level 1: Add 0.5 to the mouse movement so it rounds better as it gets casted to an int
Level 2: In addition to above, save the error from rounding and apply it next frame
Level 3: Virtual DPI cvar
Level 4: Use quaternions instead of rotators."[/QUOTE]
Hi PixelTwitch,
The post you made above is indeed correct and is one of the factors contributing to the mouse input feeling less than perfect. This is a known issue that will require some time to fix properly so watch this space for updates.