stillhere Posted December 6, 2016 Share Posted December 6, 2016 (edited) 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 December 7, 2016 by stillhere Link to comment Share on other sites More sharing options...
Jitnaught Posted December 6, 2016 Share Posted December 6, 2016 Might be able to convert this code to C#/Script Hook V .NET. Link to comment Share on other sites More sharing options...
stillhere Posted December 6, 2016 Author Share Posted December 6, 2016 (edited) 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 December 6, 2016 by stillhere Link to comment Share on other sites More sharing options...
CamxxCore Posted December 7, 2016 Share Posted December 7, 2016 Maybe this is helpful? https://tohjo.eu/dapkcuf/citizenmp/blob/c8710f0a3cf076c7f2a8fcbb22ed2902116f4f4c/client/clrcore/Math/GameMath.cs stillhere, Jitnaught and NModds 3 Link to comment Share on other sites More sharing options...
stillhere Posted December 7, 2016 Author Share Posted December 7, 2016 Maybe this is helpful? https://tohjo.eu/dapkcuf/citizenmp/blob/c8710f0a3cf076c7f2a8fcbb22ed2902116f4f4c/client/clrcore/Math/GameMath.cs That looks good.. but I've edited my code a bit and it seems to work well now 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now