static void motion(int x, int y) { float dx, dy; dx = (float) (x - last_x) / width; dy = (float) (y - last_y) / height; if (cur_op == ROTATING) { y_rot -= dx * 360.0f; x_rot -= dy * 360.0f; } else if (cur_op == PANNING) { float lx, ly; vector x, y, z; ly = 2.0f * focal_len * tanf(radians(fovy / 2.0f)); lx = ly * width / height; get_camera_frame(x, y, z); vec_mad(center, -dx * lx, x); vec_mad(center, dy * ly, y); } else if (cur_op == ZOOMING) { focal_len *= (1.0f - dy) - dx; } last_x = x; last_y = y; }
static void get_camera(vector eye, vector at, vector up) { vector x, y, z; get_camera_frame(x, y, z); vec_copy(at, center); vec_copy(eye, center); vec_mad(eye, focal_len, z); vec_copy(up, y); }
int main() { camera_open(); camera_update(); graphics_open(get_camera_width(), get_camera_height()); while(!get_key_state('Q')) { camera_update(); graphics_blit_enc(get_camera_frame(), BGR, 0, 0, get_camera_width(), get_camera_height()); graphics_circle_fill(get_camera_width() / 2, get_camera_height() / 2, get_camera_height() / 20, 255, 0, 0); graphics_update(); } camera_close(); graphics_close(); return 0; }