Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Newton y aquí nada se mueve

Iniciado por tamat, 19 de Junio de 2008, 08:36:15 PM

« anterior - próximo »

tamat

Pues nada, que he tratado de meter Newton en mi juego y aquí nada se mueve.

Primero me lian con que las matrices hay que trasponerlas con respecto a opengl, pero si lo hago entonces todo implosiona.

Si no traspongo entonces aquí nada se mueve, y eso que he puesto gravedades, aceleraciones, etc.

Me tengo que estar olvidando de algo pero miro los ejemplos y es mas o menos lo mismo, voy a hacer un pequeño mapa aquí para ver si veis algo que yo no veo:


//al crear el mundo
// Create the newton world
s_World = NewtonCreate (NULL, NULL);

Vector3 minWorld(-100000,-100000,-100000);
Vector3 maxWorld(100000,100000,100000);
NewtonSetWorldSize(s_World, minWorld.v, maxWorld.v);

//...

//al crear la entidad
//Set the collision
Matrix44 offset;
offset.setTranslation( mesh->center.x, mesh->center.y, mesh->center.z );
physics_collision = NewtonCreateBox (s_World, mesh->halfsize.x, mesh->halfsize.y, mesh->halfsize.z, offset.m);
physics_body = NewtonCreateBody (s_World, physics_collision);
NewtonReleaseCollision (s_World, physics_collision);
NewtonBodySetMatrix(physics_body, model.m );
Vector3 force (0.0f, -100, 0.0f);
NewtonBodySetForce (physics_body, force.v );


//...

//al updatear
NewtonUpdate (s_World, elapsed);

//...

//al pillar la model
NewtonBodyGetMatrix(physics_body, temp.m);
Por un stratos menos tenso

misscelan

Primero sacaría todo por pantalla para ver que hay realmente:


//esta en opengl pero creo que es muy claro

void DebugShowGeometryCollision(const NewtonBody* body, int vertexCount, const float *faceVertec, int id)
{

   glBegin(GL_LINE_LOOP);
   {
       while (vertexCount--)
       {
           glVertex3f(faceVertec[0] , faceVertec[1], faceVertec[2]);
           faceVertec += 3;
       }
   }
   glEnd();
}
NewtonBodyForEachPolygonDo (Body, DebugShowGeometryCollision);


Luego creo que las fuerzas sólo las tiene en cuenta dentro de callbacks ( lo mismo me estoy pasando de listo pero recuerdo algo así)

Tendrías que añadir esto a tu cuerpo:


void ApplyForceAndTorqueEvent (const NewtonBody* body)
{
///aplicar la fuerza
}
NewtonBodySetForceAndTorqueCallback(fBody, ApplyForceAndTorqueEvent);


Y por último no se cuanto de grande se va a hacer tu proyecto, si es muy grande mejor que cargues el mapa como un objecto BSP de newton y dejar que pelee el solo.

Espero que te sirva de ayuda.

UN saludo.

tamat

No conocía lo de sacar todo por pantalla, lo probaré.

Lo de usar los callbacks no me hace falta ya que ya tengo mi propio bucle de render, lo digo porque tambien probé de usar los callbacks y era lo mismo.

De momento no tengo mucha geometría, quería probar con dos cubos así que con Boxes ya tiraba.

Gracias por la ayuda
Por un stratos menos tenso

tamat

Nada, esto sigue sin mover nada.

He probado todas las funciones de debug habidas y por haber y dumpean la escena perfectamente, pero por mas update que hago con el timestep que me de la gana aquí todas las matrices que recupero son la misma que puse al principio.

Solo seteo la matriz de cada objeto una vez, al principio para posicionar los objetos.

He probado con diferentes cajas de colision y el render es correcto.

Pero no se mueve nada, estoy rayado de cambiar cosas.

Cualquier consejo será bienvenido.
Por un stratos menos tenso

tamat

Acabo de descubrir el fallo. El problema era que todo caía, incluido el suelo, y como la camara iba attachada a uno de los objetos pues no me daba cuenta. Cuando debugaba los valores no lo vi porque la gravedad era tan pequeña que no le afectaba.

En fin, ahora lo tengo mas o menos funcionando, pero tengo el problema de que mis objetos se hunden lentamente en el suelo. He probado cambiando propiedades como la gravedad, elasticidad, friccion, y softness pero nada, siguen hundiendose.

Alguien sabe por qué es?
Por un stratos menos tenso

Prompt

No se nada del newton, pero seguramente deberias detectar la colision con el suelo y hacer reaccionar el objeto ya bien sea desactivando la fisica en el o aplicando efectos hasta que se "pare".

Saludos.

tamat

Hasta donde yo se eso es tarea del motor de fisica, detectar la colisiones y reposicionar los objetos acorde al punto de colision.
Por un stratos menos tenso

vicho

sobre de que se undan en el suelo? de cuanto es tu timestep?

tamat

mi timestep es de 1/60, uso un collision tree enorme para la geometria del suelo, los objetos caen y al colisionar con el suelo toman la forma mas o menos correcta pero entonces empiezan a hundirse lentamente.
Por un stratos menos tenso

misscelan

Prueba a cambiar el orden de los vertices de las caras a ver si va a estar cogiendo la normal al revés

vicho

puede ser tambien la gravedad del mundo desestabilizando la simulacion. lo otro que e visto en otros engines como ODE es que esos problemas se pueden dar cuando se tienen parametros de la colicion muy grandes(en ODE por ejemplo el parametro CFM). no se como funcione newton

Hans

Yo uso el wrapper de Newton para Ogre, así que hay cosas que me salto, pero eso que cuentas de objetos hundiéndose es como si no hubieras activado el modo de colisión continua, lo que con objetos muy pequeños ocasiona que estos atraviesen a otros más grandes. También puede ocurrir por no haber definido relaciones de colisión entre objetos.

Marci

Me sonaba de haber visto algo asi. Es probable que ya lo hayas mirado pero por si acaso:

http://www.stratos-ad.com/forums3/viewtopic.php?t=10120&highlight=newton

tamat

Interesante, probaré todo lo que habeis dicho mañana y os digo qué tal ha ido.
Por un stratos menos tenso

tamat

He probado todo lo que me deciais y sigue sucediendo.

Las caras no estan invertidas (si las invierto entonces lo atraviesa directamente), el modo tunnelling está activado, ahora hago 100 steps por update con una fraccion mínima.

Pese a todo, mis objetos siguen hundiendose lenta e irremediablemente. :(
Por un stratos menos tenso






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.