public static Matrix ViewMatrix(Matrix M) { Vector3 CameraPosition = new Vector3(M[0, 0], M[1, 0], M[2, 0]); Vector3 CameraTarget = new Vector3(M[0, 1], M[1, 1], M[2, 1]); Vector3 UpVector = new Vector3(M[0, 2], M[1, 2], M[2, 2]); UpVector = UpVector.ToVersor(); Vector3 ZAxis = CameraPosition - CameraTarget; ZAxis = ZAxis.ToVersor(); Vector3 XAxis = Vector3.CrossProduct(UpVector, ZAxis); XAxis = XAxis.ToVersor(); Vector3 YAxis = Vector3.CrossProduct(ZAxis, XAxis); return(new Matrix(new double[, ] { { XAxis.first, XAxis.second, XAxis.third, 0 }, { YAxis.first, YAxis.second, YAxis.third, 0 }, { -ZAxis.first, -ZAxis.second, -ZAxis.third, 0 }, { -Vector3.DotProduct(XAxis, CameraPosition), -Vector3.DotProduct(YAxis, CameraPosition), Vector3.DotProduct(ZAxis, CameraPosition), 1 } })); }
public static double DotProduct(Vector3 ver, Vector3 normal, Vector3 light) { Vector3 lightDirection = light - ver; return(Math.Max(0, DotProduct(normal, lightDirection.ToVersor()))); }
public double IsAtPoint(int colorNumber, double ks, Vector3 Normal, Vector3 WorldCoordinates, Vector3 lightSource, Vector3 lightColor, Vector3 camera, int n) { Vector3 viewDirectionAtPoint = camera - WorldCoordinates; if (isblinn) { Vector3 LV = lightSource - WorldCoordinates + viewDirectionAtPoint; Vector3 H = LV / Math.Sqrt(LV.first * LV.first + LV.second * LV.second + LV.third * LV.third); return(lightColor[colorNumber] * ks *Math.Pow(Math.Max(Vector3.DotProduct(Normal, H.ToVersor()), 0), n)); } else { Vector3 lightDirectionAtPoint = (lightSource - WorldCoordinates).ToVersor(); double NL = Vector3.DotProduct(lightDirectionAtPoint, Normal); Vector3 R = ((2 * NL) * Normal) - lightDirectionAtPoint; return(lightColor[colorNumber] * ks *Math.Pow(Math.Max(Vector3.DotProduct(R.ToVersor(), viewDirectionAtPoint.ToVersor()), 0), n)); } }