diff options
author | Michael A. Kowalski <makowalski@nvidia.com> | 2020-11-14 01:48:54 +0300 |
---|---|---|
committer | Michael A. Kowalski <makowalski@nvidia.com> | 2020-11-14 01:48:54 +0300 |
commit | 46276c711033bc1c270ed36e296cc61a7166bd9d (patch) | |
tree | ad017ce734183c76977c0a77bfba5980508b9c7f | |
parent | b0ec5c72e626935ca562c1fa900d608bb59a08d4 (diff) |
USDReaderCamera implementation.
Finished first pass of camera import. Added
support for orthographic cameras. Adjusting
camera rotation when converting from y-up
to z-up. USDXformableReader::read_matrix()
is now virtual.
4 files changed, 26 insertions, 8 deletions
diff --git a/source/blender/io/usd/import/usd_reader_camera.cc b/source/blender/io/usd/import/usd_reader_camera.cc index 092021137e7..6ad2b55dcb0 100644 --- a/source/blender/io/usd/import/usd_reader_camera.cc +++ b/source/blender/io/usd/import/usd_reader_camera.cc @@ -25,6 +25,10 @@ #include "BKE_camera.h" #include "BKE_object.h" +#include "BLI_math_base.h" +#include "BLI_math_matrix.h" +#include "BLI_math_rotation.h" + #include <iostream> namespace blender::io::usd { @@ -84,6 +88,8 @@ void USDCameraReader::create_object(Main *bmain, double time) const float v_film_offset = usd_cam.GetVerticalApertureOffset(); const float film_aspect = apperture_x / apperture_y; + bcam->type = usd_cam.GetProjection() == pxr::GfCamera::Perspective ? CAM_PERSP : CAM_ORTHO; + bcam->lens = usd_cam.GetFocalLength(); bcam->sensor_x = apperture_x; @@ -102,4 +108,19 @@ void USDCameraReader::create_object(Main *bmain, double time) this->object_->data = bcam; } +void USDCameraReader::read_matrix(float r_mat[4][4] /* local matrix */, + const double time, + const float scale) const +{ + USDXformableReader::read_matrix(r_mat, time, scale); + + /* Conveting from y-up to z-up requires adjusting + * the camera rotation. */ + if (this->context_.stage_up_axis == pxr::UsdGeomTokens->y) { + float camera_rotation[4][4]; + axis_angle_to_mat4_single(camera_rotation, 'X', M_PI_2); + mul_m4_m4m4(r_mat, r_mat, camera_rotation); + } +} + } // namespace blender::io::usd diff --git a/source/blender/io/usd/import/usd_reader_camera.h b/source/blender/io/usd/import/usd_reader_camera.h index 194fd5909d3..26614f86d28 100644 --- a/source/blender/io/usd/import/usd_reader_camera.h +++ b/source/blender/io/usd/import/usd_reader_camera.h @@ -36,6 +36,8 @@ class USDCameraReader : public USDXformableReader { bool valid() const override; void create_object(Main *bmain, double time) override; + + void read_matrix(float r_mat[4][4], const double time, const float scale) const override; }; } // namespace blender::io::usd diff --git a/source/blender/io/usd/import/usd_reader_xformable.cc b/source/blender/io/usd/import/usd_reader_xformable.cc index af5cb3558e3..f39abf802d4 100644 --- a/source/blender/io/usd/import/usd_reader_xformable.cc +++ b/source/blender/io/usd/import/usd_reader_xformable.cc @@ -57,10 +57,9 @@ void USDXformableReader::set_object_transform(const double time) return; } - bool is_constant = false; float transform_from_usd[4][4]; - this->read_matrix(transform_from_usd, time, this->context_.import_params.scale, is_constant); + this->read_matrix(transform_from_usd, time, this->context_.import_params.scale); /* Apply the matrix to the object. */ BKE_object_apply_mat4(object_, transform_from_usd, true, false); @@ -71,19 +70,15 @@ void USDXformableReader::set_object_transform(const double time) void USDXformableReader::read_matrix(float r_mat[4][4] /* local matrix */, const double time, - const float scale, - bool &is_constant) + const float scale) const { pxr::UsdGeomXformable xformable(prim_); if (!xformable) { unit_m4(r_mat); - is_constant = true; return; } - /* TODO(makowalski): Check for constant transform. */ - pxr::GfMatrix4d usd_local_xf; bool reset_xform_stack; xformable.GetLocalTransformation(&usd_local_xf, &reset_xform_stack, time); diff --git a/source/blender/io/usd/import/usd_reader_xformable.h b/source/blender/io/usd/import/usd_reader_xformable.h index 8e8cecacc0e..3f3503dcfda 100644 --- a/source/blender/io/usd/import/usd_reader_xformable.h +++ b/source/blender/io/usd/import/usd_reader_xformable.h @@ -91,7 +91,7 @@ class USDXformableReader : public USDPrimReader { void set_object_transform(const double time); - void read_matrix(float r_mat[4][4], const double time, const float scale, bool &is_constant); + virtual void read_matrix(float r_mat[4][4], const double time, const float scale) const; }; } /* namespace blender::io::usd */ |