Point Cloud Library (PCL)  1.7.1
common.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2010, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage, Inc. nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * $Id$
35  *
36  */
37 #ifndef PCL_PCL_VISUALIZER_COMMON_H_
38 #define PCL_PCL_VISUALIZER_COMMON_H_
39 
40 #if defined __GNUC__
41 #pragma GCC system_header
42 #endif
43 
44 #include <pcl/pcl_macros.h>
45 #include <pcl/visualization/eigen.h>
46 #include <vtkMatrix4x4.h>
47 
48 namespace pcl
49 {
50  struct RGB;
51 
52  namespace visualization
53  {
54  /** \brief Get (good) random values for R/G/B.
55  * \param[out] r the resultant R color value
56  * \param[out] g the resultant G color value
57  * \param[out] b the resultant B color value
58  * \param[in] min minimum value for the colors
59  * \param[in] max maximum value for the colors
60  */
61  PCL_EXPORTS void
62  getRandomColors (double &r, double &g, double &b, double min = 0.2, double max = 2.8);
63 
64  /** \brief Get (good) random values for R/G/B.
65  * \param[out] rgb the resultant RGB color value
66  * \param[in] min minimum value for the colors
67  * \param[in] max maximum value for the colors
68  */
69  PCL_EXPORTS void
70  getRandomColors (pcl::RGB &rgb, double min = 0.2, double max = 2.8);
71 
72  PCL_EXPORTS Eigen::Matrix4d
73  vtkToEigen (vtkMatrix4x4* vtk_matrix);
74 
75  PCL_EXPORTS Eigen::Vector2i
76  worldToView (const Eigen::Vector4d &world_pt, const Eigen::Matrix4d &view_projection_matrix, int width, int height);
77 
78  PCL_EXPORTS void
79  getViewFrustum (const Eigen::Matrix4d &view_projection_matrix, double planes[24]);
80 
82  {
86  };
87 
88  PCL_EXPORTS int
89  cullFrustum (double planes[24], const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb);
90 
91  PCL_EXPORTS float
92  viewScreenArea (const Eigen::Vector3d &eye, const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const Eigen::Matrix4d &view_projection_matrix, int width, int height);
93 
95  {
104  };
105 
107  {
111  };
112 
114  {
118  };
119 
120  //////////////////////////////////////////////////////////////////////////////////////////////
121  /** \brief Camera class holds a set of camera parameters together with the window pos/size. */
122  class PCL_EXPORTS Camera
123  {
124  public:
125  /** \brief Focal point or lookAt.
126  * \note The view direction can be obtained by (focal-pos).normalized ()
127  */
128  double focal[3];
129 
130  /** \brief Position of the camera. */
131  double pos[3];
132 
133  /** \brief Up vector of the camera.
134  * \note Not to be confused with the view direction, bad naming here. */
135  double view[3];
136 
137  /** \brief Clipping planes depths.
138  * clip[0] is near clipping plane, and clip [1] is the far clipping plane
139  */
140  double clip[2];
141 
142  /** \brief Field of view angle in y direction (radians). */
143  double fovy;
144 
145  // the following variables are the actual position and size of the window on the screen and NOT the viewport!
146  // except for the size, which is the same the viewport is assumed to be centered and same size as the window.
147  double window_size[2];
148  double window_pos[2];
149 
150 
151  /** \brief Computes View matrix for Camera (Based on gluLookAt)
152  * \param[out] view_mat the resultant matrix
153  */
154  void
155  computeViewMatrix (Eigen::Matrix4d& view_mat) const;
156 
157  /** \brief Computes Projection Matrix for Camera
158  * \param[out] proj the resultant matrix
159  */
160  void
161  computeProjectionMatrix (Eigen::Matrix4d& proj) const;
162 
163  /** \brief converts point to window coordiantes
164  * \param[in] pt xyz point to be converted
165  * \param[out] window_cord vector containing the pts' window X,Y, Z and 1
166  *
167  * This function computes the projection and view matrix every time.
168  * It is very inefficient to use this for every point in the point cloud!
169  */
170  template<typename PointT> void
171  cvtWindowCoordinates (const PointT& pt, Eigen::Vector4d& window_cord) const;
172 
173  /** \brief converts point to window coordiantes
174  * \param[in] pt xyz point to be converted
175  * \param[out] window_cord vector containing the pts' window X,Y, Z and 1
176  * \param[in] composite_mat composite transformation matrix (proj*view)
177  *
178  * Use this function to compute window coordinates with a precomputed
179  * transformation function. The typical composite matrix will be
180  * the projection matrix * the view matrix. However, additional
181  * matrices like a camera disortion matrix can also be added.
182  */
183  template<typename PointT> void
184  cvtWindowCoordinates (const PointT& pt, Eigen::Vector4d& window_cord, const Eigen::Matrix4d& composite_mat) const;
185  };
186  }
187 }
188 
189 #include <pcl/visualization/common/impl/common.hpp>
190 
191 #endif