SPH
Camera.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "gui/objects/Point.h"
9 #include "math/AffineMatrix.h"
12 
14 
15 class Storage;
16 
17 class ITracker : public Polymorphic {
18 public:
19  // position and velocity
20  virtual Pair<Vector> getTrackedPoint(const Storage& storage) const = 0;
21 };
22 
23 class ParticleTracker : public ITracker {
24 private:
25  Size index;
26 
27 public:
28  explicit ParticleTracker(const Size index)
29  : index(index) {}
30 
31  virtual Pair<Vector> getTrackedPoint(const Storage& storage) const override;
32 };
33 
34 class MedianTracker : public ITracker {
35 private:
36  Vector offset;
37 
38 public:
39  explicit MedianTracker(const Vector& offset)
40  : offset(offset) {}
41 
42  virtual Pair<Vector> getTrackedPoint(const Storage& storage) const override;
43 };
44 
47 
50 
52  float radius;
53 };
54 
56 struct CameraRay {
59 };
60 
62 class ICamera : public Polymorphic {
63 public:
65  virtual void autoSetup(const Storage& storage) = 0;
66 
70  virtual Optional<ProjectedPoint> project(const Vector& r) const = 0;
71 
73  virtual Optional<CameraRay> unproject(const Coords& coords) const = 0;
74 
76  virtual Pixel getSize() const = 0;
77 
82  virtual AffineMatrix getFrame() const = 0;
83 
85  virtual Vector getTarget() const = 0;
86 
88  virtual Vector getUpVector() const = 0;
89 
95  virtual Optional<float> getCutoff() const = 0;
96 
98  virtual Optional<float> getWorldToPixel() const = 0;
99 
103  virtual void setCutoff(const Optional<float> newCutoff) = 0;
104 
111  virtual void zoom(const Pixel fixedPoint, const float magnitude) = 0;
112 
114  virtual void setPosition(const Vector& newPosition) = 0;
115 
116  virtual void setTarget(const Vector& newTarget) = 0;
117 
122  virtual void transform(const AffineMatrix& matrix) = 0;
123 
125  virtual void pan(const Pixel offset) = 0;
126 
128  virtual void resize(const Pixel newSize) = 0;
129 
131  virtual AutoPtr<ICamera> clone() const = 0;
132 };
133 
134 struct CameraParams {
136  Pixel imageSize = Pixel(1024, 768);
137 
139  Vector position = Vector(0._f, 0._f, -1._f);
140 
143 
145  Vector up = Vector(0._f, 1._f, 0._f);
146 
149 
150  struct {
152  Float fov = PI / 3._f;
154 
155  struct {
156 
158  float fov = 1.e5_f;
159 
162 
163  } ortho;
164 };
165 
166 
168 class OrthoCamera : public ICamera {
169 private:
170  CameraParams data;
171 
173  struct {
174  Vector u, v, w;
175  } cached;
176 
177 public:
178  explicit OrthoCamera(const CameraParams& data);
179 
180  virtual void autoSetup(const Storage& storage) override;
181 
182  virtual Optional<ProjectedPoint> project(const Vector& r) const override;
183 
184  virtual Optional<CameraRay> unproject(const Coords& coords) const override;
185 
186  virtual Pixel getSize() const override;
187 
188  virtual AffineMatrix getFrame() const override;
189 
190  virtual Vector getTarget() const override;
191 
192  virtual Vector getUpVector() const override;
193 
194  virtual Optional<float> getCutoff() const override;
195 
196  virtual Optional<float> getWorldToPixel() const override;
197 
198  virtual void setCutoff(const Optional<float> newCutoff) override;
199 
200  virtual void zoom(const Pixel fixedPoint, const float magnitude) override;
201 
202  virtual void setPosition(const Vector& newPosition) override;
203 
204  virtual void setTarget(const Vector& newTarget) override;
205 
206  virtual void transform(const AffineMatrix& matrix) override;
207 
208  virtual void pan(const Pixel offset) override;
209 
210  virtual void resize(const Pixel newSize) override;
211 
212  virtual AutoPtr<ICamera> clone() const override {
213  return makeAuto<OrthoCamera>(*this);
214  }
215 
216 private:
217  void update();
218 
219  Optional<CameraRay> unprojectImpl(const Coords& coords, const bool adjustZ) const;
220 
221  float estimateFov(const Storage& storage) const;
222 };
223 
225 class PerspectiveCamera : public ICamera {
226 private:
227  CameraParams data;
228 
229  struct {
232 
235 
238 
240 
241  } cached;
242 
243 public:
244  PerspectiveCamera(const CameraParams& data);
245 
246  virtual void autoSetup(const Storage& storage) override;
247 
248  virtual Optional<ProjectedPoint> project(const Vector& r) const override;
249 
250  virtual Optional<CameraRay> unproject(const Coords& coords) const override;
251 
252  virtual Pixel getSize() const override;
253 
254  virtual AffineMatrix getFrame() const override;
255 
256  virtual Vector getTarget() const override;
257 
258  virtual Vector getUpVector() const override;
259 
260  virtual Optional<float> getCutoff() const override;
261 
262  virtual Optional<float> getWorldToPixel() const override;
263 
264  virtual void setCutoff(const Optional<float> newCutoff) override;
265 
266  virtual void zoom(const Pixel UNUSED(fixedPoint), const float magnitude) override;
267 
268  virtual void setPosition(const Vector& newPosition) override;
269 
270  virtual void setTarget(const Vector& newTarget) override;
271 
272  virtual void transform(const AffineMatrix& matrix) override;
273 
274  virtual void pan(const Pixel offset) override;
275 
276  virtual void resize(const Pixel newSize) override;
277 
278  virtual AutoPtr<ICamera> clone() const override {
279  return makeAuto<PerspectiveCamera>(*this);
280  }
281 
282 private:
283  void update();
284 };
285 
287 class PanoCameraBase : public ICamera {
288 protected:
291 
292 public:
293  explicit PanoCameraBase(const CameraParams& data);
294 
295  virtual void autoSetup(const Storage& storage) override;
296 
297  virtual Optional<ProjectedPoint> project(const Vector& r) const override;
298 
299  virtual Pixel getSize() const override;
300 
301  virtual AffineMatrix getFrame() const override;
302 
303  virtual Vector getTarget() const override;
304 
305  virtual Vector getUpVector() const override;
306 
307  virtual Optional<float> getCutoff() const override;
308 
309  virtual Optional<float> getWorldToPixel() const override;
310 
311  virtual void setCutoff(const Optional<float> newCutoff) override;
312 
313  virtual void zoom(const Pixel UNUSED(fixedPoint), const float magnitude) override;
314 
315  virtual void setPosition(const Vector& newPosition) override;
316 
317  virtual void setTarget(const Vector& newTarget) override;
318 
319  virtual void transform(const AffineMatrix& matrix) override;
320 
321  virtual void pan(const Pixel offset) override;
322 
323  virtual void resize(const Pixel newSize) override;
324 
325 protected:
326  virtual void update();
327 };
328 
331 private:
332  struct {
334 
335  float radius;
336  } cached;
337 
338 public:
339  explicit FisheyeCamera(const CameraParams& data);
340 
341  virtual Optional<CameraRay> unproject(const Coords& coords) const override;
342 
343  virtual AutoPtr<ICamera> clone() const override {
344  return makeAuto<FisheyeCamera>(*this);
345  }
346 
347 private:
348  virtual void update() override;
349 };
350 
353 public:
354  explicit SphericalCamera(const CameraParams& data);
355 
356  virtual Optional<CameraRay> unproject(const Coords& coords) const override;
357 
358  virtual AutoPtr<ICamera> clone() const override {
359  return makeAuto<SphericalCamera>(*this);
360  }
361 };
362 
363 
Three-dimensional affine matrix.
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Smart pointer performing cloning of stored resource rather than copying pointer.
uint32_t Size
Integral type used to index arrays (by default).
Definition: Globals.h:16
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
Definition: Globals.h:13
constexpr Float EPS
Definition: MathUtils.h:30
constexpr Float INFTY
Definition: MathUtils.h:38
constexpr Float PI
Mathematical constants.
Definition: MathUtils.h:361
#define UNUSED(x)
Definition: Object.h:37
#define NAMESPACE_SPH_END
Definition: Object.h:12
Wrapper of type value of which may or may not be present.
const NothingType NOTHING
Definition: Optional.h:16
BasicVector< Float > Vector
Definition: Vector.h:539
Fisheye camera.
Definition: Camera.h:330
virtual AutoPtr< ICamera > clone() const override
Definition: Camera.h:343
virtual Optional< CameraRay > unproject(const Coords &coords) const override
Returns a ray in particle coordinates corresponding to given coordinates in the image plane.
Definition: Camera.cpp:453
FisheyeCamera(const CameraParams &data)
Definition: Camera.cpp:448
float radius
Definition: Camera.h:335
Coords center
Definition: Camera.h:333
Interface defining a camera or view, used by a renderer.
Definition: Camera.h:62
virtual Optional< float > getCutoff() const =0
Returns the clipping distance from plane passing through origin, perpendicular to camera direction.
virtual Pixel getSize() const =0
Returns the current resolution of the camera.
virtual AffineMatrix getFrame() const =0
Returns the transformation matrix converting camera space to world space.
virtual Optional< float > getWorldToPixel() const =0
Returns the world-to-pixel ratio.
virtual void autoSetup(const Storage &storage)=0
Initializes the camera, using the provided particle storage.
virtual void pan(const Pixel offset)=0
Moves the camera by relative offset in image space.
virtual Vector getTarget() const =0
Returns the current target point of the camera.
virtual Optional< ProjectedPoint > project(const Vector &r) const =0
Returns projected position of particle on the image.
virtual void zoom(const Pixel fixedPoint, const float magnitude)=0
virtual AutoPtr< ICamera > clone() const =0
virtual void setCutoff(const Optional< float > newCutoff)=0
Modifies the clipping distance of the camera.
virtual void transform(const AffineMatrix &matrix)=0
Transforms the current view by given matrix.
virtual void setTarget(const Vector &newTarget)=0
virtual void resize(const Pixel newSize)=0
Changes the image size.
virtual void setPosition(const Vector &newPosition)=0
Moves the camera to new position in world space.
virtual Optional< CameraRay > unproject(const Coords &coords) const =0
Returns a ray in particle coordinates corresponding to given coordinates in the image plane.
virtual Vector getUpVector() const =0
Returns the reference "up" direction of the camera.
virtual Pair< Vector > getTrackedPoint(const Storage &storage) const =0
Object representing a 1D interval of real numbers.
Definition: Interval.h:17
virtual Pair< Vector > getTrackedPoint(const Storage &storage) const override
Definition: Camera.cpp:27
MedianTracker(const Vector &offset)
Definition: Camera.h:39
Wrapper of type value of which may or may not be present.
Definition: Optional.h:23
Orthographic camera.
Definition: Camera.h:168
virtual AutoPtr< ICamera > clone() const override
Definition: Camera.h:212
virtual Optional< float > getCutoff() const override
Returns the clipping distance from plane passing through origin, perpendicular to camera direction.
Definition: Camera.cpp:152
virtual AffineMatrix getFrame() const override
Returns the transformation matrix converting camera space to world space.
Definition: Camera.cpp:140
virtual void transform(const AffineMatrix &matrix) override
Transforms the current view by given matrix.
Definition: Camera.cpp:187
virtual void resize(const Pixel newSize) override
Changes the image size.
Definition: Camera.cpp:209
Vector w
Definition: Camera.h:174
virtual Optional< float > getWorldToPixel() const override
Returns the world-to-pixel ratio.
Definition: Camera.cpp:156
virtual void zoom(const Pixel fixedPoint, const float magnitude) override
Definition: Camera.cpp:164
virtual void setPosition(const Vector &newPosition) override
Moves the camera to new position in world space.
Definition: Camera.cpp:175
virtual Pixel getSize() const override
Returns the current resolution of the camera.
Definition: Camera.cpp:136
virtual Vector getUpVector() const override
Returns the reference "up" direction of the camera.
Definition: Camera.cpp:148
OrthoCamera(const CameraParams &data)
Definition: Camera.cpp:49
virtual void setCutoff(const Optional< float > newCutoff) override
Modifies the clipping distance of the camera.
Definition: Camera.cpp:160
virtual void autoSetup(const Storage &storage) override
Initializes the camera, using the provided particle storage.
Definition: Camera.cpp:99
Vector u
Definition: Camera.h:174
virtual Vector getTarget() const override
Returns the current target point of the camera.
Definition: Camera.cpp:144
virtual void setTarget(const Vector &newTarget) override
Definition: Camera.cpp:181
virtual Optional< ProjectedPoint > project(const Vector &r) const override
Returns projected position of particle on the image.
Definition: Camera.cpp:109
Vector v
Definition: Camera.h:174
virtual Optional< CameraRay > unproject(const Coords &coords) const override
Returns a ray in particle coordinates corresponding to given coordinates in the image plane.
Definition: Camera.cpp:132
virtual void pan(const Pixel offset) override
Moves the camera by relative offset in image space.
Definition: Camera.cpp:202
Common base for panoramic cameras.
Definition: Camera.h:287
virtual Vector getUpVector() const override
Returns the reference "up" direction of the camera.
Definition: Camera.cpp:392
virtual Optional< float > getCutoff() const override
Returns the clipping distance from plane passing through origin, perpendicular to camera direction.
Definition: Camera.cpp:396
virtual void setPosition(const Vector &newPosition) override
Moves the camera to new position in world space.
Definition: Camera.cpp:411
virtual void pan(const Pixel offset) override
Moves the camera by relative offset in image space.
Definition: Camera.cpp:423
CameraParams data
Definition: Camera.h:289
virtual Optional< ProjectedPoint > project(const Vector &r) const override
Returns projected position of particle on the image.
Definition: Camera.cpp:376
virtual void setTarget(const Vector &newTarget) override
Definition: Camera.cpp:415
virtual Pixel getSize() const override
Returns the current resolution of the camera.
Definition: Camera.cpp:380
virtual void autoSetup(const Storage &storage) override
Initializes the camera, using the provided particle storage.
Definition: Camera.cpp:366
virtual Optional< float > getWorldToPixel() const override
Returns the world-to-pixel ratio.
Definition: Camera.cpp:401
virtual AffineMatrix getFrame() const override
Returns the transformation matrix converting camera space to world space.
Definition: Camera.cpp:384
virtual void setCutoff(const Optional< float > newCutoff) override
Modifies the clipping distance of the camera.
Definition: Camera.cpp:405
virtual void zoom(const Pixel UNUSED(fixedPoint), const float magnitude) override
Definition: Camera.cpp:407
virtual void transform(const AffineMatrix &matrix) override
Transforms the current view by given matrix.
Definition: Camera.cpp:419
virtual void update()
Definition: Camera.cpp:432
PanoCameraBase(const CameraParams &data)
Definition: Camera.cpp:361
AffineMatrix matrix
Definition: Camera.h:290
virtual Vector getTarget() const override
Returns the current target point of the camera.
Definition: Camera.cpp:388
virtual void resize(const Pixel newSize) override
Changes the image size.
Definition: Camera.cpp:427
virtual Pair< Vector > getTrackedPoint(const Storage &storage) const override
Definition: Camera.cpp:9
ParticleTracker(const Size index)
Definition: Camera.h:28
Perspective camera.
Definition: Camera.h:225
Vector dir
Unit direction of the camera.
Definition: Camera.h:231
virtual Pixel getSize() const override
Returns the current resolution of the camera.
Definition: Camera.cpp:275
virtual AffineMatrix getFrame() const override
Returns the transformation matrix converting camera space to world space.
Definition: Camera.cpp:279
virtual void setCutoff(const Optional< float > newCutoff) override
Modifies the clipping distance of the camera.
Definition: Camera.cpp:298
virtual Vector getUpVector() const override
Returns the reference "up" direction of the camera.
Definition: Camera.cpp:316
virtual Optional< ProjectedPoint > project(const Vector &r) const override
Returns projected position of particle on the image.
Definition: Camera.cpp:239
virtual void setTarget(const Vector &newTarget) override
Definition: Camera.cpp:311
virtual Optional< float > getWorldToPixel() const override
Returns the world-to-pixel ratio.
Definition: Camera.cpp:294
virtual void transform(const AffineMatrix &matrix) override
Transforms the current view by given matrix.
Definition: Camera.cpp:320
virtual void setPosition(const Vector &newPosition) override
Moves the camera to new position in world space.
Definition: Camera.cpp:306
Vector velocity
Definition: Camera.h:239
virtual void autoSetup(const Storage &storage) override
Initializes the camera, using the provided particle storage.
Definition: Camera.cpp:226
Vector left
Left vector of the camera, size of which of represents the image size at unit distance.
Definition: Camera.h:237
virtual Vector getTarget() const override
Returns the current target point of the camera.
Definition: Camera.cpp:285
virtual void resize(const Pixel newSize) override
Changes the image size.
Definition: Camera.cpp:337
virtual void pan(const Pixel offset) override
Moves the camera by relative offset in image space.
Definition: Camera.cpp:329
virtual Optional< float > getCutoff() const override
Returns the clipping distance from plane passing through origin, perpendicular to camera direction.
Definition: Camera.cpp:289
virtual AutoPtr< ICamera > clone() const override
Definition: Camera.h:278
Vector up
Up vector of the camera, size of which of represents the image size at unit distance.
Definition: Camera.h:234
virtual void zoom(const Pixel UNUSED(fixedPoint), const float magnitude) override
Definition: Camera.cpp:300
virtual Optional< CameraRay > unproject(const Coords &coords) const override
Returns a ray in particle coordinates corresponding to given coordinates in the image plane.
Definition: Camera.cpp:264
PerspectiveCamera(const CameraParams &data)
Definition: Camera.cpp:219
Spherical camera.
Definition: Camera.h:352
SphericalCamera(const CameraParams &data)
Definition: Camera.cpp:491
virtual Optional< CameraRay > unproject(const Coords &coords) const override
Returns a ray in particle coordinates corresponding to given coordinates in the image plane.
Definition: Camera.cpp:496
virtual AutoPtr< ICamera > clone() const override
Definition: Camera.h:358
Array with fixed number of allocated elements.
Definition: StaticArray.h:19
Container storing all quantities used within the simulations.
Definition: Storage.h:230
Simple 2D vector with integer coordinates. Provides conversion from and to wxPoint.
struct CameraParams::@20 perspective
Pixel imageSize
Size of the image.
Definition: Camera.h:136
struct CameraParams::@21 ortho
Float fov
Field of view (angle)
Definition: Camera.h:152
Vector position
Camera position in space.
Definition: Camera.h:139
Optional< float > cutoff
Cutoff distance of the camera.
Definition: Camera.h:161
Interval clipping
Defines the clipping planes of the camera.
Definition: Camera.h:148
Vector target
Look-at point in space.
Definition: Camera.h:142
Vector up
Up vector of the camera (direction)
Definition: Camera.h:145
Ray given by origin and target point.
Definition: Camera.h:56
Vector origin
Definition: Camera.h:57
Vector target
Definition: Camera.h:58
Definition: Point.h:115
Definition: Point.h:101
Base class for all polymorphic objects.
Definition: Object.h:88
Represents a particle projected onto image plane.
Definition: Camera.h:46
float radius
Projected radius of the particle.
Definition: Camera.h:52
Coords coords
Point in image coordinates.
Definition: Camera.h:49