public Camera(Camera camera, Vec3 movement, Vec3 turn) { this.width = camera.width; this.height = camera.height; this.maxBounces = camera.maxBounces; Vector4 temp = camera.lookAt - camera.origin; if (turn.y != 0) { temp += Vector4.Transform(temp, Matrix4x4.CreateFromAxisAngle(Vec3.cross(Vec3.cross(camera.up, (camera.lookAt - camera.origin)), (camera.lookAt - camera.origin)), (float)turn.y)); } if (turn.x != 0) { temp += Vector4.Transform(temp, Matrix4x4.CreateFromAxisAngle(Vec3.cross(camera.up, (camera.lookAt - camera.origin)), (float)turn.x)); } lookAt = camera.origin + Vec3.unitVector(temp); this.origin = camera.origin + movement; this.lookAt += movement; this.up = camera.up; axis = OrthoNormalBasis.fromZY(Vec3.unitVector(lookAt - origin), up); aspectRatio = ((float)width / (float)height); cameraPlaneDist = 1.0f / XMath.Tan(camera.verticalFov * XMath.PI / 360.0f); this.verticalFov = camera.verticalFov; reciprocalHeight = 1.0f / height; reciprocalWidth = 1.0f / width; }
public Camera(Vec3 origin, Vec3 lookAt, Vec3 up, int width, int height, float verticalFov) { this.width = new SpecializedValue <int>(width); this.height = new SpecializedValue <int>(height); this.verticalFov = verticalFov; this.origin = origin; this.lookAt = lookAt; this.up = up; axis = OrthoNormalBasis.fromZY(Vec3.unitVector(lookAt - origin), up); aspectRatio = ((float)width / (float)height); cameraPlaneDist = 1.0f / XMath.Tan(verticalFov * XMath.PI / 360.0f); reciprocalHeight = 1.0f / height; reciprocalWidth = 1.0f / width; }