Ejemplo n.º 1
0
  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());
    }
  }
Ejemplo n.º 2
0
  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();
  }
Ejemplo n.º 3
0
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;
}