void BlenderSync::sync_camera_motion(BL::RenderSettings& b_render, BL::Object& b_ob, int width, int height, float motion_time) { if(!b_ob) return; Camera *cam = scene->camera; BL::Array<float, 16> b_ob_matrix; b_engine.camera_model_matrix(b_ob, b_ob_matrix); Transform tfm = get_transform(b_ob_matrix); tfm = blender_camera_matrix(tfm, cam->type, cam->panorama_type); if(tfm != cam->matrix) { VLOG(1) << "Camera " << b_ob.name() << " motion detected."; if(motion_time == -1.0f) { cam->motion.pre = tfm; cam->use_motion = true; } else if(motion_time == 1.0f) { cam->motion.post = tfm; cam->use_motion = true; } } if(cam->type == CAMERA_PERSPECTIVE) { BlenderCamera bcam; float aspectratio, sensor_size; blender_camera_init(&bcam, b_render); blender_camera_from_object(&bcam, b_engine, b_ob); blender_camera_viewplane(&bcam, width, height, NULL, &aspectratio, &sensor_size); /* TODO(sergey): De-duplicate calculation with camera sync. */ float fov = 2.0f * atanf((0.5f * sensor_size) / bcam.lens / aspectratio); if(fov != cam->fov) { VLOG(1) << "Camera " << b_ob.name() << " FOV change detected."; if(motion_time == -1.0f) { cam->fov_pre = fov; cam->use_perspective_motion = true; } else if(motion_time == 1.0f) { cam->fov_post = fov; cam->use_perspective_motion = true; } } } }
void BlenderSync::sync_camera_motion(BL::Object b_ob, int motion) { Camera *cam = scene->camera; Transform tfm = get_transform(b_ob.matrix_world()); tfm = blender_camera_matrix(tfm, cam->type); if(tfm != cam->matrix) { if(motion == -1) cam->motion.pre = tfm; else cam->motion.post = tfm; cam->use_motion = true; } }
void BlenderSync::sync_camera_motion(BL::Object b_ob, float motion_time) { Camera *cam = scene->camera; BL::Array<float, 16> b_ob_matrix; b_engine.camera_model_matrix(b_ob, b_ob_matrix); Transform tfm = get_transform(b_ob_matrix); tfm = blender_camera_matrix(tfm, cam->type); if(tfm != cam->matrix) { VLOG(1) << "Camera " << b_ob.name() << " motion detected."; if(motion_time == -1.0f) { cam->motion.pre = tfm; cam->use_motion = true; } else if(motion_time == 1.0f) { cam->motion.post = tfm; cam->use_motion = true; } } }
static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height) { /* copy camera to compare later */ Camera prevcam = *cam; float aspectratio, sensor_size; /* viewplane */ blender_camera_viewplane(bcam, width, height, &cam->viewplane, &aspectratio, &sensor_size); /* panorama sensor */ if(bcam->type == CAMERA_PANORAMA && bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID) { float fit_xratio = (float)bcam->full_width*bcam->pixelaspect.x; float fit_yratio = (float)bcam->full_height*bcam->pixelaspect.y; bool horizontal_fit; float sensor_size; if(bcam->sensor_fit == BlenderCamera::AUTO) { horizontal_fit = (fit_xratio > fit_yratio); sensor_size = bcam->sensor_width; } else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) { horizontal_fit = true; sensor_size = bcam->sensor_width; } else { /* vertical */ horizontal_fit = false; sensor_size = bcam->sensor_height; } if(horizontal_fit) { cam->sensorwidth = sensor_size; cam->sensorheight = sensor_size * fit_yratio / fit_xratio; } else { cam->sensorwidth = sensor_size * fit_xratio / fit_yratio; cam->sensorheight = sensor_size; } } /* clipping distances */ cam->nearclip = bcam->nearclip; cam->farclip = bcam->farclip; /* type */ cam->type = bcam->type; /* panorama */ cam->panorama_type = bcam->panorama_type; cam->fisheye_fov = bcam->fisheye_fov; cam->fisheye_lens = bcam->fisheye_lens; cam->latitude_min = bcam->latitude_min; cam->latitude_max = bcam->latitude_max; cam->longitude_min = bcam->longitude_min; cam->longitude_max = bcam->longitude_max; /* anamorphic lens bokeh */ cam->aperture_ratio = bcam->aperture_ratio; /* perspective */ cam->fov = 2.0f * atanf((0.5f * sensor_size) / bcam->lens / aspectratio); cam->focaldistance = bcam->focaldistance; cam->aperturesize = bcam->aperturesize; cam->blades = bcam->apertureblades; cam->bladesrotation = bcam->aperturerotation; /* transform */ cam->matrix = blender_camera_matrix(bcam->matrix, bcam->type, bcam->panorama_type); cam->motion.pre = cam->matrix; cam->motion.post = cam->matrix; cam->use_motion = false; cam->use_perspective_motion = false; cam->shuttertime = bcam->shuttertime; cam->fov_pre = cam->fov; cam->fov_post = cam->fov; cam->motion_position = bcam->motion_position; cam->rolling_shutter_type = bcam->rolling_shutter_type; cam->rolling_shutter_duration = bcam->rolling_shutter_duration; memcpy(cam->shutter_curve, bcam->shutter_curve, sizeof(cam->shutter_curve)); /* border */ cam->border = bcam->border; cam->viewport_camera_border = bcam->viewport_camera_border; /* set update flag */ if(cam->modified(prevcam)) cam->tag_update(); }