public override Vect3 GetNormalAt(Vect3 hitPoint) { Vect3 tmp = hitPoint - Position; Vect3 tmp2 = tmp.CrossProduct(LookAt); return(tmp.CrossProduct(tmp2).Normalize()); }
private Color GetTextureColorAt(Vect3 hitPoint) { // calculate x (longitude) Vect3 tmp = (hitPoint - Position).Normalize(); double y = System.Math.Acos(tmp * LookAt) / System.Math.PI; // project to equator plane double dist = -(tmp * LookAt); tmp = (tmp + LookAt * dist).Normalize(); double x = System.Math.Acos(tmp * RotVect) / (2 * System.Math.PI); tmp = tmp.CrossProduct(RotVect); if (tmp * LookAt < 0) { x = 0.5 + x; } else { x = 0.5 - x; } return(_texture.GetColorAt(x, y)); }
public override void Rotate(Matrix4 rotationMatrix) { EdgeV1V2 = VectMatrix.Multiply(EdgeV1V2, rotationMatrix); EdgeV1V3 = VectMatrix.Multiply(EdgeV1V3, rotationMatrix); LookAt = EdgeV1V2.CrossProduct(EdgeV1V3); }
public override bool Contains(Vect3 hitPoint) { Vect3 tmp = hitPoint - Position; Vect3 temp3 = EdgeV1V2.CrossProduct(EdgeV1V3); if (System.Math.Abs(temp3 * tmp) > Constants.EPS) { return(false); } double uu = EdgeV1V2 * EdgeV1V2; double uv = EdgeV1V2 * EdgeV1V3; double vv = EdgeV1V3 * EdgeV1V3; double wu = EdgeV1V2 * tmp; double wv = EdgeV1V3 * tmp; double d = uv * uv - uu * vv; double s = (uv * wv - vv * wu) / d; if (s < 0 || s > 1) { return(false); } double t = (uv * wu - uu * wv) / d; if (t < 0 || s + t > 1) { return(false); } return(true); }
public Triangle(Vect3 v1, Vect3 v2, Vect3 v3, Color color) : base(v1, new Vect3()) { Color = color; V2 = v2; V3 = v3; EdgeV1V2 = v2 - v1; EdgeV1V3 = v3 - v1; LookAt = EdgeV1V2.CrossProduct(EdgeV1V3).Normalize(); }
public Sphere(Vect3 position, Vect3 lookAt, double rotationRad, Color color) : base(position, lookAt) { Color = color; Radius = lookAt.Length(); // calculate the rotation of the 0-meridian RotVect = lookAt; // check so we don't end up with two linear dependent vectors if (System.Math.Abs(RotVect.Y) > Constants.EPS && System.Math.Abs(RotVect.X) < Constants.EPS && System.Math.Abs(RotVect.Z) < Constants.EPS) { RotVect.X += 1; } else { RotVect.Y += 1; } RotVect = RotVect.CrossProduct(lookAt).Normalize(); LookAt = LookAt.Normalize(); Rotate(lookAt, rotationRad); }