// messo insieme da diversi esempi... Cubo = Elenco di visualizzazione della scena (1); Cubo << Inizio (QUAD_STRIP); Cubo << Colore (1.0, 0.0, 1.0); Cubo << Vertice (-0.5, 0.5, 0.5); Cubo << Colore (1.0, 0.0, 0.0); Cubo << Vertice (-0.5, -0.5, 0.5); Cubo << Colore (1.0, 1.0, 1.0); Cubo << Vertice (0.5, 0.5, 0.5); Cubo << Colore (1.0, 1.0, 0.0); Cubo << Vertice (0.5, -0.5, 0.5); Cubo << Colore (0.0, 1.0, 1.0); Cubo << Vertice (0.5, 0.5, -0.5); Cubo << Colore( 0.0, 1.0, 0.0 ); Cubo << Vertice( 0.5, -0.5, -0.5 ); Cubo << Colore( 0.0, 0.0, 1.0 ); Cubo << Vertice( -0.5, 0.5, -0.5 ); Cubo << Colore( 0.0, 0.0, 0.0 ); Cubo << Vertice( -0.5, -0.5, -0.5 ); Cubo << Colore( 1.0, 0.0, 1.0 ); Cubo << Vertice( -0.5, 0.5, 0.5 ); Cubo << Colore( 1.0, 0.0, 0.0 ); Cubo << Vertice( -0.5, -0.5, 0.5 ); Cubo << Fine(); cube1 = Elenco di visualizzazione della scena(); cube1 << arcball( cube, .5 ); // non ricostruire gli arcball quindi cube2 = Scene Display List(); cube2 << arcball( cube, .5 ); // ricordano le loro posizioni WindowHeight = 600; WindowWidth = 800; mouseOriginY = WindowHeight / 2; mouseOriginX = WindowWidth / 2; mode = "done"; dx = dy = .; mouseMatrix = Identity( 4 ); // <<<< questo accumula tutte le modifiche di angolo/dimensione/scala // questa funzione viene chiamata con m==1 con il mouse premuto, m==2 con il mouse trascinato e m=3 con il mouse sollevato (k è lo stato maiusc/control/alt) // questa funzione restituisce 0 o 1, apposta, per consentire agli arcball di funzionare o questo codice per regolare mouseMatrix. Click2d = Function( {x, y, m, k}, {xt, xs, xr, yr, zr, gradi, radianti, dx, dy}, If( m == 1, mouseOriginX = x; mouseOriginY = y; If( Is Shift Key(), mode = "translate" ); // if( Is Alt Key(), // linux/virtualbox il tasto alt non arriva mai a JMP // mode = "rotate"; // ); If( Is Ctrl Key(), mode = "scale" ); If( Is Ctrl Key() & Is Shift Key(), mode = "rotate" ); If( !Is Ctrl Key() & !Is Shift Key(), Return( 0 ); // consente alla sfera ad arco di ottenere il controllo. 0 significa che questo gestore NON ha gestito il clic. );// , /*else if */ m == 2, dx = x - mouseOriginX; dy = y - mouseOriginY; If( mode == "traduci", xt = Identity( 4 ); xt[1, 4] = dx / WindowWidth; xt[2, 4] = -dy / WindowWidth; mouseMatrix = xt * mouseMatrix;// , /* altrimenti se */ mode == "scala", xs = Identity( 4 ); xs[1, 1] = If( dx >= 0, (dx + WindowWidth) / WindowWidth// , WindowWidth / (WindowWidth - dx) ); xs[2, 2] = If( dy >= 0, WindowHeight / (dy + WindowHeight)// , (WindowHeight - dy) / WindowHeight ); mouseMatrix = xs * mouseMatrix;// , /* altrimenti se */ mode == "ruota", radianti = 6 * dy / WindowWidth; xr = Identity( 4 ); // inizia con una matrice identità, quindi inserisci i valori per ruotare attorno all'asse x xr[2, 2] = Cos( radianti ); xr[2, 3] = -Sin( radianti ); xr[3, 2] = Sin( radianti ); xr[3, 3] = Cos( radianti ); yr = Identity( 4 ); // e l'asse y radianti = 6 * dx / WindowHeight; yr[1, 1] = Cos( radianti ); yr[1, 3] = Sin( radianti ); yr[3, 1] = -Sin( radianti ); yr[3, 3] = Cos( radianti ); zr = Identity( 4 ); // e l'asse z mouseMatrix = xr * mouseMatrix; mouseMatrix = yr * mouseMatrix; ); mouseOriginX = x; mouseOriginY = y; rebuild();// , /*altrimenti se */ m == 3, modalità = "fatto"; 0;// , /*altrimenti */ Throw( "m inaspettato=" || Char( m ) ) ); //0 // poiché questa funzione NON restituisce 1, JMP non la chiamerà di nuovo fino al successivo clic del mouse. I trascinamenti si comporteranno come spostamenti e andranno alla funzione Move2d. 1; // perché *restituisce* 1, m=1,2,3 per premere, spostare(i), rilasciare ); Scene = Scene Box( WindowWidth, WindowHeight, Click2d ); Scene << Show ArcBall( "Sempre" ); Nuova finestra( "Rotazioni matrice", V List Box( Text Box( "shift-drag: pan\!nctrl-drag: zoom\!nctrl-shift-drag: rotate\!nVanilla-drag: rotate cubes" ), Scene ) ); ricostruisci = Function( {}, gradi = 45; radianti = 3,14159 * gradi / 180; // seno e coseno usano i radianti Scene << clear; Scene << perspective( 45, 3, 7 ); Scene << Translate( 0,0, 0, -4,5 ); // applica la traslazione/rotazione/scala globale Scene << MultMatrix( mouseMatrix ); Scene << pushmatrix; xt = Identity( 4 ); // trasla questo a sinistra di 0,75 xt[1, 4] = -0,75; Scene << MultMatrix( xt ); Scene << callList( Cube1 ); Scene << popmatrix; Scene << pushmatrix; Scene << translate( 0,75, 0, 0 ); // trasla questo a destra di 0,75 Scene << calllist( Cube2 ); Scene << popmatrix; Scene << update; ); ricostruisci();