14#include <lagrange/CameraTransforms.h>
15#include <lagrange/python/binding.h>
16#include <lagrange/utils/assert.h>
18namespace lagrange::python {
20namespace nb = nanobind;
22inline void bind_camera_transforms(nb::module_& m)
24 nb::class_<CameraTransforms>(
27 "View and projection matrices defining a camera in world space.")
31 [](
const CameraTransforms& self) -> Eigen::Matrix4f {
return self.view.matrix(); },
32 [](CameraTransforms& self,
33 std::variant<Eigen::Matrix4f, Eigen::Matrix<float, 3, 4>> mat_var) {
34 Eigen::Matrix4f full = Eigen::Matrix4f::Identity();
35 if (
auto* mat = std::get_if<Eigen::Matrix4f>(&mat_var)) {
37 (mat->row(3).array() == Eigen::RowVector4f(0.f, 0.f, 0.f, 1.f).array())
39 "Last row of 4x4 view matrix must be [0, 0, 0, 1]");
42 full.topRows<3>() = std::get<Eigen::Matrix<float, 3, 4>>(mat_var);
44 self.view = Eigen::Affine3f(full);
46 R
"(4×4 view transform (world space -> view space).
48Accepts a ``(4, 4)`` or ``(3, 4)`` numpy array:
50- ``(4, 4)``: full homogeneous matrix; last row must be ``[0, 0, 0, 1]``.
51- ``(3, 4)``: compact ``[R | t]`` form; the implicit last row ``[0, 0, 0, 1]`` is appended
54The getter always returns a ``(4, 4)`` numpy array.)")
57 [](
const CameraTransforms& self) -> Eigen::Matrix4f {
58 return self.projection.matrix();
60 [](CameraTransforms& self,
const Eigen::Matrix4f& mat) {
61 self.projection = Eigen::Projective3f(mat);
63 "4x4 projection transform (view space -> NDC space, depth in [-1, 1]).");
#define la_runtime_assert(...)
Runtime assertion check.
Definition assert.h:175