File: clippingPlane.html

package info (click to toggle)
libqglviewer 2.8.0%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 6,076 kB
  • sloc: cpp: 25,884; sh: 14; makefile: 12
file content (182 lines) | stat: -rw-r--r-- 5,760 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>libQGLViewer clippingPlane example</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link href="../qglviewer.css" rel="stylesheet" type="text/css" />
  <link rel="shortcut icon" href="../images/qglviewer.ico" type="image/x-icon" />
  <link rel="icon" href="../images/qglviewer.icon.png" type="image/png" />
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-23223012-2']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
</head>
<body>

<div class="banner">
 <a class="qindex" href="../index.html">Home</a>
 <a class="qindex" href="../download.html">Download</a>
 <a class="qindex highlight" href="index.html">Gallery</a>
 <a class="qindex" href="../refManual/hierarchy.html">Documentation</a>
 <a class="qindex" href="../developer.html">Developer</a>
</div>

<h1>The clippingPlane example</h1>

<center>
  <img src="../images/clippingPlane.jpg" width="330" height="228" alt="clippingPlane"/>
</center>

<p>
 A clipping plane is manipulated using a ManipulatedFrame
</p>
<p>
 The standard OpenGL <i>GL_CLIP_PLANE</i> feature is used to add an additionnal clipping
 plane in the scene, which position and orientation are set by a <b>ManipulatedFrame</b>.
</p>
<p>
 Hold the <b>Control</b> key pressed down while using the mouse to modify the plane orientation (left button)
 and position (right button) and to interactively see the clipped result.
</p>
<p>
 Since the plane equation is defined with respect to the current modelView matrix, a constant equation (normal
 along the Z axis) can be used since we transformed the coordinates system using the <b>matrix()</b> method.
</p>
<h2>clippingPlane.h</h2>
<pre>
#include &lt;QGLViewer/qglviewer.h&gt;

class Viewer : public QGLViewer {
protected:
  virtual void draw();
  virtual void init();
  virtual QString helpString() const;
};
</pre>


<h2>clippingPlane.cpp</h2>
<pre>
#include "clippingPlane.h"
#include "QGLViewer/manipulatedFrame.h"

using namespace std;
using namespace qglviewer;

// Draws a spiral
void Viewer::draw() {
  const float nbSteps = 200.0;

  glBegin(GL_QUAD_STRIP);
  for (int i = 0; i &lt; nbSteps; ++i) {
    const float ratio = i / nbSteps;
    const float angle = 21.0 * ratio;
    const float c = cos(angle);
    const float s = sin(angle);
    const float r1 = 1.0 - 0.8f * ratio;
    const float r2 = 0.8f - 0.8f * ratio;
    const float alt = ratio - 0.5f;
    const float nor = 0.5f;
    const float up = sqrt(1.0 - nor * nor);
    glColor3f(1.0 - ratio, 0.2f, ratio);
    glNormal3f(nor * c, up, nor * s);
    glVertex3f(r1 * c, alt, r1 * s);
    glVertex3f(r2 * c, alt + 0.05f, r2 * s);
  }
  glEnd();

  glPushMatrix();
  glMultMatrixd(manipulatedFrame()-&gt;matrix());
  // Since the Clipping Plane equation is multiplied by the current modelView,
  // we can define a constant equation (plane normal along Z and passing by the
  // origin) since we are here in the manipulatedFrame coordinates system (we
  // glMultMatrixd() with the manipulatedFrame matrix()).
  static const GLdouble equation[] = {0.0, 0.0, 1.0, 0.0};
  glClipPlane(GL_CLIP_PLANE0, equation);

  // Draw a plane representation: Its normal...
  glColor3f(0.8f, 0.8f, 0.8f);
  drawArrow(0.4f, 0.015f);
  // ...and a quad (with a slightly shifted z so that it is not clipped).
  glBegin(GL_QUADS);
  glVertex3f(-1.0, -1.0, 0.001f);
  glVertex3f(-1.0, 1.0, 0.001f);
  glVertex3f(1.0, 1.0, 0.001f);
  glVertex3f(1.0, -1.0, 0.001f);
  glEnd();
  glPopMatrix();
}

void Viewer::init() {
  // Restore previous viewer state.
  restoreStateFromFile();

  // Opens help window
  help();

  // The ManipulatedFrame will be used to position the clipping plane
  setManipulatedFrame(new ManipulatedFrame());

  // Enable plane clipping
  glEnable(GL_CLIP_PLANE0);
}

QString Viewer::helpString() const {
  QString text("&lt;h2&gt;C l i p p i n g P l a n e&lt;/h2&gt;");
  text += "The standard OpenGL &lt;i&gt;GL_CLIP_PLANE&lt;/i&gt; feature is used to add an "
          "additionnal clipping ";
  text += "plane in the scene, which position and orientation are set by a "
          "&lt;b&gt;ManipulatedFrame&lt;/b&gt;.&lt;br&gt;&lt;br&gt;";
  text += "Hold the &lt;b&gt;Control&lt;/b&gt; key pressed down while using the mouse to "
          "modify the plane orientation (left button) ";
  text += "and position (right button) and to interactively see the clipped "
          "result.&lt;br&gt;&lt;br&gt;";
  text += "Since the plane equation is defined with respect to the current "
          "modelView matrix, a constant equation (normal";
  text += "along the Z axis) can be used since we transformed the coordinates "
          "system using the &lt;b&gt;matrix()&lt;/b&gt; method.";

  return text;
}
</pre>


<h2>main.cpp</h2>
<pre>
#include "clippingPlane.h"
#include &lt;qapplication.h&gt;

int main(int argc, char **argv) {
  // Read command lines arguments.
  QApplication application(argc, argv);

  // Instantiate the viewer.
  Viewer viewer;

  viewer.setWindowTitle("clippingPlane");

  // Make the viewer window visible on screen.
  viewer.show();

  // Run main loop.
  return application.exec();
}
</pre>



<p>
  Back to the <a href="index.html">examples main page</a>.
</p>

</body>
</html>