public override double GetHitPointDistance(Shapes.Ray r) { double dist; Shapes.Ray subRay; Vect3 tmp = Position + _model.GetBoundingSphere().Position; if (RaySphere.IsRayOriginatingInSphere(r.Origin, r.Direction, tmp, _model.GetBoundingSphere().Radius)) { tmp = r.Origin - Position; subRay = new Shapes.Ray { Origin = tmp, Direction = r.Direction }; dist = 0; } else { dist = RaySphere.GetHitPointRaySphereDistance(r.Origin, r.Direction, tmp, _model.GetBoundingSphere().Radius); if (double.IsInfinity(dist)) { return(dist); } tmp = r.Origin + r.Direction * dist; tmp -= Position; subRay = new Shapes.Ray { Origin = tmp, Direction = r.Direction }; } var d = new CollisionData { Details = RayPath.GetFirstCollision(_model.GetTree(), subRay) }; if (!double.IsInfinity(d.Details.Distance)) { Vect3 hitPointLocal = subRay.Origin + subRay.Direction * d.Details.Distance; d.HitPointLocal = hitPointLocal; Vect3 hitPointGlobal = hitPointLocal + Position; d.HitPointGlobal = hitPointGlobal; return(d.Details.Distance + dist); } _lastCollision[Thread.CurrentThread] = d; return(d.Details.Distance); }
public void RegisterSphere(RaySphere s) { SphereData d = new SphereData(); d.col = new Vector3(s.renderColor.r, s.renderColor.g, s.renderColor.b); d.pos = (s.transform.position); //s.GetComponent<SphereCollider>().radius * (float)multiplier * d.details = new Vector3(s.transform.localScale.x / 2, s.shininess, s.specIntensity); spheres.Add(d); }
public override double GetHitPointDistance(Ray r) { return(RaySphere.GetHitPointRaySphereDistance(r.Origin, r.Direction, Position, Radius)); }