From 8afc9c1e7d1a38e819ea4b4d16faa3cd3539f6c4 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Wed, 28 Mar 2018 17:56:09 +0200 Subject: Fix Collada: broken tangents with Camera Animation import for xfov When importing an xfov curve, we must transformed the data to Lens opening angles in degrees. While the curve value itself is correctly transformed, the transformation of the tangents has been forgotten. this is fixed now. --- source/blender/collada/AnimationImporter.cpp | 19 +++++++++++-------- source/blender/collada/AnimationImporter.h | 2 ++ 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp index f7ea8342eae..6ae82ddd836 100644 --- a/source/blender/collada/AnimationImporter.cpp +++ b/source/blender/collada/AnimationImporter.cpp @@ -109,7 +109,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) fcu->flag = (FCURVE_VISIBLE | FCURVE_AUTO_HANDLES | FCURVE_SELECTED); // fcu->rna_path = BLI_strdupn(path, strlen(path)); fcu->array_index = 0; - fcu->totvert = curve->getKeyCount(); + //fcu->totvert = curve->getKeyCount(); // create beztriple for each key for (unsigned int j = 0; j < curve->getKeyCount(); j++) { @@ -669,6 +669,13 @@ void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& list } +float AnimationImporter::convert_to_focal_length(float in_xfov, int fov_type, float aspect, float sensorx) +{ + // NOTE: Needs more testing (As we curretnly have no official test data for this) + float xfov = (fov_type == CAMERA_YFOV) ? (2.0f * atanf(aspect * tanf(DEG2RADF(in_xfov) * 0.5f))) : DEG2RADF(in_xfov); + return fov_to_focallength(xfov, sensorx); +} + /* * Lens animations must be stored in COLLADA by using FOV, * while blender internally uses focal length. @@ -698,13 +705,9 @@ void AnimationImporter::Assign_lens_animations(const COLLADAFW::UniqueId& listid FCurve *fcu = *iter; for (unsigned int i = 0; i < fcu->totvert; i++) { - - double input_fov = fcu->bezt[i].vec[1][1]; - - // NOTE: Needs more testing (As we curretnly have no official test data for this) - double xfov = (fov_type == CAMERA_YFOV) ? (2.0f * atanf(aspect * tanf(DEG2RADF(input_fov) * 0.5f))) : DEG2RADF(input_fov); - - fcu->bezt[i].vec[1][1] = fov_to_focallength(xfov, cam->sensor_x); + fcu->bezt[i].vec[0][1] = convert_to_focal_length(fcu->bezt[i].vec[0][1], fov_type, aspect, cam->sensor_x); + fcu->bezt[i].vec[1][1] = convert_to_focal_length(fcu->bezt[i].vec[1][1], fov_type, aspect, cam->sensor_x); + fcu->bezt[i].vec[2][1] = convert_to_focal_length(fcu->bezt[i].vec[2][1], fov_type, aspect, cam->sensor_x); } BLI_addtail(AnimCurves, fcu); diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h index 7dc4131dd69..1f2de2f3162 100644 --- a/source/blender/collada/AnimationImporter.h +++ b/source/blender/collada/AnimationImporter.h @@ -202,6 +202,8 @@ public: // gives a world-space mat, end's mat not included bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end); + float convert_to_focal_length(float in_xfov, int fov_type, float aspect, float sensorx); + #ifdef ARMATURE_TEST Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job); #endif -- cgit v1.2.3