#VRML V2.0 utf8 ##@ proto PROTO asphere [ field SFInt32 nlatitude 16 field SFInt32 nlongitude 16 field SFFloat creaseAngle 3.14 ] { DEF object Transform { children [ DEF IFS IndexedFaceSet { coord DEF C Coordinate { } texCoord DEF TC TextureCoordinate { } creaseAngle IS creaseAngle } ]} DEF S Script { field SFInt32 nlat IS nlatitude field SFInt32 nl IS nlongitude field SFInt32 tick 0 field SFInt32 state 0 field SFInt32 phase 1 ##eventOut MFVec3f c eventOut MFVec3f c eventOut MFVec2f tc eventOut MFInt32 ci eventIn SFFloat update eventIn SFFloat change url [ "javascript: function initialize() { var r, phi, x, y, z; var i, j, idx; // Compute coordinates, texture coordinates: if (1) for (i = 0; i < nlat ; i++) { //y = 2 * ( i / (nlat-1) ) - 1; y = 2 * ( i / (nlat-1) ) - 1; r = Math.sqrt( 1 - y*y ); for (j = 0; j < nl; j++) { phi = 2 * Math.PI * j / nl; x = -Math.sin(phi)*r; z = -Math.cos(phi)*r; c[i*nl+j] = new SFVec3f(x-1.0,y,z); tc[i*nl+j] = new SFVec2f( j/nl, i/(nlat-1) ); } } if (1) for (i = 0; i < nlat ; i++) { //y = 2 * ( i / (nlat-1) ) - 1; y = 2 * ( i / (nlat-1) ) - 1; r = Math.sqrt( 1 - y*y ); for (j = 0; j < nl; j++) { phi = 2 * Math.PI * j / nl; x = -Math.sin(phi)*r; z = -Math.cos(phi)*r; c[nlat*nl + i*nl+j] = new SFVec3f(x+1.0,y,z); tc[nlat*nl + i*nl+j] = new SFVec2f( j/nl, i/(nlat-1) ); } } // And compute indices: dfac = 3; if (1) for (i = 0; i < (nlat-1)/dfac; i++) { for (j = 0; j < nl; j++) { idx = 5*(i*nl+j); ci[idx+0] = dfac*i*nl+(j)%nl; ci[idx+1] = dfac*i*nl+(j+1)%nl; ci[idx+2] = (dfac*i+1)*nl+(j+1)%nl; ci[idx+3] = (dfac*i+1)*nl+(j)%nl; ci[idx+4] = -1; // end-of-polygon } } if (1) for (i = 0; i < (nlat-1)/dfac; i++) { var offset; offset = 5* ((nlat-1)/dfac)*nl; for (j = 0; j < nl; j++) { idx = offset + 5*(i*nl+j); ci[idx+0] = nlat*nl + dfac*i*nl+(j)%nl; ci[idx+1] = nlat*nl + dfac*i*nl+(j+1)%nl; ci[idx+2] = nlat*nl + (dfac*i+1)*nl+(j+1)%nl; ci[idx+3] = nlat*nl + (dfac*i+1)*nl+(j)%nl; ci[idx+4] = -1; // end-of-polygon } } } ##@ update function update(value) { if (tick == 0) { tick = value; } while (tick < value) { change(tick); tick = tick + 0.1; } tick = value; } function change(value) { var r, phi, x, y, z; var i, j, idx; var frac; frac = 2.0 * value; state += 1; if (frac > 1.0) frac = 2.0 - frac; frac = 0.0 + frac; // Compute coordinates, texture coordinates: //if (state > phase) state = 0; //if (state == 1) { if (1) for (i = 0; i < nlat ; i++) { //y = 2 * ( i / (nlat-1) ) - 1; y = 2 * ( i / (nlat-1) ) - 1; r = Math.sqrt( 1 - y*y ) - 0.1 * (1.0 - frac); for (j = 0; j < nl; j++) { phi = 2 * Math.PI * j / nl; x = -Math.sin(phi)*r; x = x-1.0*(1.0-frac); c[i*nl+j].x = x; } } if (1) for (i = 0; i < nlat ; i++) { //y = 2 * ( i / (nlat-1) ) - 1; y = 2 * ( i / (nlat-1) ) - 1; y = y ; r = Math.sqrt( 1 - y*y ) - 0.1 * (1.0 - frac); for (j = 0; j < nl; j++) { phi = 2 * Math.PI * j / nl; x = -Math.sin(phi)*r; x = x+1.0*(1.0-frac); c[nlat*nl + i*nl+j].x = x; // new SFVec3f(x,y,z); } } //} }" ] } ROUTE S.c TO C.set_point ROUTE S.tc TO TC.set_point ROUTE S.ci TO IFS.set_coordIndex DEF time TimeSensor { cycleInterval 40 loop TRUE enabled TRUE } DEF rotation OrientationInterpolator { key [ 0 0.25 0.5 0.75 1 ] keyValue [ 1 1 0 0, 1 1 0 1.57, 1 1 0 3.14 1 1 0 4.71, 1 1 0 0 ] } ROUTE time.fraction TO rotation.fraction ##ROUTE rotation.value TO object.rotation ROUTE time.fraction TO S.change } Background { skyColor [0.9 .1 .1] } NavigationInfo { type ["EXAMINE", "ANY"] } Viewpoint { position 0 0 10 orientation 0 0 1 0 } Transform { translation 0 0 0 scale 2 2 2 children [ Shape { appearance DEF A Appearance { material Material {} ##texture ImageTexture { url ["local/images/check.gif"] } texture ImageTexture { url ["@logo.jpg"] } } ##geometry asphere { nlatitude 32 nlongitude 20 } geometry asphere { nlatitude 100 nlongitude 100 } } ] } ##