public (bool, float, float) intersect(Vec3f rayorig, Vec3f raydir) { float t0 = 0.0f; float t1 = 0.0f; Vec3f l = center - rayorig; float tca = l.dot(raydir); if (tca < 0) { return(false, t0, t1); } float d2 = l.dot(l) - tca * tca; if (d2 > radius2) { return(false, t0, t1); } float thc = (float)Math.Sqrt(radius2 - d2); t0 = tca - thc; t1 = tca + thc; return(true, t0, t1); }
public static Mat4f lookAtLH(Vec3f eye, Vec3f center, Vec3f up) { Vec3f f = (center - eye).normal(); Vec3f s = (f * up).normal(); Vec3f u = s * f; Mat4f Result = new Mat4f(); Result.data[0][0] = s.x; Result.data[1][0] = s.y; Result.data[2][0] = s.z; Result.data[0][1] = u.x; Result.data[1][1] = u.y; Result.data[2][1] = u.z; Result.data[0][2] = f.x; Result.data[1][2] = f.y; Result.data[2][2] = f.z; Result.data[3][0] = -(s.dot(eye)); Result.data[3][1] = -(u.dot(eye)); Result.data[3][2] = -(f.dot(eye)); return(Result); }