| 1235 | | {\scriptsize\begin{verbatim} |
| 1236 | | subroutine redraw |
| 1237 | | implicit none |
| 1238 | | include 'GL/fgl.h' |
| 1239 | | common /vertices/ n, vertex(2, 100) |
| 1240 | | integer n, i |
| 1241 | | real vertex |
| 1242 | | call fglClear(GL_COLOR_BUFFER_BIT) |
| 1243 | | call fglbegin(GL_LINE_STRIP) |
| 1244 | | do i = 1,n |
| 1245 | | call fglVertex2f(vertex(1, i), vertex(2, i)) |
| 1246 | | end do |
| 1247 | | call fglend |
| 1248 | | call fglFlush |
| 1249 | | end |
| 1250 | | |
| 1251 | | subroutine mouse (button, state, x, y) |
| 1252 | | implicit none |
| 1253 | | include 'GL/fglut.h' |
| 1254 | | include 'GL/fgl.h' |
| 1255 | | include 'GL/fglu.h' |
| 1256 | | common /vertices/ n, vertex(2, 100) |
| 1257 | | integer n, i |
| 1258 | | real vertex |
| 1259 | | integer button, state, x, y |
| 1260 | | integer viewport(4) |
| 1261 | | real*8 mvmatrix(16), projmatrix(16) |
| 1262 | | real*8 wx, wy, wz ! returned world x, y, z coords |
| 1263 | | real*8 px, py, pz ! picked window coortinates |
| 1264 | | integer status |
| 1265 | | |
| 1266 | | if (button .eq. GLUT_LEFT_BUTTON) then |
| 1267 | | if (state .eq. GLUT_DOWN) then |
| 1268 | | call fglGetIntegerv (GL_VIEWPORT, viewport) |
| 1269 | | call fglGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix) |
| 1270 | | call fglGetDoublev (GL_PROJECTION_MATRIX, projmatrix) |
| 1271 | | note viewport(4) is height of window in pixels |
| 1272 | | px = x |
| 1273 | | py = viewport(4) - y - 1 |
| 1274 | | pz = 0.0 |
| 1275 | | print *, ' Coordinates at cursor are ', px, py |
| 1276 | | status = fgluUnProject (px, py, pz, mvmatrix, |
| 1277 | | projmatrix, viewport, wx, wy, wz) |
| 1278 | | print *, 'World coords at z=0.0 are ', wx, wy, wz |
| 1279 | | n = n + 1 |
| 1280 | | vertex(1, n) = wx |
| 1281 | | vertex(2, n) = wy |
| 1282 | | call fglutPostRedisplay |
| 1283 | | end if |
| 1284 | | end if |
| 1285 | | end |
| 1286 | | |
| 1287 | | |
| 1288 | | program main |
| 1289 | | external redraw |
| 1290 | | external mouse |
| 1291 | | include 'GL/fglut.h' |
| 1292 | | call fglutinit |
| 1293 | | call fglutinitdisplaymode(ior(GLUT_SINGLE,GLUT_RGB)) |
| 1294 | | call fglutInitWindowSize (500, 500) |
| 1295 | | call fglutInitWindowPosition (100, 100) |
| 1296 | | window = fglutcreatewindow('Click in window') |
| 1297 | | call fglutdisplayfunc(redraw) |
| 1298 | | call fglutMouseFunc(mouse) |
| 1299 | | call fglutmainloop |
| 1300 | | end |
| 1301 | | \end{verbatim} |
| 1302 | | } |
| 1303 | | |
| 1304 | | |
| 1305 | | |
| 1306 | | \subsection{Kvaternionska rotacija} |
| | 1260 | |
| | 1261 | {{{ |
| | 1262 | #!c |
| | 1263 | #include <stdio.h> |
| | 1264 | #include <stdlib.h> |
| | 1265 | #include <GL/glut.h> |
| | 1266 | |
| | 1267 | #define MAXN 100 |
| | 1268 | |
| | 1269 | GLint n; |
| | 1270 | GLfloat *vertex; |
| | 1271 | |
| | 1272 | void redraw() |
| | 1273 | { |
| | 1274 | int i; |
| | 1275 | glClear(GL_COLOR_BUFFER_BIT); |
| | 1276 | glPushMatrix(); |
| | 1277 | glColor3f(1,1,1); |
| | 1278 | glBegin(GL_LINE_STRIP); |
| | 1279 | for (i = 0; i < n; i++) |
| | 1280 | { |
| | 1281 | glVertex2fv(&vertex[i*2]); |
| | 1282 | } |
| | 1283 | glEnd(); |
| | 1284 | |
| | 1285 | for (i = 0; i < n; i++) //Adding spheres on world coords |
| | 1286 | { |
| | 1287 | glColor3f(1,0,0); |
| | 1288 | glPushMatrix(); |
| | 1289 | glTranslatef(vertex[i*2],vertex[i*2+1],0); |
| | 1290 | glutSolidSphere(0.01,8,8); |
| | 1291 | glPopMatrix(); |
| | 1292 | } |
| | 1293 | glPopMatrix(); |
| | 1294 | glutSwapBuffers(); |
| | 1295 | } |
| | 1296 | |
| | 1297 | void mouse(int button, int state, int x, int y) |
| | 1298 | { |
| | 1299 | GLint viewport[4]; |
| | 1300 | GLdouble mvmatrix[16], projmatrix[16]; |
| | 1301 | GLdouble wx, wy, wz; //Returned world x, y, z coords |
| | 1302 | GLdouble px, py, pz; //Picked window coordinates |
| | 1303 | int status; |
| | 1304 | if (button == GLUT_LEFT_BUTTON ) |
| | 1305 | { |
| | 1306 | if (state == GLUT_DOWN) |
| | 1307 | { |
| | 1308 | glGetIntegerv (GL_VIEWPORT, viewport); |
| | 1309 | glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix); |
| | 1310 | glGetDoublev (GL_PROJECTION_MATRIX, projmatrix); |
| | 1311 | //Note viewport[4] is height in pixels |
| | 1312 | px = x; |
| | 1313 | py = viewport[3] - y - 1; |
| | 1314 | pz = 0.0; |
| | 1315 | fprintf (stderr, "Coordinates at cursor are %f, %f\n", px, py); |
| | 1316 | status = gluUnProject (px, py, pz, mvmatrix, projmatrix, viewport, &wx, &wy, &wz); |
| | 1317 | fprintf(stderr, "World coords at z=0.0 are %f, %f, %f\n", wx, wy, wz); |
| | 1318 | if (n < MAXN) |
| | 1319 | { |
| | 1320 | vertex[n*2] = wx; |
| | 1321 | vertex[n*2+1] = wy; |
| | 1322 | n=n+1; |
| | 1323 | } |
| | 1324 | else |
| | 1325 | { |
| | 1326 | fprintf(stderr, "Maximum number of points was received!\n"); |
| | 1327 | } |
| | 1328 | glutPostRedisplay(); |
| | 1329 | } |
| | 1330 | } |
| | 1331 | } |
| | 1332 | |
| | 1333 | |
| | 1334 | int main(int argc, char *argv[]) |
| | 1335 | { |
| | 1336 | vertex = (GLfloat *) malloc(2 * MAXN * sizeof (GLfloat)); |
| | 1337 | glutInit(&argc, argv); |
| | 1338 | glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); |
| | 1339 | glutInitWindowSize (700, 700); |
| | 1340 | glutInitWindowPosition (0, 0); |
| | 1341 | glutCreateWindow("Click in window"); |
| | 1342 | glutDisplayFunc(redraw); |
| | 1343 | glutMouseFunc(mouse); |
| | 1344 | glutMainLoop(); |
| | 1345 | return 0; |
| | 1346 | } |
| | 1347 | }}} |
| | 1348 | |
| | 1349 | [[BR]] |
| | 1350 | |
| | 1351 | == Kvaternionska rotacija == |
| | 1352 | |
| 1311 | | začetni pritisk na gumb (podprogram \emph{mouse}) kot vse |
| 1312 | | naslednje pomike miške (podprogram \emph{motion}). |
| 1313 | | |
| 1314 | | |
| 1315 | | {\scriptsize\begin{verbatim} |
| 1316 | | subroutine display |
| 1317 | | implicit none |
| 1318 | | include 'GL/fgl.h' |
| 1319 | | common /quaternion/ last(4), cur(4) |
| 1320 | | real last, cur, m(4,4) |
| 1321 | | call build_rotmatrix(m, cur) |
| 1322 | | call fglLoadIdentity |
| 1323 | | call fglMultMatrixf(m) |
| 1324 | | call fglclear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT) |
| 1325 | | call fglutSolidTeapot(dble(0.5)) |
| 1326 | | call fglutSwapBuffers |
| 1327 | | end |
| 1328 | | |
| 1329 | | subroutine motion (x, y) |
| 1330 | | include 'GL/fglut.h' |
| 1331 | | include 'GL/fgl.h' |
| 1332 | | implicit none |
| 1333 | | integer x, y |
| 1334 | | common /quaternion/ last(4), cur(4) |
| 1335 | | common /mousestart/ beginx, beginy |
| 1336 | | common /viewport/ width, height |
| 1337 | | integer width, height |
| 1338 | | integer beginx, beginy |
| 1339 | | real last, cur |
| 1340 | | real p1x, p1y, p2x, p2y |
| 1341 | | p1x = (2.0*beginx - width)/width |
| 1342 | | p1y = (height - 2.0*beginy)/height |
| 1343 | | p2x = (2.0 * x - width) / width |
| 1344 | | p2y = (height - 2.0 * y) / height |
| 1345 | | call trackball(last,p1x, p1y, p2x, p2y) |
| 1346 | | call add_quats(last, cur, cur) |
| 1347 | | beginx = x |
| 1348 | | beginy = y |
| 1349 | | call fglutPostRedisplay |
| 1350 | | end |
| 1351 | | |
| 1352 | | subroutine mouse (button, state, x, y) |
| 1353 | | implicit none |
| 1354 | | integer button, state, x, y |
| 1355 | | include 'GL/fglut.h' |
| 1356 | | include 'GL/fgl.h' |
| 1357 | | include 'GL/fglu.h' |
| 1358 | | common /mousestart/ beginx, beginy |
| 1359 | | integer beginx, beginy |
| 1360 | | beginx = x |
| 1361 | | beginy = y |
| 1362 | | end |
| 1363 | | |
| 1364 | | subroutine reshape(w, h) |
| 1365 | | include 'GL/fgl.h' |
| 1366 | | integer w, h |
| 1367 | | real*8 l |
| 1368 | | common /viewport/ width, height |
| 1369 | | integer width, height |
| 1370 | | width=w |
| 1371 | | height=h |
| 1372 | | l = 1 |
| 1373 | | call fglViewPort(0, 0, w, h) |
| 1374 | | call fglMatrixMode(GL_PROJECTION) |
| 1375 | | call fglLoadIdentity |
| 1376 | | call fglOrtho(-l,l,-l,l,-l,l) |
| 1377 | | call fglMatrixMode(GL_MODELVIEW) |
| 1378 | | call fglLoadIdentity |
| 1379 | | end |
| 1380 | | |
| 1381 | | program trackballdemo |
| 1382 | | implicit none |
| 1383 | | include 'GL/fglut.h' |
| 1384 | | include 'GL/fgl.h' |
| 1385 | | include 'GL/fglu.h' |
| 1386 | | external display |
| 1387 | | external motion |
| 1388 | | external mouse |
| 1389 | | external reshape |
| 1390 | | integer window |
| 1391 | | common /quaternion/ last(4), cur(4) |
| 1392 | | real last, cur |
| 1393 | | call trackball(cur, 0.0, 0.0, 0.0, 0.0) |
| 1394 | | call fglutinit |
| 1395 | | call fglutinitdisplaymode(GLUT_DOUBLE+GLUT_RGB+GLUT_DEPTH) |
| 1396 | | window = fglutcreatewindow('Use mouse to rotate') |
| 1397 | | call fglutdisplayfunc(display) |
| 1398 | | call fglutmousefunc(mouse) |
| 1399 | | call fglutmotionfunc(motion) |
| 1400 | | call fglutreshapefunc(reshape) |
| 1401 | | call fglEnable(GL_LIGHTING) |
| 1402 | | call fglEnable(GL_LIGHT0) |
| 1403 | | call fglEnable(GL_DEPTH_TEST) |
| 1404 | | call fglutmainloop |
| 1405 | | end |
| 1406 | | \end{verbatim} |
| 1407 | | } |
| | 1357 | začetni pritisk na gumb (podprogram ''mouse'') kot vse |
| | 1358 | naslednje pomike miške (podprogram ''motion''). |
| | 1359 | |
| | 1360 | {{{ |
| | 1361 | #!c |
| | 1362 | #include <GL/glut.h> |
| | 1363 | #include "trackball.h" |
| | 1364 | #include "trackball.c" |
| | 1365 | |
| | 1366 | GLfloat m[4][4]; |
| | 1367 | float last[4]; |
| | 1368 | float cur[4]; |
| | 1369 | int width; |
| | 1370 | int height; |
| | 1371 | int beginx; |
| | 1372 | int beginy; |
| | 1373 | float p1x; |
| | 1374 | float p1y; |
| | 1375 | float p2x; |
| | 1376 | float p2y; |
| | 1377 | |
| | 1378 | void display() |
| | 1379 | { |
| | 1380 | glPushMatrix(); |
| | 1381 | build_rotmatrix(m, cur); |
| | 1382 | glLoadIdentity(); |
| | 1383 | glMultMatrixf(*m); |
| | 1384 | glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); |
| | 1385 | glutSolidTeapot(0.5); |
| | 1386 | glPopMatrix(); |
| | 1387 | glutSwapBuffers(); |
| | 1388 | } |
| | 1389 | |
| | 1390 | void mouse(int button,int state, int x, int y) |
| | 1391 | { |
| | 1392 | beginx = x; |
| | 1393 | beginy = y; |
| | 1394 | } |
| | 1395 | |
| | 1396 | void motion(int x,int y) |
| | 1397 | { |
| | 1398 | p1x = (2.0*beginx - width)/width; |
| | 1399 | p1y = (height - 2.0*beginy)/height; |
| | 1400 | p2x = (2.0 * x - width) / width; |
| | 1401 | p2y = (height - 2.0 * y) / height; |
| | 1402 | trackball(last,p1x, p1y, p2x, p2y); |
| | 1403 | add_quats(last, cur, cur); |
| | 1404 | beginx = x; |
| | 1405 | beginy = y; |
| | 1406 | glutPostRedisplay(); |
| | 1407 | } |
| | 1408 | |
| | 1409 | void reshape (int w, int h) |
| | 1410 | { |
| | 1411 | width=w; |
| | 1412 | height=h; |
| | 1413 | double l; |
| | 1414 | l = 1; |
| | 1415 | glViewport (0, 0, w, h); |
| | 1416 | glMatrixMode (GL_PROJECTION); |
| | 1417 | glLoadIdentity(); |
| | 1418 | glOrtho(-l, l, -l, l, -l, l); |
| | 1419 | glMatrixMode(GL_MODELVIEW); |
| | 1420 | glLoadIdentity(); |
| | 1421 | } |
| | 1422 | |
| | 1423 | |
| | 1424 | int main(int argc, char *argv[]) |
| | 1425 | { |
| | 1426 | glutInit(&argc, argv); |
| | 1427 | trackball(cur, 0.0, 0.0, 0.0, 0.0); |
| | 1428 | glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); |
| | 1429 | glutCreateWindow("Rotacija z misko"); |
| | 1430 | glutDisplayFunc(display); |
| | 1431 | glutMouseFunc(mouse); |
| | 1432 | glutMotionFunc(motion); |
| | 1433 | glutReshapeFunc(reshape); |
| | 1434 | glEnable(GL_LIGHTING); |
| | 1435 | glEnable(GL_LIGHT0); |
| | 1436 | glEnable(GL_DEPTH_TEST); |
| | 1437 | glutMainLoop(); |
| | 1438 | return 0; |
| | 1439 | }}} |
| | 1440 | |