static public RaycastHit CastGetHit(this Ray item, float max_distance = float.PositiveInfinity, int layer_mask = IntBits.ALL_BITS) { RaycastHit hit; item.Cast(out hit, max_distance, layer_mask); return(hit); }
public void Cast(Vector3 dir, float angle, float dist) { Reset(); if (VSL.refT == null) { return; } //cast the rays var side = Vector3.Cross(VSL.Physics.Up, dir) * VSL.Geometry.R * 1.5f; var cast_dir = Quaternion.AngleAxis(angle, side) * dir; Valid |= L.Cast(VSL.Physics.wCoM - side, cast_dir, dist, VSL.Geometry.R); Valid |= C.Cast(VSL.Physics.wCoM, cast_dir, dist, VSL.Geometry.R); Valid |= R.Cast(VSL.Physics.wCoM + side, cast_dir, dist, VSL.Geometry.R); if (Valid) { L.ClaculateAltitude(dir, angle); C.ClaculateAltitude(dir, angle); R.ClaculateAltitude(dir, angle); Altitude = VSL.Altitude.Absolute - Mathf.Min(L.Altitude, C.Altitude, R.Altitude); Ray ray; if (L.Valid && !R.Valid) { ray = L; Maneuver = ManeuverType.Horizontal; } else if (!L.Valid && R.Valid) { ray = R; Maneuver = ManeuverType.Horizontal; } else if (C.Valid) { ray = C; Maneuver = ManeuverType.Vertical; } else if (L.Valid && R.Valid) { ray = R.Distance < L.Distance? R : L; Maneuver = ManeuverType.Vertical; } else { VSL.Log("Unknown ManevuerType of a Valid Sweep. This should never happen."); return; } Obstacle = new TerrainPoint(Altitude, ray.CollisionPoint); } }
public void TestCast() { Ray ray1 = new Ray(Vec3.Zero, Vec3.K); // Ray pointing up Ray ray2 = new Ray(Vec3.Zero, -Vec3.K); // Ray pointing down //Triangle floating above the rays Triangle tri = new Triangle( new Vec3(-1, -1, 1), new Vec3(0, 1, 1), new Vec3(1, -1, 1) ); Vec3 hit1; Vec3 hit2; Assert.AreEqual(true, ray1.Cast(tri, out hit1)); Assert.AreEqual(new Vec3(0, 0, 1), hit1); Assert.AreEqual(false, ray2.Cast(tri, out hit2)); }
public Color RenderPixel(int x, int y) { var pixelPosition = new Vector3D(x, y, 0); var transformedPixelPosition = _scene.Camera.Transform.TransformationMatrix.TransformVector(pixelPosition); Ray pixelRay = new Ray(transformedPixelPosition, _scene.Camera.Transform.Forward, _length); pixelRay.Cast(_scene); if (pixelRay.CollisionVectors.Count == 1) { return(Colors.Black); } else if (pixelRay.CollisionVectors.Count > 1) { return(_ambientColor); } //TODO: Add more color logics return(_ambientColor); }