示例#1
0
        public override void CalculateIntersection(IntersectionInfo info)
        {
            Ray4 localRay = info.LocalRay;
            Vector4 point = localRay.Position + localRay.Direction * info.Distance;
            Vector3 baryCoord = info.BaryCoord;

            if (UseNormals())
            {
                Vector3 n = Na.Value * baryCoord.X + Nb.Value * baryCoord.Y + Nc.Value * baryCoord.Z;
                info.Normal = TransformNormalToCameraCoords(n);
            }
            else
            {
                info.Normal = TransformNormalToCameraCoords(_normal);
            }

            if (UseTexture())
            {
                Vector2 coord = Ta.Value*baryCoord.X+Tb.Value*baryCoord.Y+Tc.Value*baryCoord.Z;
                info.TexCoord = coord;
            }

            point = TransformPointToCameraCoords(point);
            info.IntersectionPoint = point.ToV3();
        }
示例#2
0
        public override void CalculateIntersection(IntersectionInfo info)
        {
            Ray4 localRay = info.LocalRay;
            Vector4 point = localRay.Position + localRay.Direction * info.Distance;

            Vector3 normal = point.ToV3() - Center;
            info.Normal = TransformNormalToCameraCoords(normal);

            point = TransformPointToCameraCoords(point);

            info.IntersectionPoint = point.ToV3();
        }
示例#3
0
        private Vector3 CalculateSurfaceColor(IntersectionInfo intersectionInfo, Ray ray)
        {
            Material material = intersectionInfo.Geomertry.Material;
            Vector3 diffuseColor = material.DiffuseColor.GetColor(intersectionInfo.TexCoord);
            Vector3 specularColor = material.SpecularColor;
            Vector3 emissionColor = material.EmissionColor;
            Vector3 ambientColor = material.AmbientColor;

            float shininess = material.Shininess;

            Vector3 lambert = Vector3.Zero;
            Vector3 specular = Vector3.Zero;

            Vector3 eyepos = ray.Position;
            Vector3 point = intersectionInfo.IntersectionPoint;

            Vector3 eyeDirection = eyepos - point;
            eyeDirection.Normalize();

            foreach (Light light in _scene.Lights)
            {
                Vector3 direction;
                float attenuation;
                float dist;

                light.Calculate(point, out direction, out dist, out attenuation);

                Vector3 half = (direction + eyeDirection);
                half.Normalize();

                if (CheckLight(intersectionInfo, direction, dist, light))
                {
                    Vector3 lightColor = light.Color/attenuation;

                    float nDotL = Vector3.Dot(intersectionInfo.Normal, direction);
                    float nDotH = Vector3.Dot(intersectionInfo.Normal, half);
                    lambert += diffuseColor*lightColor*Math.Max(nDotL, 0.0f);
                    specular += specularColor*lightColor*(float) Math.Pow(Math.Max(nDotH, 0.0f), shininess);
                }
            }

            Vector3 finalColor = ambientColor + emissionColor + lambert + specular;

            return finalColor;
        }
        public override void CalculateIntersection(IntersectionInfo info)
        {
            Ray localRay = info.OriginalRay;
            Vector3 point = localRay.Position + localRay.Direction*info.Distance;
            Vector3 baryCoord = info.BaryCoord;

            if (UseNormals())
            {
                Vector3 n = Na.Value*baryCoord.X + Nb.Value*baryCoord.Y + Nc.Value*baryCoord.Z;
                info.Normal = n;
            }
            else
            {
                info.Normal = _normal;
            }

            if (UseTexture())
            {
                Vector2 coord = Ta.Value*baryCoord.X + Tb.Value*baryCoord.Y + Tc.Value*baryCoord.Z;
                info.TexCoord = coord;
            }

            info.IntersectionPoint = point;
        }
示例#5
0
 public abstract void CalculateIntersection(IntersectionInfo info);
示例#6
0
        private bool CheckLight(IntersectionInfo intersection, Vector3 direction, float distanceToLight, Light light)
        {
            Vector3 point = intersection.IntersectionPoint;
            Ray ray = ShiftRay(point, direction);

            foreach (Geomertry geomertry in _scene.GetObjects(ray))
            {
                IntersectionInfo intersectionInfo = geomertry.Intersect(ray);
                if (intersectionInfo != null)
                {
                    if (light is PointLight && intersectionInfo.Distance < distanceToLight)
                        return false;

                    if (light is DirectionalLight)
                        return false;
                }
            }

            return true;
        }