void Surf2GL::SmoothNorms(){ int k,n; norms.resize(surf->vtx.size()); Ptn null = {0,0,0}; std::fill(norms.begin(), norms.end(), null); n = surf->trg.size(); for(k=0;k<n;k++){ Surf::TTrg &trg = surf->trg[k]; Surf::TVtx vtx1 = surf->vtx[trg.i1]; Surf::TVtx vtx2 = surf->vtx[trg.i2]; Surf::TVtx vtx3 = surf->vtx[trg.i3]; vtx1.p=vtx1.p*vtx1.d+surf->cnt; vtx2.p=vtx2.p*vtx2.d+surf->cnt; vtx3.p=vtx3.p*vtx3.d+surf->cnt; float x,y,z; vnormal2(x,y,z, vtx2.p.x,vtx2.p.y,vtx2.p.z, vtx3.p.x,vtx3.p.y,vtx3.p.z, vtx1.p.x,vtx1.p.y,vtx1.p.z ); Ptn *p = &norms[trg.i1]; p->x+=x; p->y+=y; p->z+=z; p = &norms[trg.i2]; p->x+=x; p->y+=y; p->z+=z; p = &norms[trg.i3]; p->x+=x; p->y+=y; p->z+=z; } for(k=0;k<norms.size();k++) { Ptn &p=norms[k]; p=p*(1./p.norma()); } }
void Surf2GL::operator()(){ if(txtr) txtr->Begin(); int k, n=surf->trg.size(); MapTxtrCoord::TxtrCoord tc[3]; for(k=0;k<n;k++) { Surf::TTrg &trg = surf->trg[k]; Surf::TVtx vtx1 = surf->vtx[trg.i1]; Surf::TVtx vtx2 = surf->vtx[trg.i2]; Surf::TVtx vtx3 = surf->vtx[trg.i3]; vtx1.p=vtx1.p*vtx1.d+surf->cnt; vtx2.p=vtx2.p*vtx2.d+surf->cnt; vtx3.p=vtx3.p*vtx3.d+surf->cnt; float x,y,z; if(norms.size()==0){ vnormal2(x,y,z, vtx2.p.x,vtx2.p.y,vtx2.p.z, vtx3.p.x,vtx3.p.y,vtx3.p.z, vtx1.p.x,vtx1.p.y,vtx1.p.z ); glNormal3f(x,y,z); } if(txtr){ tc[0] = *maptxtr->GetXY(trg.i1); tc[1] = *maptxtr->GetXY(trg.i2); tc[2] = *maptxtr->GetXY(trg.i3); if(tc[0].x == -1 || tc[1].x == -1 || tc[2].x ==-1){ txtr->MapTriangle2d(-1.0,-1.0); tc[0].x=tc[1].x=tc[2].x=tc[0].y=tc[1].y=tc[2].y=-1; } else txtr->MapTriangle2d((tc[0].x+tc[1].x+tc[2].x)/3,(tc[0].y+tc[1].y+tc[2].y)/3); } glBegin(GL_TRIANGLES); if(norms.size()){ Ptn *p=&norms[trg.i1]; glNormal3f(p->x,p->y,p->z); } if(txtr) txtr->Map2d(tc[0].x,tc[0].y); glVertex3f(vtx1.p.x,vtx1.p.y,vtx1.p.z); if(norms.size()){ Ptn *p=&norms[trg.i2]; glNormal3f(p->x,p->y,p->z); } if(txtr) txtr->Map2d(tc[1].x,tc[1].y); glVertex3f(vtx2.p.x,vtx2.p.y,vtx2.p.z); if(norms.size()){ Ptn *p=&norms[trg.i3]; glNormal3f(p->x,p->y,p->z); } if(txtr) txtr->Map2d(tc[2].x,tc[2].y); glVertex3f(vtx3.p.x,vtx3.p.y,vtx3.p.z); glEnd(); } if(txtr) txtr->End(); }
void D3DG1obj::triangle(int i1, int i2, int i3, int c){ glBegin(GL_TRIANGLES); Ptn &vtx1 = vtx[i1]; Ptn &vtx2 = vtx[i2]; Ptn &vtx3 = vtx[i3]; float x,y,z; vnormal2(x,y,z, vtx2.x,vtx2.y,vtx2.z, vtx3.x,vtx3.y,vtx3.z, vtx1.x,vtx1.y,vtx1.z ); glNormal3f(x,y,z); //glColor4f(rgba.r/555.,rgba.g/555.,rgba.b/555., 1); glVertex3f(vtx1.x,vtx1.y,vtx1.z); glVertex3f(vtx2.x,vtx2.y,vtx2.z); glVertex3f(vtx3.x,vtx3.y,vtx3.z); glEnd(); }
/*shortest arc q.w == cos(angle / 2) q.x == sin(angle / 2) * cross.x q.y == sin(angle / 2) * cross.y q.z == sin(angle / 2) * cross.z dot and cross product of two normalized vectors are: dot == cos(angle) cross.x == sin(angle) * Unitperpendicular.x cross.y == sin(angle) * Unitperpendicular.y cross.z == sin(angle) * Unitperpendicular.z */ void extract_rotation_pseudo_edge(float q[4], float p1x, float p1y, float p1z, float p2x, float p2y, float p2z) { float a[3]; /* Axis of rotation */ float p1[3], p2[3]; vset2(p1,p1x,p1y,p1z); vset2(p2,p2x,p2y,p2z); /* * Figure out how much to rotate around that axis. */ float d = vdot2(p1,p2); if(d>=1.0) { q[3] = 1.0f; q[0] = 0.0; q[1] = 0.0; q[2]=0.0; return; } if (d < (1e-6f - 1.0f)) { // Generate an axis float v1[3] = {1,0,0};float tmp[3]; vcross2(v1,p1,tmp); if (vlength2(tmp)==0) // pick another if colinear { v1[0]=0;v1[1]=1;vcross2(v1,p1,tmp); } vnormal2(tmp); //Half-Way Vector Solution axis_to_quat(tmp,180,q); return; } //Half-Way Quaternion Solution vcross2(p1,p2,a); //float s = sqrt( (1+d)*2 ); //float invs = 1 / s; q[0] = a[0];// * invs; q[1] = a[1];//* invs; q[2] = a[2]; //* invs; q[3] = 1+d;//s * 0.5f; }