示例#1
0
文件: Cone.cs 项目: FrankyBoy/JRayX
        public override Vect3 GetNormalAt(Vect3 hitPoint)
        {
            Vect3 tmp = hitPoint - Position;

            Vect3 tmp2 = tmp.CrossProduct(LookAt);

            return(tmp.CrossProduct(tmp2).Normalize());
        }
示例#2
0
        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));
        }
示例#3
0
        public override void Rotate(Matrix4 rotationMatrix)
        {
            EdgeV1V2 = VectMatrix.Multiply(EdgeV1V2, rotationMatrix);
            EdgeV1V3 = VectMatrix.Multiply(EdgeV1V3, rotationMatrix);

            LookAt = EdgeV1V2.CrossProduct(EdgeV1V3);
        }
示例#4
0
        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);
        }
示例#5
0
        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();
        }
示例#6
0
        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);
        }