13 #pragma warning(disable : 4068)
16 #include <filament/Camera.h>
17 #include <filament/Engine.h>
18 #include <math/mat4.h>
22 #include <utils/EntityManager.h>
29 namespace visualization {
34 Camera::Transform::MatrixType m;
35 m << float(ft(0, 0)), float(ft(0, 1)), float(ft(0, 2)), float(ft(0, 3)),
36 float(ft(1, 0)), float(ft(1, 1)), float(ft(1, 2)), float(ft(1, 3)),
37 float(ft(2, 0)), float(ft(2, 1)), float(ft(2, 2)), float(ft(2, 3)),
38 float(ft(3, 0)), float(ft(3, 1)), float(ft(3, 2)), float(ft(3, 3));
44 Camera::Transform::MatrixType m;
46 m << ft(0, 0), ft(0, 1), ft(0, 2), ft(0, 3), ft(1, 0), ft(1, 1), ft(1, 2),
47 ft(1, 3), ft(2, 0), ft(2, 1), ft(2, 2), ft(2, 3), ft(3, 0),
48 ft(3, 1), ft(3, 2), ft(3, 3);
54 auto e_matrix = t.matrix();
55 return filament::math::mat4f(filament::math::mat4f::row_major_init{
56 e_matrix(0, 0), e_matrix(0, 1), e_matrix(0, 2), e_matrix(0, 3),
57 e_matrix(1, 0), e_matrix(1, 1), e_matrix(1, 2), e_matrix(1, 3),
58 e_matrix(2, 0), e_matrix(2, 1), e_matrix(2, 2), e_matrix(2, 3),
59 e_matrix(3, 0), e_matrix(3, 1), e_matrix(3, 2), e_matrix(3, 3)});
65 camera_entity_ = utils::EntityManager::get().create();
66 camera_ = engine_.createCamera(camera_entity_);
72 engine_.destroyCameraComponent(camera_entity_);
73 engine_.destroy(camera_entity_);
74 camera_entity_.clear();
82 SetProjection(proj.proj.ortho.projection, proj.proj.ortho.left,
83 proj.proj.ortho.right, proj.proj.ortho.bottom,
84 proj.proj.ortho.top, proj.proj.ortho.near_plane,
85 proj.proj.ortho.far_plane);
86 }
else if (proj.is_intrinsic) {
87 Eigen::Matrix3d intrinsic_matrix;
88 intrinsic_matrix.setIdentity();
89 intrinsic_matrix(0, 0) = proj.proj.intrinsics.fx;
90 intrinsic_matrix(1, 1) = proj.proj.intrinsics.fy;
91 intrinsic_matrix(0, 2) = proj.proj.intrinsics.cx;
92 intrinsic_matrix(1, 2) = proj.proj.intrinsics.cy;
93 SetProjection(intrinsic_matrix, proj.proj.intrinsics.near_plane,
94 proj.proj.intrinsics.far_plane,
95 proj.proj.intrinsics.width, proj.proj.intrinsics.height);
97 SetProjection(proj.proj.perspective.fov, proj.proj.perspective.aspect,
98 proj.proj.perspective.near_plane,
99 proj.proj.perspective.far_plane,
100 proj.proj.perspective.fov_type);
105 double fov,
double aspect,
double near,
double far,
FovType fov_type) {
108 ? filament::Camera::Fov::HORIZONTAL
109 : filament::Camera::Fov::VERTICAL;
111 camera_->setProjection(fov, aspect, near, far, dir);
130 filament::Camera::Projection proj =
132 ? filament::Camera::Projection::ORTHO
133 : filament::Camera::Projection::PERSPECTIVE;
135 camera_->setProjection(proj, left, right, bottom, top, near, far);
139 projection_.
proj.
ortho.projection = projection;
144 projection_.
proj.
ortho.near_plane = near;
153 filament::math::mat4 custom_proj;
154 custom_proj[0][0] = 2.0 * intrinsics(0, 0) /
width;
155 custom_proj[0][1] = 0.0;
156 custom_proj[0][2] = 0.0;
157 custom_proj[0][3] = 0.0;
159 custom_proj[1][0] = 0.0;
160 custom_proj[1][1] = 2.0 * intrinsics(1, 1) /
height;
161 custom_proj[1][2] = 0.0;
162 custom_proj[1][3] = 0.0;
164 custom_proj[2][0] = 1.0 - 2.0 * intrinsics(0, 2) /
width;
165 custom_proj[2][1] = -1.0 + 2.0 * intrinsics(1, 2) /
height;
166 custom_proj[2][2] = (-far - near) / (far - near);
167 custom_proj[2][3] = -1.0;
169 custom_proj[3][0] = 0.0;
170 custom_proj[3][1] = 0.0;
171 custom_proj[3][2] = -2.0 * far * near / (far - near);
172 custom_proj[3][3] = 0.0;
174 camera_->setCustomProjection(custom_proj, near, far);
202 return 180.0 / 3.141592 * fov_rad;
219 const Eigen::Vector3f& eye,
220 const Eigen::Vector3f& up) {
224 using namespace filament::math;
225 auto m = mat4f::lookAt(float3(eye.x(), eye.y(), eye.z()),
226 float3(center.x(), center.y(), center.z()),
227 float3(up.x(), up.y(), up.z()));
229 camera_->setModelMatrix(m);
233 auto cam_pos = camera_->getPosition();
234 return {cam_pos.x, cam_pos.y, cam_pos.z};
238 auto forward = camera_->getForwardVector();
239 return {forward.x, forward.y, forward.z};
243 auto left = camera_->getLeftVector();
244 return {left.x, left.y, left.z};
248 auto up = camera_->getUpVector();
249 return {up.x, up.y, up.z};
253 auto ftransform = camera_->getModelMatrix();
254 return FilamentToCameraTransform(ftransform);
258 auto ftransform = camera_->getViewMatrix();
259 return FilamentToCameraTransform(ftransform);
263 auto ft = camera_->getProjectionMatrix();
264 Camera::ProjectionMatrix::MatrixType proj;
265 proj << float(ft(0, 0)), float(ft(0, 1)), float(ft(0, 2)), float(ft(0, 3)),
266 float(ft(1, 0)), float(ft(1, 1)), float(ft(1, 2)), float(ft(1, 3)),
267 float(ft(2, 0)), float(ft(2, 1)), float(ft(2, 2)), float(ft(2, 3)),
268 float(ft(3, 0)), float(ft(3, 1)), float(ft(3, 2)), float(ft(3, 3));
274 camera_->getCullingProjectionMatrix();
275 return FilamentToCameraTransform(ftransform);
279 auto vtransform = camera_->getViewMatrix();
280 auto ptransform = camera_->getProjectionMatrix();
281 filament::math::float4 p(pt(0), pt(1), pt(2), 1.f);
282 auto clip_space_p = ptransform * vtransform * p;
283 filament::math::float2 ndc_space_p;
284 ndc_space_p.x = float(clip_space_p.x / clip_space_p.w);
285 ndc_space_p.y = float(clip_space_p.y / clip_space_p.w);
287 return {ndc_space_p.x, ndc_space_p.y};
292 if (z_buffer >= 1.0f) {
295 return -z_near / (1.0 - z_buffer);
304 const Eigen::Vector3f& left,
305 const Eigen::Vector3f& up) {
308 math::mat4f ftransform = camera_->getModelMatrix();
309 ftransform[0].xyz = math::float3(left.x(), left.y(), left.z());
310 ftransform[1].xyz = math::float3(up.x(), up.y(), up.z());
311 ftransform[2].xyz = math::float3(forward.x(), forward.y(), forward.z());
313 camera_->setModelMatrix(ftransform);
317 auto ftransform = CameraToFilamentTransformF(view);
318 camera_->setModelMatrix(ftransform);
322 float x,
float y,
float z,
float view_width,
float view_height)
const {
323 Eigen::Vector4f gl_pt(2.0f * x / view_width - 1.0f,
324 2.0f * y / view_height - 1.0f, 2.0f * z - 1.0f, 1.0f);
327 Eigen::Vector4f obj_pt = (proj *
GetViewMatrix()).inverse() * gl_pt;
328 return {obj_pt.x() / obj_pt.w(), obj_pt.y() / obj_pt.w(),
329 obj_pt.z() / obj_pt.w()};
virtual const ProjectionInfo & GetProjection() const =0
Eigen::Transform< float, 3, Eigen::Affine > Transform
virtual Transform GetModelMatrix() const =0
Eigen::Transform< float, 3, Eigen::Projective > ProjectionMatrix
Transform GetCullingProjectionMatrix() const override
ProjectionMatrix GetProjectionMatrix() const override
Transform GetViewMatrix() const override
const ProjectionInfo & GetProjection() const override
FovType GetFieldOfViewType() const override
only valid if fov was passed to SetProjection()
Eigen::Vector3f GetLeftVector() const override
void LookAt(const Eigen::Vector3f ¢er, const Eigen::Vector3f &eye, const Eigen::Vector3f &up) override
Eigen::Vector3f Unproject(float x, float y, float z, float view_width, float view_height) const override
Transform GetModelMatrix() const override
void SetModelMatrix(const Transform &view) override
void SetProjection(double fov, double aspect, double near, double far, FovType fov_type) override
FilamentCamera(filament::Engine &engine)
double GetViewZ(float z_buffer) const override
Eigen::Vector2f GetNDC(const Eigen::Vector3f &pt) const override
Eigen::Vector3f GetPosition() const override
Eigen::Vector3f GetForwardVector() const override
Eigen::Vector3f GetUpVector() const override
double GetFar() const override
double GetNear() const override
double GetFieldOfView() const override
only valid if fov was passed to SetProjection()
void CopyFrom(const Camera *camera) override
__device__ __forceinline__ float infinity()
Generic file read and write utility for python interface.
struct cloudViewer::visualization::rendering::Camera::ProjectionInfo::@23::@26 intrinsics
struct cloudViewer::visualization::rendering::Camera::ProjectionInfo::@23::@24 ortho
union cloudViewer::visualization::rendering::Camera::ProjectionInfo::@23 proj
struct cloudViewer::visualization::rendering::Camera::ProjectionInfo::@23::@25 perspective