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(); }
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(); }
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; }
public abstract void CalculateIntersection(IntersectionInfo info);
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; }