void TensorGlRep::render(const shared_ptr<Node>& node, const GLViewInfo* viewInfo){ const int circDiv=20; static gleDouble circ[circDiv+2][3]={}; if(circ[0][0]==0){ gleSetNumSides(10); Real step=2*M_PI/circDiv; for(int i=-1; i<circDiv+1; i++){ circ[i+1][0]=cos(i*step); circ[i+1][1]=sin(i*step); circ[i+1][2]=0; } } if(range && !skewRange) skewRange=range; Vector3r pos=node->pos+(node->hasData<GlData>()?node->getData<GlData>().dGlPos:Vector3r::Zero()); for(int i:{0,1,2}){ Vector3r color=(range?range->color(eigVal[i]):CompUtils::scalarOnColorScale(eigVal[i],-1,1)); if(isnan(color.maxCoeff())) continue; Real mxNorm=(range?range->maxAbs(eigVal[i]):1); Real len=relSz*viewInfo->sceneRadius; len*=isnan(scaleExp)?abs(eigVal[i]/mxNorm):pow(abs(eigVal[i])/mxNorm,scaleExp); glColor3v(color); Vector3r dx(len*eigVec.col(i)); // arrows which go towards each other for negative eigenvalues, and away from each other for positive ones GLUtils::GLDrawArrow(pos+(eigVal[i]>0?Vector3r::Zero():dx),pos+(eigVal[i]>0?dx:Vector3r::Zero()),color); GLUtils::GLDrawArrow(pos-(eigVal[i]>0?Vector3r::Zero():dx),pos-(eigVal[i]>0?dx:Vector3r::Zero()),color); // draw circular arrow to show skew components, in the half-height // compute it in the xy plane, transform coords instead Real maxSkew=(skewRange?skewRange->maxAbs(skew[i]):1); // if(abs(skew[i])<.05*maxSkew) continue; int nPts=int((abs(skew[i])/maxSkew)*circDiv*.5/* show max skew as .5*2π rad */-.5/*round evenly, but exclude one segment for arrow head*/); if(nPts>circDiv-2) nPts=circDiv-2; if(nPts<=0) continue; Real torRad1=(skewRelSz>0?skewRelSz:relSz)*viewInfo->sceneRadius*(abs(skew[i])/maxSkew); Real torDist=0*.3*torRad1; // draw both arcs in-plane Real torRad2=torRad1*.1; glColor3v(skewRange?skewRange->color(skew[i]):CompUtils::scalarOnColorScale(skew[i],-1,1)); for(int j:{0,1,2}){ glPushMatrix(); Eigen::Affine3d T=Eigen::Affine3d::Identity(); T.translate(pos+(j==0?1:-1)*eigVec.col(i)*torDist).rotate(Quaternionr().setFromTwoVectors(Vector3r::UnitZ(),eigVec.col(i)*(skew[i]>0?-1:1))).scale(torRad1); if(j==1) T.rotate(AngleAxisr(M_PI,Vector3r::UnitZ())); //GLUtils::setLocalCoords(pos+(j==0?1:-1)*eigVec.col(i)*torDist, glMultMatrixd(T.data()); // since we scaled coords to transform unit circle coords to our radius, we will need to scale dimensions now by 1/torRad1 glePolyCylinder(nPts+2,circ,/* use current color*/NULL,torRad2*(1/torRad1)); gleDouble headRad[]={2*torRad2*(1/torRad1),2*torRad2*(1/torRad1),0,0,0}; glePolyCone(4,(gleDouble(*)[3])&(circ[nPts-1]),/*use current color*/NULL,headRad); glPopMatrix(); } } }
/* draw the cylinder shape */ void DrawStuff (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* set up some matrices so that the object spins with the mouse */ glPushMatrix (); glTranslatef (0.0, 0.0, -80.0); glRotatef (lastx, 0.0, 1.0, 0.0); glRotatef (lasty, 1.0, 0.0, 0.0); /* Phew. FINALLY, Draw the polycylinder -- */ glePolyCylinder (NPTS, points, colors, 2.3); glPopMatrix (); glutSwapBuffers (); }
void GLThread::DrawDownvecAtInd(int ind) { glDisable(GL_TEXTURE_2D); glPushMatrix(); glColor3d(0.8, 0.1, 0.0); const double radius = 0.20; const double radius_cone_max = 0.45; Vector3d diff_pos = _thread->vertex_at_ind(ind)-display_start_pos; double length_factor = 8.0; double cone_scale_factor = 0.07; Vector3d down_vec = -Vector3d::UnitZ()*length_factor; double pts[4][3]; double pts_cone[4][3]; double radius_cone[4]; radius_cone[0] = radius_cone_max*2; radius_cone[1] = radius_cone_max; radius_cone[2] = 1e-3; radius_cone[3] = 0; for (int i=0; i < 3; i++) { pts[0][i] = diff_pos(i)-down_vec(i); pts[1][i] = diff_pos(i); pts[2][i] = diff_pos(i) + down_vec(i); pts[3][i] = diff_pos(i) + 2*down_vec(i); pts_cone[0][i] = diff_pos(i) + down_vec(i)*(1.0-cone_scale_factor); pts_cone[1][i] = diff_pos(i) + down_vec(i); pts_cone[2][i] = diff_pos(i) + down_vec(i)*(1.0+cone_scale_factor); pts_cone[3][i] = diff_pos(i) + down_vec(i)*(1.0+cone_scale_factor*2); } glePolyCylinder(4, pts, 0x0,radius); glePolyCone(4, pts_cone, 0x0, radius_cone); glPopMatrix(); glEnable(GL_TEXTURE_2D); }
void GLThread::DrawAxesAtPoint(const Vector3d& pt, const Matrix3d& rot_in, ColorCode color_axis, bool skipX) { glDisable(GL_TEXTURE_2D); glPushMatrix(); //Matrix3d rot = Eigen::AngleAxisd(M_PI/2.0, Vector3d::UnitX())*rot_in; Matrix3d rot = Eigen::AngleAxisd(M_PI/2.0, rot_in.col(0))*rot_in; const double radius = 0.15; const double radius_cone_max = 0.4; Vector3d diff_pos = pt-display_start_pos; double rotation_scale_factor = 6.0; double cone_scale_factor = 0.07; Matrix3d rotations_project = rot*rotation_scale_factor; double pts[4][3]; double pts_cone[4][3]; double radius_cone[4]; radius_cone[0] = radius_cone_max*2; radius_cone[1] = radius_cone_max; radius_cone[2] = 1e-3; radius_cone[3] = 0; for (int i=0; i < 3; i++) { pts[0][i] = diff_pos(i)-rotations_project(i,0); pts[1][i] = diff_pos(i); } for (int coord=0; coord < 3; coord++) { if (coord == 0 && skipX) continue; for (int i=0; i < 3; i++) { pts[2][i] = diff_pos(i) + rotations_project(i,coord); pts[3][i] = diff_pos(i) + 2*rotations_project(i,coord); pts_cone[0][i] = diff_pos(i) + rotations_project(i,coord)*(1.0-cone_scale_factor); pts_cone[1][i] = diff_pos(i) + rotations_project(i,coord); pts_cone[2][i] = diff_pos(i) + rotations_project(i,coord)*(1.0+cone_scale_factor); pts_cone[3][i] = diff_pos(i) + rotations_project(i,coord)*(1.0+cone_scale_factor*2); } float thread_color_array[4][3]; float stripe_color_array[4][3]; for (int i=0; i < 4; i++) { for (int j=0; j < 3; j++) { thread_color_array[i][j] = thread_color_float[j]; stripe_color_array[i][j] = stripe_color_float[j]; } } const float alpha = 0.85; // gleTextureMode (GLE_TEXTURE_VERTEX_MODEL_CYL); if (color_axis == material) { if (coord == 0) glColor4f(0.7, 0.2, 0, alpha); else if (coord == 1) glColor4f((thread_color_float[0])*0.8, (thread_color_float[1])*0.8, (thread_color_float[2])*0.8, alpha); else glColor4f((stripe_color_float[0])*0.8, (stripe_color_float[1])*0.8, (stripe_color_float[2])*0.8, alpha); } else if (color_axis == bishop) { if (coord == 0) glColor4f(0.7, 0.2, 0, alpha); else if (coord == 1) glColor3d(0.5, 0.5, 0.5); else glColor3d(0.17, 0.17, 0.17); } else { if (coord == 0) glColor3d(1.0, 0.0, 0.0); else if (coord == 1) glColor3d(0.0, 1.0, 0.0); else glColor3d(0.0, 0.0, 1.0); } glePolyCylinder(4, pts, 0x0,radius); glePolyCone(4, pts_cone, 0x0, radius_cone); } glPopMatrix(); glEnable(GL_TEXTURE_2D); }