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 <QGLViewer/qglviewer.h>
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 < 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()->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("<h2>C l i p p i n g P l a n e</h2>");
text += "The standard OpenGL <i>GL_CLIP_PLANE</i> feature is used to add an "
"additionnal clipping ";
text += "plane in the scene, which position and orientation are set by a "
"<b>ManipulatedFrame</b>.<br><br>";
text += "Hold the <b>Control</b> 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.<br><br>";
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 <b>matrix()</b> method.";
return text;
}
</pre>
<h2>main.cpp</h2>
<pre>
#include "clippingPlane.h"
#include <qapplication.h>
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>
|