candlewick 0.1.0
A renderer
Loading...
Searching...
No Matches
Camera.h
Go to the documentation of this file.
1#pragma once
2
3#include "Core.h"
4#include "math_types.h"
5
6#include <Eigen/Geometry>
7
8namespace candlewick {
9
10namespace math {
11 inline Mat3f computeNormalMatrix(const Eigen::Affine3f &M) {
12 return M.inverse().linear().transpose();
13 }
14} // namespace math
15
17
19struct Camera {
23 Eigen::Isometry3f view;
24
27 Eigen::Isometry3f pose() const { return view.inverse(); }
28 Float3 position() const { return pose().translation(); }
29
31 auto viewProj() const { return projection * view.matrix(); }
32
35 Float3 transformVector(const Float3 &v) const { return view.linear() * v; }
36
39 Float3 transformPoint(const Float3 &p) const { return view * p; }
40
44
45 Float3 right() const { return view.linear().row(0); }
46 auto right() { return view.linear().row(0); }
47 Float3 up() const { return view.linear().row(1); }
48 auto up() { return view.linear().row(1); }
49 Float3 forward() const { return -view.linear().row(2); }
50
52};
53
57
60Mat4f lookAt(const Float3 &eye, const Float3 &center,
61 const Float3 &up = Float3::UnitZ());
62
65Mat4f perspectiveMatrix(float left, float right, float bottom, float top,
66 float near, float far);
67
75Mat4f perspectiveFromFov(Radf fovY, float aspectRatio, float nearZ, float farZ);
76
85Mat4f orthographicMatrix(const Float2 &sizes, float nearZ, float farZ);
86
88Mat4f orthographicMatrix(float left, float right, float bottom, float top,
89 float near, float far);
90
91inline float orthoProjNear(const Mat4f &proj) {
92 return (proj(2, 2) + 1.0f) / proj(2, 2);
93}
94
95inline float orthoProjFar(const Mat4f &proj) {
96 return (proj(2, 3) - 1.0f) / proj(2, 2);
97}
98
99inline float perspectiveProjNear(const Mat4f &proj) {
100 return proj(2, 3) / (proj(2, 2) - 1.f);
101}
102
103inline float perspectiveProjFar(const Mat4f &proj) {
104 return std::abs(proj(2, 3) / (proj(2, 2) + 1.f));
105}
106
110 auto invProj = camProj.inverse();
112 for (Uint8 i = 0; i < 8; i++) {
113 Uint8 j = i & 1;
114 Uint8 k = (i >> 1) & 1;
115 Uint8 l = (i >> 2) & 1;
116 assert(j <= 1);
117 assert(k <= 1);
118 assert(l <= 1);
119
120 Float4 ndc{2.f * j - 1.f, 2.f * k - 1.f, 2.f * l - 1.f, 1.f};
121 Float4 viewSpace = invProj * ndc;
122 out[i] = viewSpace.head<3>() / viewSpace.w();
123 }
124 return out;
125}
126
129 return frustumFromCameraProjection(camera.viewProj());
130}
131
132inline std::pair<Float3, float>
134 Float3 frustumCenter = Float3::Zero();
135 for (auto &c : worldSpaceCorners) {
136 frustumCenter += c;
137 }
138 frustumCenter /= 8.f;
139
140 float radius = 0.f;
141 for (auto &c : worldSpaceCorners) {
142 radius = std::max(radius, (c - frustumCenter).norm());
143 }
144 return {frustumCenter, radius};
145}
146
148
149} // namespace candlewick
Rad< float > Radf
Definition math_types.h:125
Definition Camera.h:10
Mat3f computeNormalMatrix(const Eigen::Affine3f &M)
Definition Camera.h:11
Definition Camera.h:8
Eigen::Vector3f Float3
Definition math_types.h:8
Mat4f orthographicMatrix(const Float2 &sizes, float nearZ, float farZ)
Compute a centered orthographic projection matrix.
float orthoProjFar(const Mat4f &proj)
Definition Camera.h:95
float perspectiveProjNear(const Mat4f &proj)
Definition Camera.h:99
FrustumCornersType frustumFromCameraProjection(const Mat4f &camProj)
Extract the array of frustum corners, given a camera projection matrix.
Definition Camera.h:109
Mat4f perspectiveFromFov(Radf fovY, float aspectRatio, float nearZ, float farZ)
Get perspective projection matrix given fov, aspect ratio, and clipping planes.
Eigen::Matrix3f Mat3f
Definition math_types.h:10
CameraProjection
Definition Camera.h:16
@ ORTHOGRAPHIC
Definition Camera.h:16
@ PERSPECTIVE
Definition Camera.h:16
float orthoProjNear(const Mat4f &proj)
Definition Camera.h:91
float perspectiveProjFar(const Mat4f &proj)
Definition Camera.h:103
FrustumCornersType frustumFromCamera(const Camera &camera)
Get the corners of a Camera's view frustum, in world space.
Definition Camera.h:128
Mat4f lookAt(const Float3 &eye, const Float3 &center, const Float3 &up=Float3::UnitZ())
Eigen::Vector4f Float4
Definition math_types.h:9
std::pair< Float3, float > frustumBoundingSphereCenterRadius(const FrustumCornersType &worldSpaceCorners)
Definition Camera.h:133
std::array< Float3, 8ul > FrustumCornersType
Definition math_types.h:15
Eigen::Vector2f Float2
Definition math_types.h:7
Eigen::Matrix4f Mat4f
Definition math_types.h:11
Mat4f perspectiveMatrix(float left, float right, float bottom, float top, float near, float far)
Compute perspective projection matrix, from clipping plane parameters (left, right,...
The main way of using a camera to render things.
Definition Camera.h:19
Float3 right() const
Definition Camera.h:45
auto right()
Definition Camera.h:46
Float3 up() const
Definition Camera.h:47
Float3 position() const
Definition Camera.h:28
Mat4f projection
Projection matrix .
Definition Camera.h:21
Eigen::Isometry3f pose() const
Definition Camera.h:27
Float3 transformPoint(const Float3 &p) const
Transform a point to view-space. This applies the view matrix as a 3D transform.
Definition Camera.h:39
auto up()
Definition Camera.h:48
auto viewProj() const
View-projection matrix .
Definition Camera.h:31
Float3 transformVector(const Float3 &v) const
Transform a vector to view-space. This applies the view matrix linear part.
Definition Camera.h:35
Float3 forward() const
Definition Camera.h:49
Eigen::Isometry3f view
Camera view matrix
Definition Camera.h:23