public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = Util.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0, 0, 0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return(false); } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return(true); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = CameraHelper.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); }
public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out Entity hitEntity) { var numPoints = 5; var angleStep = Math.PI * 0.2; var distStep = 0.05 / 5; var resultCoord = new Vector3(); hitEntity = null; for (var i = 0; i < numPoints; i++) { var angle = i * angleStep; var dist = i * distStep; var offsetX = Math.Sin(angle) * dist; var offsetY = Math.Cos(angle) * dist; var coord = screenCoords + new Vector2((float)offsetX, (float)offsetY); Entity entity; var hitcoord = RaycastEverything(coord, out entity, i!=0); if (i == 0) { resultCoord = hitcoord; } if ((entity != null) && ((ScriptHookExtensions.IsEntityAPed(entity) && entity.Handle != Game.Player.Character.Handle) || (ScriptHookExtensions.IsEntityAVehicle(entity) && !(Game.Player.Character.IsInVehicle() && entity.Handle == Game.Player.Character.CurrentVehicle.Handle)))) { hitEntity = entity; resultCoord = hitcoord; break; } } return resultCoord; }
public GTABoundingBox2 To2D() { float x_min = float.MaxValue, x_max = 0, y_min = float.MaxValue, y_max = 0; foreach (GTAVector v in CornerPoints) { Vector2 temp = HashFunctions.Convert3dTo2d(v, out bool success); if (success) { x_max = Math.Max(x_max, temp.X); x_min = Math.Min(x_min, temp.X); y_max = Math.Max(y_max, temp.Y); y_min = Math.Min(y_min, temp.Y); } else { //System.IO.File.AppendAllText("F:/datasets/GTA_V_anomaly/log.txt", "Coord failed: " + temp.ToString() + "\n"); } } x_max = Math.Min(x_max, 1f); x_min = Math.Max(x_min, 0f); y_max = Math.Min(y_max, 1f); y_min = Math.Max(y_min, 0f); var result = new GTABoundingBox2 { Min = new GTAVector2(x_min, y_min), Max = new GTAVector2(x_max, y_max) }; return(result); }
public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, float radius) { Vector3 source3D; Vector3 target3D; ScreenRelToWorld(screenCoord, out source3D, out target3D); return(RaycastEverything(out hitEntity, target3D, source3D, radius)); }
/// <summary> /// Cause the vehicle to levitate. /// </summary> public static LevitateController Levitate(this Vehicle vehicle, Random rnd, Timer timer) { var extraHeight = 10f + (float)(rnd.NextDouble() * 5f); float?jitter = null; var position = new GTA.Math.Vector2(vehicle.Position.X, vehicle.Position.Y); var height = World.GetGroundHeight(position) + extraHeight; return(new LevitateController(timer, vehicle, height, rnd, jitter)); }
/// <summary> /// Cause the pedestrian to levitate. /// </summary> public static LevitateController Levitate(this Ped ped, Random rnd, Timer timer) { var extraHeight = 4f + (float)(rnd.NextDouble() * 2f); float?jitter = 0.05f; ped.Euphoria.HighFall.Start(10_000); var position = new GTA.Math.Vector2(ped.Position.X, ped.Position.Y); var height = World.GetGroundHeight(position) + extraHeight; return(new LevitateController(timer, ped, height, rnd, jitter)); }
public static bool WorldToScreenRel(GTA.Math.Vector3 worldCoords, out GTA.Math.Vector2 screenCoords) { bool success; screenCoords = HashFunctions.Convert3dTo2d(worldCoords, out success); if (!success) { return(false); } screenCoords.X = (screenCoords.X - 0.5f) * 2.0f; screenCoords.Y = (screenCoords.Y - 0.5f) * 2.0f; return(success); }
public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords) { var num1 = new OutputArgument(); var num2 = new OutputArgument(); if (!Function.Call <bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2)) { screenCoords = new Vector2(); return(false); } screenCoords = new Vector2((num1.GetResult <float>() - 0.5f) * 2, (num2.GetResult <float>() - 0.5f) * 2); return(true); }
public static GTABoundingBox2 ComputeBoundingBox(Entity entity) { var m = entity.Model; (Vector3 gmin, Vector3 gmax) = m.Dimensions; var bbox = new SharpDX.BoundingBox(new SharpDX.Vector3(gmin.X, gmin.Y, gmin.Z), new SharpDX.Vector3(gmax.X, gmax.Y, gmax.Z)); var res = new GTABoundingBox2 { Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity), Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity) }; foreach (var corner in bbox.GetCorners()) { var cornerVector = new Vector3(corner.X, corner.Y, corner.Z); cornerVector = entity.GetOffsetPosition(cornerVector); Vector2 position = HashFunctions.Convert3dTo2d(cornerVector); if (position.X == .1f || position.Y == .1f || position.X == .9f || position.Y == .9f) { return(new GTABoundingBox2 { Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity), Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity), Quality = DataQuality.Low }); } res = new GTABoundingBox2 { Min = new Vector2(Math.Min(res.Min.X, position.X), Math.Min(res.Min.Y, position.Y)), Max = new Vector2(Math.Max(res.Max.X, position.X), Math.Max(res.Max.Y, position.Y)), Quality = DataQuality.High }; } if (res.Max.X == res.Min.X || res.Max.Y == res.Min.Y) { res.Quality = DataQuality.Low; } return(res); }
public static Vehicle SearchVehicle(Vector2 screenCoords) { const double searchRange = 0.1; const double thresholdRange = 0.025; const float raycastToDist = 200.0f; var vehs = World.GetNearbyVehicles(Game.Player.Character.Position, raycastToDist); var mindist = Double.MaxValue; Vehicle foundVeh = null; //Util.Log("Vehs - " + vehs.Length); //Util.Log("V - " + DateTime.UtcNow.Ticks); foreach (var vehicle in vehs) { if ((Game.Player.Character.IsInVehicle()) && (vehicle.Handle == Game.Player.Character.CurrentVehicle.Handle)) { continue; //you own veh } var vehOffset = vehicle.Position; Vector2 vehScreenCoords; if (!WorldToScreenRel(vehOffset, out vehScreenCoords)) { continue; } var dist = (screenCoords - vehScreenCoords).Length(); if (!(dist < mindist) || !(dist < searchRange)) { continue; } if (vehicle.IsOccluded) { continue; } //if (IsOccluded(vehicle, vehOffset)) continue; mindist = dist; foundVeh = vehicle; if (dist < thresholdRange) { break; } } //Util.Log("W - " + DateTime.UtcNow.Ticks); return(foundVeh); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = Util.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); //UI.ShowSubtitle("Cam: " + Math.Round(camPoint.X, 1) + " " + Math.Round(camPoint.Y, 1) + " " + // Math.Round(camPoint.Z, 1) // + "\nResult: " + Math.Round(farPoint.X, 1) + " " + Math.Round(farPoint.Y, 1) + " " + // Math.Round(farPoint.Z, 1)); //+ "\n Cam: " + Math.Round(mView.M11, 1) + " " + Math.Round(mView.M12, 1) + " " + Math.Round(mView.M13, 1) + " " + Math.Round(mView.M14, 1) //+ "\n " + Math.Round(mView.M21, 1) + " " + Math.Round(mView.M22, 1) + " " + Math.Round(mView.M23, 1) + " " + Math.Round(mView.M24, 1) //+ "\n " + Math.Round(mView.M31, 1) + " " + Math.Round(mView.M32, 1) + " " + Math.Round(mView.M33, 1) + " " + Math.Round(mView.M34, 1) //+ "\n " + Math.Round(mView.M41, 1) + " " + Math.Round(mView.M42, 1) + " " + Math.Round(mView.M43, 1) + " " + Math.Round(mView.M44, 1)); }
public static GTA.Math.Vector3 RaycastFromCoord(float x, float y, Entity ignore, float maxDist, float failDist, out RaycastResult res) // 0, 0 is center screen { Camera camera = World.RenderingCamera; GTA.Math.Vector3 position = camera.Position; GTA.Math.Vector2 screenCoords = new GTA.Math.Vector2(x, y); GTA.Math.Vector3 WorldCoord = ScreenToWorld(screenCoords, camera); GTA.Math.Vector3 vector31 = WorldCoord - position; vector31.Normalize(); res = World.Raycast(position + (vector31 * 1.0f), position + (vector31 * maxDist), (IntersectFlags)287, ignore); if (res.DidHit) { return(res.HitPosition); } return(position + (vector31 * failDist)); }
private static Vector3 ScreenRelToWorld(Matrix mView, Vector2 screenCoordsRel) { mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var d = 1 - vForward.W; var h = screenCoordsRel.X - vRight.W; var s = -screenCoordsRel.Y - vUpward.W; var m = new Matrix(vForward.X, vForward.Y, vForward.Z, 0, vRight.X, vRight.Y, vRight.Z, 0, vUpward.X, vUpward.Y, vUpward.Z, 0, 0, 0, 0, 1); var det = m.Determinant(); var mx = new Matrix(d, vForward.Y, vForward.Z, 0, h, vRight.Y, vRight.Z, 0, s, vUpward.Y, vUpward.Z, 0, 0, 0, 0, 1); var detx = mx.Determinant(); var my = new Matrix(vForward.X, d, vForward.Z, 0, vRight.X, h, vRight.Z, 0, vUpward.X, s, vUpward.Z, 0, 0, 0, 0, 1); var dety = my.Determinant(); var mz = new Matrix(vForward.X, vForward.Y, d, 0, vRight.X, vRight.Y, h, 0, vUpward.X, vUpward.Y, s, 0, 0, 0, 0, 1); var detz = mz.Determinant(); var epsilon = 0.0000001; return(Math.Abs(det) < epsilon ? new Vector3() : new Vector3(detx / det, dety / det, detz / det)); }
public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, bool skipProjection) { hitEntity = null; const float raycastToDist = 200.0f; const float raycastFromDist = 1f; const float defaultDist = 60.0f; Vector3 source3D; Vector3 target3D; ScreenRelToWorld(screenCoord, out source3D, out target3D); Entity ignoreEntity = Game.Player.Character; if (Game.Player.Character.IsInVehicle()) { ignoreEntity = Game.Player.Character.CurrentVehicle; } var dir = (target3D - source3D); dir.Normalize(); var raycastResults = World.Raycast(source3D + dir * raycastFromDist, source3D + dir * raycastToDist, (IntersectOptions)(1 | 16 | 256 | 2 | 4 | 8)// | peds + vehicles , ignoreEntity); if (raycastResults.DitHitAnything) { if (raycastResults.DitHitEntity) { hitEntity = raycastResults.HitEntity; } return(raycastResults.HitCoords); } return(source3D + dir * defaultDist); }
public static GTA.Math.Vector3 ScreenToWorld(GTA.Math.Vector2 screenCoords, Camera camera) { GTA.Math.Vector3 position = camera.Position; GTA.Math.Vector3 rotation = camera.Rotation; GTA.Math.Vector2 vector2; GTA.Math.Vector2 vector21; GTA.Math.Vector3 direction = camera.Direction; GTA.Math.Vector3 vector3 = rotation + new GTA.Math.Vector3(10.0f, 0.0f, 0.0f); GTA.Math.Vector3 vector31 = rotation + new GTA.Math.Vector3(-10.0f, 0.0f, 0.0f); GTA.Math.Vector3 vector32 = rotation + new GTA.Math.Vector3(0.0f, 0.0f, -10.0f); GTA.Math.Vector3 direction1 = RotationToDirection(rotation + new GTA.Math.Vector3(0.0f, 0.0f, 10.0f)) - RotationToDirection(vector32); GTA.Math.Vector3 direction2 = RotationToDirection(vector3) - RotationToDirection(vector31); float rad = -DegreeToRadian(rotation.Y); GTA.Math.Vector3 vector33 = GTA.Math.Vector3.Multiply(direction1, (float)Math.Cos(rad)) - GTA.Math.Vector3.Multiply(direction2, (float)Math.Sin(rad)); GTA.Math.Vector3 vector34 = GTA.Math.Vector3.Multiply(direction1, (float)Math.Sin(rad)) + GTA.Math.Vector3.Multiply(direction2, (float)Math.Cos(rad)); GTA.Math.Vector3 res1 = position + (direction * 10f); if (!WorldToScreenRel(res1, out vector21)) { return(res1); } if (!WorldToScreenRel(res1 + vector33 + vector34, out vector2)) { return(res1); } if (Math.Abs(vector2.X - vector21.X) < 0.001 || Math.Abs(vector2.Y - vector21.Y) < 0.001) { return(res1); } float x = (screenCoords.X - vector21.X) / (vector2.X - vector21.X); float y = (screenCoords.Y - vector21.Y) / (vector2.Y - vector21.Y); return(res1 + (vector33 * x) + (vector34 * y)); }
public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out Entity hitEntity) { var radius = 1; var numPoints = 5; var angleStep = Math.PI * 0.2; var distStep = 0.05 / numPoints; var resultCoord = new Vector3(); hitEntity = null; for (var i = 0; i < numPoints; i++) { var angle = i * angleStep; var dist = i * distStep; var offsetX = Math.Sin(angle) * dist; var offsetY = Math.Cos(angle) * dist; var coord = screenCoords + new Vector2((float)offsetX, (float)offsetY); Entity entity; var hitcoord = RaycastEverything(coord, out entity, radius); if (i == 0) { resultCoord = hitcoord; } if ((entity != null) && ((ScriptHookExtensions.IsEntityAPed(entity) && entity.Handle != Game.Player.Character.Handle) || (ScriptHookExtensions.IsEntityAVehicle(entity) && !(Game.Player.Character.IsInVehicle() && entity.Handle == Game.Player.Character.CurrentVehicle.Handle)))) { hitEntity = entity; resultCoord = hitcoord; break; } } return(resultCoord); }
public static Vehicle SearchVehicle(Vector2 screenCoords) { const double searchRange = 0.1; const double thresholdRange = 0.025; const float raycastToDist = 200.0f; var vehs = World.GetNearbyVehicles(Game.Player.Character.Position, raycastToDist); var mindist = Double.MaxValue; Vehicle foundVeh = null; //Util.Log("Vehs - " + vehs.Length); //Util.Log("V - " + DateTime.UtcNow.Ticks); foreach (var vehicle in vehs) { if (Game.Player.Character.IsInVehicle() && (vehicle.Handle == Game.Player.Character.CurrentVehicle.Handle)) continue; //you own veh if (!vehicle.IsAlive) continue; var vehOffset = vehicle.Position; Vector2 vehScreenCoords; if (!WorldToScreenRel(vehOffset, out vehScreenCoords)) continue; var dist = (screenCoords - vehScreenCoords).Length(); if (!(dist < mindist) || !(dist < searchRange)) continue; if (vehicle.IsOccluded) continue; //if (IsOccluded(vehicle, vehOffset)) continue; mindist = dist; foundVeh = vehicle; if (dist < thresholdRange) { break; } } //Util.Log("W - " + DateTime.UtcNow.Ticks); return foundVeh; }
public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, bool skipProjection) { Vector3 source3D; Vector3 target3D; ScreenRelToWorld(screenCoord, out source3D, out target3D); return RaycastEverything(out hitEntity, target3D, source3D); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = ScriptHookExtensions.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); }
public GTAVector2(Vector2 v) { X = v.X; Y = v.Y; }
private static Vector3 ScreenRelToWorld(Matrix mView, Vector2 screenCoordsRel) { mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var d = 1 - vForward.W; var h = screenCoordsRel.X - vRight.W; var s = -screenCoordsRel.Y - vUpward.W; var m = new Matrix(vForward.X, vForward.Y, vForward.Z, 0, vRight.X, vRight.Y, vRight.Z, 0, vUpward.X, vUpward.Y, vUpward.Z, 0, 0, 0, 0, 1); var det = m.Determinant(); var mx = new Matrix(d, vForward.Y, vForward.Z, 0, h, vRight.Y, vRight.Z, 0, s, vUpward.Y, vUpward.Z, 0, 0, 0, 0, 1); var detx = mx.Determinant(); var my = new Matrix(vForward.X, d, vForward.Z, 0, vRight.X, h, vRight.Z, 0, vUpward.X, s, vUpward.Z, 0, 0, 0, 0, 1); var dety = my.Determinant(); var mz = new Matrix(vForward.X, vForward.Y, d, 0, vRight.X, vRight.Y, h, 0, vUpward.X, vUpward.Y, s, 0, 0, 0, 0, 1); var detz = mz.Determinant(); var epsilon = 0.0000001; return Math.Abs(det) < epsilon ? new Vector3() : new Vector3(detx / det, dety / det, detz / det); }
public static Ped SearchPed(Vector2 screenCoords) { const double searchRange = 0.1; const double thresholdRange = 0.025; const float raycastToDist = 200.0f; var peds = World.GetNearbyPeds(Game.Player.Character.Position, raycastToDist); var mindist = Double.MaxValue; Ped foundPed = null; //Util.Log("Peds - " + peds.Length); //Util.Log("P - " + DateTime.UtcNow.Ticks); foreach (var ped in peds) { if (ped.Handle == Game.Player.Character.Handle) { continue; } //if (ped.IsOccluded) continue; slow? { var headOffest = ped.GetBoneCoord(Bone.SKEL_ROOT); Vector2 pedScreenCoords; if (WorldToScreenRel(headOffest, out pedScreenCoords)) { var dist = (screenCoords - pedScreenCoords).Length(); if ((dist < mindist) && (dist < searchRange)) { if (ped.IsOccluded) { continue; } //if (IsOccluded(ped, headOffest)) continue; mindist = dist; foundPed = ped; } if (dist < thresholdRange) { break; } } } { var headOffest = ped.GetBoneCoord(Bone.SKEL_Head); Vector2 pedScreenCoords; if (!WorldToScreenRel(headOffest, out pedScreenCoords)) { continue; } var dist = (screenCoords - pedScreenCoords).Length(); if (!(dist < mindist) || !(dist < searchRange)) { continue; } if (ped.IsOccluded) { continue; } //if (IsOccluded(ped, headOffest)) continue; mindist = dist; foundPed = ped; if (dist < thresholdRange) { break; } } } //Util.Log("Q - " + DateTime.UtcNow.Ticks); return(foundPed); }
public static string ConvertToString(this GTA.Math.Vector2 vec) { return(vec.X.ToString(CultureInfo.InvariantCulture) + "," + vec.Y.ToString(CultureInfo.InvariantCulture)); }
public static Ped SearchPed(Vector2 screenCoords) { const double searchRange = 0.1; const double thresholdRange = 0.025; const float raycastToDist = 200.0f; var peds = World.GetNearbyPeds(Game.Player.Character.Position, raycastToDist); var mindist = Double.MaxValue; Ped foundPed = null; //Util.Log("Peds - " + peds.Length); //Util.Log("P - " + DateTime.UtcNow.Ticks); foreach (var ped in peds) { if (ped.Handle == Game.Player.Character.Handle) continue; if (!ped.IsAlive) continue; //if (ped.IsOccluded) continue; slow? { var headOffest = ped.GetBoneCoord(Bone.SKEL_ROOT); Vector2 pedScreenCoords; if (WorldToScreenRel(headOffest, out pedScreenCoords)) { var dist = (screenCoords - pedScreenCoords).Length(); if ((dist < mindist) && (dist < searchRange)) { if (ped.IsOccluded) continue; //if (IsOccluded(ped, headOffest)) continue; mindist = dist; foundPed = ped; } if (dist < thresholdRange) { break; } } } { var headOffest = ped.GetBoneCoord(Bone.SKEL_Head); Vector2 pedScreenCoords; if (!WorldToScreenRel(headOffest, out pedScreenCoords)) continue; var dist = (screenCoords - pedScreenCoords).Length(); if (!(dist < mindist) || !(dist < searchRange)) continue; if (ped.IsOccluded) continue; //if (IsOccluded(ped, headOffest)) continue; mindist = dist; foundPed = ped; if (dist < thresholdRange) { break; } } } //Util.Log("Q - " + DateTime.UtcNow.Ticks); return foundPed; }
public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = ScriptHookExtensions.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0,0,0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return false; } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return true; }
public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords) { var num1 = new OutputArgument(); var num2 = new OutputArgument(); if (!Function.Call<bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2)) { screenCoords = new Vector2(); return false; } screenCoords = new Vector2((num1.GetResult<float>() - 0.5f) * 2, (num2.GetResult<float>() - 0.5f) * 2); return true; }