VTK
vtkPerspectiveTransform.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkPerspectiveTransform.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
48 #ifndef vtkPerspectiveTransform_h
49 #define vtkPerspectiveTransform_h
50 
51 #include "vtkCommonTransformsModule.h" // For export macro
53 
54 #include "vtkMatrix4x4.h" // Needed for inline methods
55 
56 class VTKCOMMONTRANSFORMS_EXPORT vtkPerspectiveTransform : public vtkHomogeneousTransform
57 {
58  public:
59  static vtkPerspectiveTransform *New();
61  void PrintSelf(ostream& os, vtkIndent indent) override;
62 
68  void Identity() { this->Concatenation->Identity(); this->Modified(); };
69 
75  void Inverse() override
76  { this->Concatenation->Inverse(); this->Modified(); };
77 
86  void AdjustViewport(double oldXMin, double oldXMax,
87  double oldYMin, double oldYMax,
88  double newXMin, double newXMax,
89  double newYMin, double newYMax);
90 
98  void AdjustZBuffer(double oldNearZ, double oldFarZ,
99  double newNearZ, double newFarZ);
100 
106  void Ortho(double xmin, double xmax, double ymin, double ymax,
107  double znear, double zfar);
108 
115  void Frustum(double xmin, double xmax, double ymin, double ymax,
116  double znear, double zfar);
117 
124  void Perspective(double angle, double aspect, double znear, double zfar);
125 
139  void Shear(double dxdz, double dydz, double zplane);
140 
151  void Stereo(double angle, double focaldistance);
152 
158  void SetupCamera(const double position[3], const double focalpoint[3],
159  const double viewup[3]);
160 
161  void SetupCamera(double p0, double p1, double p2,
162  double fp0, double fp1, double fp2,
163  double vup0, double vup1, double vup2);
164 
166 
170  void Translate(double x, double y, double z) {
171  this->Concatenation->Translate(x,y,z); };
172  void Translate(const double x[3]) { this->Translate(x[0], x[1], x[2]); };
173  void Translate(const float x[3]) { this->Translate(x[0], x[1], x[2]); };
175 
177 
183  void RotateWXYZ(double angle, double x, double y, double z) {
184  this->Concatenation->Rotate(angle,x,y,z); };
185  void RotateWXYZ(double angle, const double axis[3]) {
186  this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
187  void RotateWXYZ(double angle, const float axis[3]) {
188  this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
190 
192 
197  void RotateX(double angle) { this->RotateWXYZ(angle, 1, 0, 0); };
198  void RotateY(double angle) { this->RotateWXYZ(angle, 0, 1, 0); };
199  void RotateZ(double angle) { this->RotateWXYZ(angle, 0, 0, 1); };
201 
203 
208  void Scale(double x, double y, double z) {
209  this->Concatenation->Scale(x,y,z); };
210  void Scale(const double s[3]) { this->Scale(s[0], s[1], s[2]); };
211  void Scale(const float s[3]) { this->Scale(s[0], s[1], s[2]); };
213 
215 
219  void SetMatrix(vtkMatrix4x4 *matrix) {
220  this->SetMatrix(*matrix->Element); };
221  void SetMatrix(const double elements[16]) {
222  this->Identity(); this->Concatenate(elements); };
224 
226 
230  void Concatenate(vtkMatrix4x4 *matrix) {
231  this->Concatenate(*matrix->Element); };
232  void Concatenate(const double elements[16]) {
233  this->Concatenation->Concatenate(elements); };
235 
243  void Concatenate(vtkHomogeneousTransform *transform);
244 
252  void PreMultiply() {
253  if (this->Concatenation->GetPreMultiplyFlag()) { return; }
254  this->Concatenation->SetPreMultiplyFlag(1); this->Modified(); };
255 
263  void PostMultiply() {
264  if (!this->Concatenation->GetPreMultiplyFlag()) { return; }
265  this->Concatenation->SetPreMultiplyFlag(0); this->Modified(); };
266 
272  return this->Concatenation->GetNumberOfTransforms() +
273  (this->Input == nullptr ? 0 : 1); };
274 
276 
284  {
286  if (this->Input == nullptr)
287  {
288  t=this->Concatenation->GetTransform(i);
289  }
290  else if (i < this->Concatenation->GetNumberOfPreTransforms())
291  {
292  t=this->Concatenation->GetTransform(i);
293  }
294  else if (i > this->Concatenation->GetNumberOfPreTransforms())
295  {
296  t=this->Concatenation->GetTransform(i-1);
297  }
298  else if (this->GetInverseFlag())
299  {
300  t=this->Input->GetInverse();
301  }
302  else
303  {
304  t=this->Input;
305  }
306  return static_cast<vtkHomogeneousTransform *>(t);
307  }
309 
311 
319  void SetInput(vtkHomogeneousTransform *input);
320  vtkHomogeneousTransform *GetInput() { return this->Input; };
322 
331  return this->Concatenation->GetInverseFlag(); };
332 
334 
337  void Push() { if (this->Stack == nullptr) {
338  this->Stack = vtkTransformConcatenationStack::New(); }
339  this->Stack->Push(&this->Concatenation);
340  this->Modified(); };
342 
344 
348  void Pop() { if (this->Stack == nullptr) { return; }
349  this->Stack->Pop(&this->Concatenation);
350  this->Modified(); };
352 
358 
367  int CircuitCheck(vtkAbstractTransform *transform) override;
368 
372  vtkMTimeType GetMTime() override;
373 
374 protected:
376  ~vtkPerspectiveTransform() override;
377 
378  void InternalDeepCopy(vtkAbstractTransform *t) override;
379  void InternalUpdate() override;
380 
384 
385 private:
387  void operator=(const vtkPerspectiveTransform&) = delete;
388 };
389 
390 
391 #endif
void PostMultiply()
Sets the internal state of the transform to PostMultiply.
void RotateZ(double angle)
Create a rotation matrix about the X, Y, or Z axis and concatenate it with the current transformation...
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:41
vtkHomogeneousTransform * Input
void SetMatrix(const double elements[16])
Set the current matrix directly.
vtkMTimeType GetMTime() override
Override GetMTime necessary because of inverse transforms.
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:302
void Pop()
Deletes the transformation on the top of the stack and sets the top to the next transformation on the...
void RotateWXYZ(double angle, double x, double y, double z)
Create a rotation matrix and concatenate it with the current transformation according to PreMultiply ...
superclass for homogeneous transformations
void Scale(const double s[3])
Create a scale matrix (i.e.
void SetMatrix(vtkMatrix4x4 *matrix)
Set the current matrix directly.
void RotateX(double angle)
Create a rotation matrix about the X, Y, or Z axis and concatenate it with the current transformation...
void Scale(const float s[3])
Create a scale matrix (i.e.
virtual void InternalUpdate()
Perform any subclass-specific Update.
virtual vtkAbstractTransform * MakeTransform()=0
Make another transform of the same type.
vtkAbstractTransform * GetInverse()
Get the inverse of this transform.
void Concatenate(vtkMatrix4x4 *matrix)
Concatenates the matrix with the current transformation according to PreMultiply or PostMultiply sema...
void Push()
Pushes the current transformation onto the transformation stack.
void PreMultiply()
Sets the internal state of the transform to PreMultiply.
void Translate(const double x[3])
Create a translation matrix and concatenate it with the current transformation according to PreMultip...
void Inverse() override
Invert the transformation.
void Identity()
Set this transformation to the identity transformation.
vtkHomogeneousTransform * GetInput()
Set the input for this transformation.
void RotateY(double angle)
Create a rotation matrix about the X, Y, or Z axis and concatenate it with the current transformation...
int GetNumberOfConcatenatedTransforms()
Get the total number of transformations that are linked into this one via Concatenate() operations or...
virtual int CircuitCheck(vtkAbstractTransform *transform)
Check for self-reference.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
a simple class to control print indentation
Definition: vtkIndent.h:39
void RotateWXYZ(double angle, const float axis[3])
Create a rotation matrix and concatenate it with the current transformation according to PreMultiply ...
vtkHomogeneousTransform * GetConcatenatedTransform(int i)
Get one of the concatenated transformations as a vtkAbstractTransform.
superclass for all geometric transformations
virtual void Modified()
Update the modification time for this object.
void Translate(const float x[3])
Create a translation matrix and concatenate it with the current transformation according to PreMultip...
void InternalDeepCopy(vtkAbstractTransform *transform) override
Perform any subclass-specific DeepCopy.
double Element[4][4]
The internal data is public for historical reasons. Do not use!
Definition: vtkMatrix4x4.h:45
void Concatenate(const double elements[16])
Concatenates the matrix with the current transformation according to PreMultiply or PostMultiply sema...
vtkTransformConcatenation * Concatenation
vtkTransformConcatenationStack * Stack
void RotateWXYZ(double angle, const double axis[3])
Create a rotation matrix and concatenate it with the current transformation according to PreMultiply ...
int GetInverseFlag()
Get the inverse flag of the transformation.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
static vtkTransformConcatenationStack * New()
void Scale(double x, double y, double z)
Create a scale matrix (i.e.
void Translate(double x, double y, double z)
Create a translation matrix and concatenate it with the current transformation according to PreMultip...
describes a 4x4 matrix transformation