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
|
<!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 cameraLight 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 cameraLight example</h1>
<center>
<img src="../images/cameraLight.jpg" width="330" height="228" alt="cameraLight"/>
</center>
<p>
This example shows how to position a GL_LIGHT on the camera.
</p>
<p>
A spot light position and direction are set so that they always match the
camera's current setup.
</p>
<p>
This is done using the <code>camera->position()</code> and <code>camera->viewDirection()</code>
methods which return values expressed in the world coordinates system.
</p>
<h2>cameraLight.h</h2>
<pre>
#include <QGLViewer/qglviewer.h>
class Viewer : public QGLViewer {
protected:
virtual void draw();
virtual void init();
virtual QString helpString() const;
private:
virtual void drawSpiral();
};
</pre>
<h2>cameraLight.cpp</h2>
<pre>
#include "cameraLight.h"
using namespace std;
using namespace qglviewer;
void Viewer::draw() {
// Place light at camera position
const Vec cameraPos = camera()->position();
const GLfloat pos[4] = {(float)cameraPos[0], (float)cameraPos[1],
(float)cameraPos[2], 1.0f};
glLightfv(GL_LIGHT1, GL_POSITION, pos);
// Orientate light along view direction
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, camera()->viewDirection());
drawSpiral();
}
// Draws a spiral
void Viewer::drawSpiral() {
const float nbSteps = 1000.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();
}
void Viewer::init() {
// Light setup
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
// Light default parameters
const GLfloat light_ambient[4] = {1.0, 1.0, 1.0, 1.0};
const GLfloat light_specular[4] = {1.0, 1.0, 1.0, 1.0};
const GLfloat light_diffuse[4] = {1.0, 1.0, 1.0, 1.0};
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 3.0);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1f);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.3f);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.3f);
glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
// Restore previous viewer state.
restoreStateFromFile();
// Opens help window
help();
}
QString Viewer::helpString() const {
QString text("<h2>C a m e r a L i g h t</h2>");
text += "See the <b>Mouse</b> tab and the documentation web pages for "
"details.<br><br>";
text += "Press <b>Escape</b> to exit the viewer.";
return text;
}
</pre>
<h2>main.cpp</h2>
<pre>
#include "cameraLight.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("cameraLight");
// 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>
|