Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. Los Santos Drug Wars
      2. Updates
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Red Dead Online

      1. Blood Money
      2. Frontier Pursuits
      3. Find Lobbies & Outlaws
      4. Help & Support
    3. Crews

    1. Grand Theft Auto Series

      1. Bugs*
      2. St. Andrews Cathedral
    2. GTA VI

    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Classic GTA SA
      2. Guides & Strategies
      3. Help & Support
    6. GTA Vice City

      1. Classic GTA VC
      2. Guides & Strategies
      3. Help & Support
    7. GTA III

      1. Classic GTA III
      2. Guides & Strategies
      3. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Announcements

    2. Support

    3. Suggestions

[Math] Direction to Rotation?


stillhere
 Share

Recommended Posts

Hello, I'm no good at math so I'm asking here:


How would you modify this RotationToDirection code to instead calculate DirectionToRotation?

Thanks in advance! This is probably trivial for some of you haha


Edit: I gave it a try in my next post! I still need help though.


Edit: seems to be solved now :)

Edited by stillhere
Link to comment
Share on other sites

Might be able to convert this code to C#/Script Hook V .NET.

Thanks, though that would be harder than trying to work it out with the C# RotToDir code I think! So I gave it a try and it works well, except for one thing: the function will always return rotation.Z as a positive number, even when the actual rotation should be negative. Here's the code I've been working on:

Vector3 DirToRot(Vector3 Dir)        {            try            {                /*                This is rotation to direction:                rotx = 0.2                retx = 0.2 *  0.0174532924 = 0.00349065848 //radians to degrees                Cos(0.2 *  0.0174532924) = 0.9999939076578741                absx = Abs(Cos(0.2 *  0.0174532924)) = 0.9999939076578741                rotz = 0.3                retz = 0.3 * 0.0174532924 = 0.00523598772 //radians to degrees                dirx = -Sin(retz) * absx =  -0.005235963795437085 * 0.9999939076578741 = -0.0052359318961542843713968514009985 //-0.0052359318961542846 if rounded                diry = Cos(retz) * absx = 0.9999862922476151 * 0.9999939076578741 = 0.999980199989                dirz = Sin(retx) = 0.0052359637954370846088922220789420743196847079456760                now this is direction to rotation:                dirz = Sin(retx) =  0.0052359637954370846088922220789420743196847079456760                num1 = retx = Asin(dirz)                rotx = num1 / 0.0174532924                num2 = absx = Abs(Cos(num1)                num3 = diry / num2 = Cos(retz)                num4 = retz = Acos(num3)                rotz = num4 / 0.0174532924                roty?                */                float dirz = Dir.Z;                float num1 = (float)Math.Asin(dirz);                float rotx = num1 / 0.0174532924f;                float diry = Dir.Y;                float num2 = (float)Math.Cos(num1);                float num3 = diry / num2;                float num4 = (float)Math.Acos(num3);                float rotz = num4 / 0.0174532924f;                return new Vector3(rotx, 0, rotz);            }            catch            {                return Vector3.Zero;            }        }

I test it with this:

UI.ShowSubtitle(Game.Player.Character.Rotation.ToString() + "---" + DirToRot(Game.Player.Character.ForwardVector).ToString());
Anyone know how to get the proper sign for the Z rotation?
Edit: if I do it this way, the sign changes accordingly, but once the players rotation goes above 90 or below -90, the DirToRot function starts going the opposite way
ex: if player's rotation.Z is -180, DirToRot.Z will be 0
if player's rotation.Z is 135, DirToRot.Z will be 45
if player's rotation.Z is -135, DirToRot.Z will be -45
any ideas?
Vector3 DirToRot(Vector3 Dir)        {            try            {                float dirz = Dir.Z;                float num1 = (float)Math.Asin(dirz);                float rotx = num1 / 0.0174532924f;                                float dirx = Dir.X;                float num2 = (float)Math.Cos(num1);                float num3 = dirx / num2;                float num4 = (float)Math.Asin(-num3);                float rotz = num4 / 0.0174532924f;                return new Vector3(rotx, 0, rotz);            }            catch            {                return Vector3.Zero;            }        }
Edited by stillhere
Link to comment
Share on other sites

That looks good.. but I've edited my code a bit and it seems to work well now :D

        Vector3 DirToRot(Vector3 Dir)        {            try            {                /*                This is rotation to direction:                rotx = 0.2                retx = 0.2 *  0.0174532924 = 0.00349065848 //radians to degrees                Cos(0.2 *  0.0174532924) = 0.9999939076578741                absx = Abs(Cos(0.2 *  0.0174532924)) = 0.9999939076578741                rotz = 0.3                retz = 0.3 * 0.0174532924 = 0.00523598772 //radians to degrees                dirx = -Sin(retz) * absx =  -0.005235963795437085 * 0.9999939076578741 = -0.0052359318961542843713968514009985 //-0.0052359318961542846 if rounded                diry = Cos(retz) * absx = 0.9999862922476151 * 0.9999939076578741 = 0.999980199989                dirz = Sin(retx) = 0.0052359637954370846088922220789420743196847079456760                now this is direction to rotation:                dirz = Sin(retx) =  0.0052359637954370846088922220789420743196847079456760                num1 = retx = Asin(dirz)                rotx = num1 / 0.0174532924                num2 = absx = Abs(Cos(num1)                num3 = diry / num2 = Cos(retz)                num4 = retz = Acos(num3)                rotz = num4 / 0.0174532924                roty?                */                float dirz = Dir.Z;                float num1 = (float)Math.Asin(dirz);                float rotx = num1 / 0.0174532924f;                                float dirx = Dir.X;                float num2 = (float)Math.Cos(num1);                float num3 = dirx / num2;                float num4 = (float)Math.Asin(-num3);                float rotz1 = num4 / 0.0174532924f;                float diry = Dir.Y;                float num5 = (float)Math.Cos(num1);                float num6 = diry / num5;                float num7 = (float)Math.Acos(num6);                float rotz2 = num7 / 0.0174532924f;                                if (rotz1 > 0)                {                    if (rotz2 < 90)                    {                        trueRotZ = rotz1; //trueRotZ is a global float variable.                    }                    else                    {                        trueRotZ = rotz2;                    }                }                else                {                    if (rotz2 < 90)                    {                        trueRotZ = rotz1;                    }                    else                    {                        trueRotZ = -rotz2;                    }                }                return new Vector3(rotx, 0, trueRotZ);            }            catch            {                return Vector3.Zero;            }        }
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.