Esempio n. 1
0
static void segment (float w, float *x, float *y) {
  int i, j;
  float t, p[3], q[3], up[3] = {0, 0, 1}, m[3], epsilon = 0.01;
  p[0] = x[0]; p[1] = y[1];
  glNormal3f (0, 0, 1);
  glBegin (GL_QUAD_STRIP);
    for (i = 0; i <= CONFIG_RENDER_DETAIL; ++i) {
      t = (float) i / CONFIG_RENDER_DETAIL;
      bezier3 (t, x, y, p);
      bezier3 (t + epsilon, x, y, q);
      p[2] = terrain_h (p[0], p[1]);
      q[2] = terrain_h (q[0], q[1]);
      for (j = 0; j < len (q); ++j) q[j] -= p[j];
      crossproduct (q, up, m);
      normalize (m, len (m));

      for (j = 0; j < len (m); ++j) p[j] -= w * m[j];
        glTexCoord2f (0, t);
        glVertex3fv (p);
      for (j = 0; j < len (m); ++j) p[j] += 2*w * m[j];
        glTexCoord2f (1, t);
        glVertex3fv (p);

    }
  glEnd ();
}
Esempio n. 2
0
bool SpecificWorker::Quadruped()
{
	static float i=0;
	bool ismoving=false;
	if(i==0)
	{
		for(int k=0;k<6;k++)
			if(proxies[k]->getStateLeg().ismoving)
			{
				ismoving=true;
				break;
			}
		if(!ismoving)
		{
			stateQuadruped.enqueue(stateQuadruped.dequeue());
			stateQuadruped.enqueue(stateQuadruped.dequeue());
			for(int i=0;i<6;i++)
				pre_statelegs[i]=statelegs[i];
		}
	}
	if(!ismoving)	
	{
		if(lini!=QVec::vec3(0, 0, 0)&&lfin!=QVec::vec3(0,0,0))
		{
			RoboCompLegController::PoseLeg p;
			RoboCompLegController::StateLeg st;
			QVec ini,fin,tmp,med;
			for(int j=0;j<6;j++)
			{
				int aux=stateQuadruped.dequeue();
				st=pre_statelegs[aux];
				if(j==0||j==1)
				{ //patas por arco
					ini =QVec::vec3(st.x,legsp[aux].y(),st.z),
					fin = legsp[aux]+lfin,med=legsp[aux],
					tmp=bezier3(ini,QVec::vec3(med.x(),0,med.z()),fin,i);
				}
				else
				{ //patas por tierra
					int a=2;
					if(j==2||j==3)
						a=1;
					ini = QVec::vec3(st.x,legsp[aux].y(),st.z),
					fin = legsp[aux]-lfin-(((lini-lfin)/3)*a),
					tmp = bezier2(ini,fin,i);
				}
				stateQuadruped.enqueue(aux);
				p.x=tmp.x();
				p.y=tmp.y();
				p.z=tmp.z();
				p.ref=base.toStdString();
				p.vel = vel;
				proxies[aux]->setIKLeg(p,false);
			}
			i+=tbezier;
			if(i>1)
			{
				i=0;
				return true;
			}
			return false;
		}
	}
	return true;
}
Esempio n. 3
0
bool SpecificWorker::caminar3x3()
{
	static float i=0;
	bool ismoving=false;
	if(i==0)
	{
		for(int k=0;k<6;k++)
			if(proxies[k]->getStateLeg().ismoving)
			{
				ismoving=true;
				break;
			}
		if(!ismoving)
			for(int i=0;i<6;i++)
				pre_statelegs[i]=statelegs[i];
	}
	if(!ismoving)	
	{
		if(lini!=QVec::vec3(0, 0, 0)&&lfin!=QVec::vec3(0,0,0))
		{
			//patas por arco
			for(int s=0;s<3;s++)
			{
				RoboCompLegController::StateLeg st=pre_statelegs[l1[s]];
				QVec posini =QVec::vec3(st.x,legsp[l1[s]].y(),st.z);
				QVec ini = posini,fin = legsp[l1[s]]+lfin,med=legsp[l1[s]];
				QVec tmp=bezier3(ini,QVec::vec3(med.x(),0,med.z()),fin,i);
				RoboCompLegController::PoseLeg p;
				p.x=tmp.x();
				p.y=tmp.y();
				p.z=tmp.z();
				p.ref=base.toStdString();
				p.vel = vel;
				proxies[l1[s]]->setIKLeg(p,false);
				
			}
		// patas por tierra
			for(int s=0;s<3;s++)
			{
				RoboCompLegController::StateLeg st=pre_statelegs[l2[s]];
				QVec posini =QVec::vec3(st.x,legsp[l2[s]].y(),st.z);
				QVec ini = posini,fin = legsp[l2[s]]+lini;
				QVec tmp=bezier2(ini,fin,i);
				RoboCompLegController::PoseLeg p;
				p.x=tmp.x();
				p.y=tmp.y();
				p.z=tmp.z();
				p.ref=base.toStdString();
				p.vel = vel;
				proxies[l2[s]]->setIKLeg(p,false);
				
			}
			i+=tbezier;
			if (i>1)
			{
				int aux[]={l1[0],l1[1],l1[2]};
				l1[0]=l2[0];
				l1[1]=l2[1];
				l1[2]=l2[2];
				l2[0]=aux[0];
				l2[1]=aux[1];
				l2[2]=aux[2];
				i=0;
				return true;
			}
			return false;
		}
	}
	return true;
}
Esempio n. 4
0
bool SpecificWorker::rotar()
{
	static bool estado=true;
	if(lrot!=QVec::vec3(0, 0, 0))
	{
		static float i=0;
		bool ismoving=false;
		for(int k=0;k<6;k++)
			if(proxies[k]->getStateLeg().ismoving)
			{
				ismoving=true;
				break;
			}
		
		if(!ismoving)
		{
			if(i==0)
				for(int i=0;i<6;i++)
					pre_statelegs[i]=statelegs[i];
			QVec ini,fin;
			for(int j=0;j<6;j++)
			{
				RoboCompLegController::StateLeg st=pre_statelegs[j];
				QVec posini =QVec::vec3(st.x,legsp[j].y(),st.z);
				if((j==2 || j==3))
				{
					ini = posini;
					if(estado)
						fin = legsp[j]+lrot;
					else
						fin = legsp[j]-lrot;
				}
				else
				{
					ini = posini;
					if(estado)
						fin = legsp[j]-lrot;
					else
						fin = legsp[j]+lrot;
				}
				QVec tmp;
				if(estado)
					if(j==0||j==3||j==4)
						tmp=bezier3(ini,bezier2(ini,fin,0.5)+lmed,fin,i);
					else
						tmp = bezier2(ini,fin,i);
				else
					if(j==0||j==3||j==4)
						tmp = bezier2(ini,fin,i);
					else
						tmp=bezier3(ini,bezier2(ini,fin,0.5)+lmed,fin,i);
				
				RoboCompLegController::PoseLeg p;
				p.x   = tmp.x();
				p.y   = tmp.y();
				p.z   = tmp.z();
				p.ref = base.toStdString();
				p.vel = 6;
				proxies[j]->setIKLeg(p,false);
			}
			i+=tbezier;
			if (i>1)
			{
				i=0;
				estado=!estado;
				return true;
			}
		}
		return false;
	}
	else
		return true;
}
bool SpecificWorker::Quadruped()
{
	static float i=0;
	bool ismoving=false;	
	if(lini!=QVec::vec3(0, 0, 0)&&lfin!=QVec::vec3(0,0,0))
	{
		//Comprueba que alguna pata se mueva
		for(int k=0;k<6;k++)
			if(proxies[k]->getStateLeg().ismoving){
				ismoving=true;
				break;
			}
		if(!ismoving)
		{
		//patas por arco
			for(int s=0;s<2;s++)
			{
				RoboCompLegController::StateLeg st=posiciones[legsQuadrupedOn[s]];
				QVec posini = QVec::vec3(st.x,legCoord[legsQuadrupedOn[s]].y(),st.z);
				QVec ini = posini,fin = legCoord[legsQuadrupedOn[s]]+lfin,med=legCoord[legsQuadrupedOn[s]];
				QVec tmp = bezier3(ini,QVec::vec3(med.x(),0,med.z()),fin,i);
				RoboCompLegController::PoseLeg p;
				p.x=tmp.x();
				p.y=tmp.y();
				p.z=tmp.z();
				p.ref=base.toStdString();
				p.vel=6;
				proxies[legsQuadrupedOn[s]]->setIKLeg(p,false);
			}
		// patas por tierra
			for(int s=0;s<4;s++)
			{
				RoboCompLegController::StateLeg st=posiciones[legsQuadrupedOff[s]];
				QVec posini =QVec::vec3(st.x,legCoord[legsQuadrupedOff[s]].y(),st.z);
				lini = QVec::vec3(-X,0,-Z/3);
				QVec ini = posini,fin = legCoord[legsQuadrupedOff[s]]+lini;
				QVec tmp=bezier2(ini,fin,i);
				RoboCompLegController::PoseLeg p;
				p.x=tmp.x();
				p.y=tmp.y();
				p.z=tmp.z();
				p.ref=base.toStdString();
				p.vel=6;
				proxies[legsQuadrupedOff[s]]->setIKLeg(p,false);
				
			}
			i+=.1;
			if (i>1)
			{
				int aux[]={legsQuadrupedOn[0],legsQuadrupedOn[1]};
				legsQuadrupedOn[0]=legsQuadrupedOff[0];
				legsQuadrupedOn[1]=legsQuadrupedOff[1];
				legsQuadrupedOff[0]=legsQuadrupedOff[2];
				legsQuadrupedOff[1]=legsQuadrupedOff[3];
				legsQuadrupedOff[2]=aux[0];
				legsQuadrupedOff[3]=aux[1];
				i=0;
				return true;
			}
		}
		return false;
	}
	return true;
}