<!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 screenCoordSystem example</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <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" /> </head> <body> <table class="banner"> <tr> <td align="center"><a href="../index.html"><b>Home</b></a></td> <td align="center"><a href="../refManual/hierarchy.html"><b>Documentation</b></a></td> <td align="center"><a href="../download.html"><b>Download</b></a></td> <td align="center" class="qindexHL"><a href="index.html"><b>Screenshots</b></a></td> <td align="center"><a href="../developer.html"><b>Developer</b></a></td> </tr> </table> <h1>The screenCoordSystem example</h1> <center> <img src="../images/screenCoordSystem.jpg" width="300" height="200" alt="screenCoordSystem"/> </center> <p> A saucers control viewer that illustrates the screen coordinate system feature. </p> <p> Use <code>startScreenCoordinatesSystem()</code> and <code>stopScreenCoordinatesSystem()</code> to set this mode. Once this mode has been activated in <code>draw()</code>, the X,Y coordinates correspond to the pixel units (origin in the lower left corner). Combined with the <code>camera()->projectedCoordinatesOf()</code>, this feature enable the mix of 2D and 3D drawing. </p> <p> In this example, the arrows that designate the saucers seem to be attached to the object. </p> <h2>screenCoordSystem.h</h2> <pre> <span class="dir">#include <QGLViewer/qglviewer.h> </span> <span class="key">class </span>Viewer : <span class="key">public </span>QGLViewer { <span class="key">protected </span>: <span class="key">virtual </span><span class="typ">void </span>init(); <span class="key">virtual </span><span class="typ">void </span>draw(); <span class="key">virtual </span>QString helpString() <span class="typ">const</span>; <span class="key">private </span>: <span class="typ">void </span>drawSaucer() <span class="typ">const</span>; <span class="typ">void </span>drawCone(<span class="typ">const float </span>zMin,<span class="typ">const float </span>zMax, <span class="typ">const float </span>r1, <span class="typ">const float </span>r2) <span class="typ">const</span>; <span class="typ">static const int </span>nbSaucers = <span class="num">10</span>; qglviewer::Frame saucerPos[nbSaucers]; qglviewer::Vec saucerColor[nbSaucers]; };</pre> <h2>screenCoordSystem.cpp</h2> <pre> <span class="dir">#include </span><span class="dstr">"screenCoordSystem.h"</span><span class="dir"> </span><span class="dir">#include <stdio.h> </span><span class="dir">#include <stdlib.h> </span><span class="com">// RAND_MAX </span><span class="dir"></span> <span class="key">using namespace </span>qglviewer; <span class="key">using namespace </span>std; <span class="typ">void </span>Viewer::init() { <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<nbSaucers; i++) { Vec pos; pos.x = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX) <span class="num">- 0.5</span>; pos.y = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX) <span class="num">- 0.5</span>; pos.z = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX) <span class="num">- 0.5</span>; Quaternion ori(Vec(<span class="key">static_cast</span><<span class="typ">float</span>>(rand()) / RAND_MAX, <span class="key">static_cast</span><<span class="typ">float</span>>(rand()) / RAND_MAX, <span class="key">static_cast</span><<span class="typ">float</span>>(rand()) / RAND_MAX), rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX) * M_PI); saucerPos[i].setPosition(pos); saucerPos[i].setOrientation(ori); saucerColor[i].x = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX); saucerColor[i].y = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX); saucerColor[i].z = rand() / <span class="key">static_cast</span><<span class="typ">float</span>>(RAND_MAX); } restoreFromFile(); help(); } QString Viewer::helpString() <span class="typ">const </span>{ QString text(<span class="str">"<h2>S c r e e n C o o r d S y s t e m</h2>"</span>); text += <span class="str">"This example illustrates the <i>startScreenCoordinatesSystem()</i> function "</span>; text += <span class="str">"which enables a GL drawing directly into the screen coordinate system.<br>"</span>; text += <span class="str">"The arrows are drawned using this method. The screen projection coordinates "</span>; text += <span class="str">"of the objects is determined using <i>camera()->projectedCoordinatesOf()</i>, "</span>; text += <span class="str">"thus <i>attaching</i> the 2D arrow to a 3D object"</span>; <span class="key">return </span>text; } <span class="typ">void </span>Viewer::drawCone(<span class="typ">const float </span>zMin,<span class="typ">const float </span>zMax, <span class="typ">const float </span>r1, <span class="typ">const float </span>r2) <span class="typ">const </span>{ <span class="typ">static const float </span>nbSub = <span class="num">32</span>; <span class="typ">float </span>angle,c,s; Vec normal, p1, p2; glBegin(GL_QUAD_STRIP); <span class="key">for </span>(<span class="typ">unsigned short </span>i=<span class="num">0</span>; i<=nbSub; ++i) { angle = <span class="num">2.0 </span>* M_PI * i / nbSub; c = cos(angle); s = sin(angle); p1 = Vec(r1*c, r1*s, zMin); p2 = Vec(r2*c, r2*s, zMax); normal = cross(Vec(-s,c,<span class="num">0.0</span>) , (p2-p1)); normal.normalize(); glNormal3fv(normal.address()); glVertex3fv(p1.address()); glVertex3fv(p2.address()); } glEnd(); } <span class="typ">void </span>Viewer::drawSaucer() <span class="typ">const </span>{ drawCone(<span class="num">-0.014</span>, <span class="num">-0.01</span>, <span class="num">0.015</span>, <span class="num">0.03</span>); drawCone(<span class="num">-0.01</span>, <span class="num">0.0</span>, <span class="num">0.03</span>, <span class="num">0.04</span>); drawCone(<span class="num">0.0</span>, <span class="num">0.02</span>, <span class="num">0.05</span>, <span class="num">0.03</span>); drawCone(<span class="num">0.02</span>, <span class="num">0.023</span>, <span class="num">0.03</span>, <span class="num">0.0</span>); } <span class="typ">void </span>Viewer::draw() { <span class="com">// Draw 3D flying saucers </span> <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<nbSaucers; i++) { glPushMatrix(); glMultMatrixd(saucerPos[i].matrix()); glColor3fv(saucerColor[i].address()); drawSaucer(); glPopMatrix(); } <span class="com">// Compute projected coordinates </span> <span class="typ">int </span>projX[nbSaucers]; <span class="typ">int </span>projY[nbSaucers]; <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<nbSaucers; i++) { Vec projectedPos = camera()->projectedCoordinatesOf(saucerPos[i].position()); projX[i] = (<span class="typ">int</span>)(projectedPos.x); projY[i] = (<span class="typ">int</span>)(projectedPos.y); } <span class="com">// Draw the arrows </span> glColor3fv(foregroundColor().address()); startScreenCoordinatesSystem(); <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<nbSaucers; i++) { glBegin(GL_LINE_LOOP); glVertex2i(projX[i]<span class="num">-50</span>, projY[i]); glVertex2i(projX[i]<span class="num">-20</span>, projY[i]<span class="num">-4</span>); glVertex2i(projX[i]<span class="num">-15</span>, projY[i]); glVertex2i(projX[i]<span class="num">-20</span>, projY[i]+<span class="num">4</span>); glEnd(); } stopScreenCoordinatesSystem(); <span class="com">// Draw text id </span> <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<nbSaucers; i++) drawText(projX[i]<span class="num">-60</span>, projY[i]+<span class="num">4</span>, QString::number(i)); } </pre> <h2>main.cpp</h2> <pre> <span class="dir">#include </span><span class="dstr">"screenCoordSystem.h"</span><span class="dir"> </span><span class="dir">#include <qapplication.h> </span> <span class="typ">int </span>main(<span class="typ">int </span>argc, <span class="typ">char</span>** argv) { <span class="com">// Read command lines arguments. </span> QApplication application(argc,argv); <span class="com">// Instantiate the viewer, show it on screen. </span> Viewer viewer; viewer.show(); <span class="com">// Set the viewer as the application main widget. </span> application.setMainWidget(&viewer); <span class="com">// Run main loop. </span> <span class="key">return </span>application.exec(); }</pre> <p> <a href="index.html">Go back</a> to the examples main page </p> <p> <a href="http://validator.w3.org/check/referer"><img src="../images/xhtml.png" alt="Valid XHTML 1.0!" height="31" width="88" border="0"/></a> <a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="../images/css.png" width="88" height="31" alt="Valid CSS!" border="0"/></a> <i>Last modified on Thursday, February 5, 2004.</i> </p> </body> </html>