CHIPMUNK en bennu

Started by Prg, January 12, 2011, 04:27:44 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

bueno, quizas no sea esta la liberia adecuada o habra que ajustar esos settings... pero ya la iniciativa, la experiencia que estas adquiriendo y ver algo funcionando con fisica es un gran paso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

He visto escrito que eso pasa en más librerías, quizás hay que hacer las cosas con más cariño...

Prg

Quote from: SplinterGU on January 14, 2011, 11:34:24 AM
bueno, quizas no sea esta la liberia adecuada o habra que ajustar esos settings... pero ya la iniciativa, la experiencia que estas adquiriendo y ver algo funcionando con fisica es un gran paso...

pue si.. je je
Ya he probado variar los valores y nada...

Quote from: josebita on January 14, 2011, 12:23:23 PM
He visto escrito que eso pasa en más librerías, quizás hay que hacer las cosas con más cariño...

ja ja ja... eso si que puede ser verdad XD

las rotaciones hay que manejarlas muy cuidadosamente, ya que conforme te alejas del centro del objeto la distancia que hay que moverse para corregir la posición es mayor, e incluso puede dejar al cuerpo del otro lado.

bueno, de todos modos pasaré la librería... no creo que sobre... aunque ahora me lo tomaré con más calma.

saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Prg

Jo jo...
corregido

y agrego mover la pelota con mouse.left
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ahora quedo casi perfecto, pasa mas precision los objetos fijos, como la barra tienen que tener una prioridad de proceso mayor, sino la pelota se sigue metiendo en la barra, menos, pero sigue.

podrias enumerar las cosas que se pueden setear/controlar con esto de la fisica?

a mi se me ocurre que podrias agregar algunas variables locales, como ser (quizas algunas sobren o falten otras, es una idea):

- si interactua con el motor de fisica o no
- forma del objeto (circular, rectancular)
- si es fijo o movil
- obtener el tamaño del objeto en base al tamaño del grafico (y quizas size tambien)
- el angulo, que sea el angulo
- tipo de superficie (esto imagino que tendra algo que define que resistencia o material es, supongo que no es lo mismo un liquido o una superficie pegagosa, que una resbaladiza o una aspera o una lisa, no se como o si permite definir estas cosas)
- peso del objeto

variables globales:

- gravedad

crear un proceso controlador de la fisica (physical_engine), que se encargue de buscar todos los procesos que van a interactuar con el motor de fisica y que se encargue de actualizar los datos que correspondan en cada momento, o tambien podes hacer como hizo windgate, que puso un proceso que se lanzaba dentro del proceso que querias meter como 3D y este controlaba y mantenia los aspectos del 3D de su padre (o sea, el proceso que queria meter en 3D), solo que vos lo harias no para 3d sino para la fisica. y tambien se encargaria de los aspectos globales.
este controlador luego se puede pasar a C.

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

otra cosa que no se, es si esta lib solo permite fisica de juegos visto de costado o tambien permite para juegos de vista aerea.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

pues para vista aerea, se podría usar capas, las cuales permiten que ciertos objetos que colisionan, pero que no pertenecen a la misma capa, no reaccionen.

lo de la lista de formas de objetos y demás lo podría hacer en bennu y luego tu me ayudarías a pasarlo a C, esto lo haré cuando termine lo que me hace falta de la librería que ya es poco (constraits, detección de colisiones y algunos otros temas menores), esto debido a que aún no conozco toda la librería, conforme voy pasando las funciones voy conociéndolas (y enamorándome de lo fácil que es hacer cómo funciona la física).

Para lo que no veo la solución es para el caso del modo 7, debido al uso de height...

Bueno, nos vemos el domingo. saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

no me preocupa el modo 7 en principio...

la idea seria no tener que usar ninguna funcion fisica desde el lenguaje, sino que todo se haga automatico seteando variables globales y locales...

si logramos eso, seria grandioso, y podria integrarse como engine fisico oficial (o recomendado oficialmente)... si asi lo quieres, sino que queda como un engine externo...

yo te ayudo con la parte de C.

hasta el domingo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

Primero me gustaría dejar las variables que hay que modificar para que los objetos no se introduzcan como sucedía en el ejemplo anteriormente

QuoteMagic Collision Detection Globals:

Chipmunk contains a few global variables that control how collisions are solved. They can't be set on a per space basis, but most games wont need to change them at all.

extern cpFloat cp_bias_coef

Because Chipmunk does not perform swept collisions, shapes may overlap. Each time you call cpSpaceStep() Chipmunk fixes a percentage of the overlap to push the shapes apart. By default, this value is set to 0.1. With this setting, after 15 steps the overlap will be reduced to 20%, after 30 it will be reduced to 4%. This is usually satisfactory for most games. Setting cp_bias_coef to 1.0 is not recommended as it will reduce the stability of stacked objects.

extern cpFloat cp_collision_slop

Chipmunk's impulse solver works by caching the last solution as it is likely to be very similar to the current one. In order to help keep objects touching, Chipmunk allows objects to overlap a small amount. By default this value is 0.1. If you are using pixel coordinates you won't even notice. If using a different scale, adjust the value to be as high as possible without creating any unwanted visual overlap.

extern cpTimestamp cp_contact_persistence

This is how many steps the space should remember old contact solutions. The default value is 3 and it's unlikely that you'll need to change it.

luego, comenzaré a comentar las propiedades que me comentabas en la lista, si se puede o no:
____________________________________________________________
primero hablaré sobre los componentes de chipmunk (lo que he aprendido)

body
el body (el cuerpo del proceso, pero no la parte que colisiona). Sus propiedades son:

    * velocity_func – cpBodyVelocityFunc: Function pointer called to update the velocity of the body.
    * position_func – cpBodyPositionFunc: Function pointer called to update the position of the body.
    * m – cpFloat: Mass of the body.
    * i – cpFloat: Moment of inertia (MoI or sometimes just moment) of the body. The moment is like the rotational mass of a body. See below for function to help calculate the moment.
    * p – cpVect: Position of the body.
    * v – cpVect: Velocity of the body.

    * f – cpVect: Current force being applied to the body. Note: does not reset automatically as in some physics engines.
    * a – cpFloat: Current rotation angle of the body in radians.
    * w – cpFloat: Current rotational velocity of the body.
    * t – cpFloat: Current torque being applied to the body. Note: does not reset automatically as in some physics engines.
    * rot – cpVect: Cached unit length rotation vector.
    * v_limit – cpFloat: Maximum speed a body may have after updating it's velocity.
    * w_limit – cpFloat: Maximum rotational speed a body may have after updating it's velocity.
    * data – cpDataPointer: A user definable data pointer. If you set this to point at the game object the shapes is for, then you can access your game object from Chipmunk callbacks.

shape
El shape es la parte que colisiona. un body se puede formar por muchos shapes (yo sólo he hecho bodyes de un shape)

las propiedades son:

# body – cpBody*: The rigid body the shape is attached to.
# bb – cpBB: The bounding box of the shape. Only guaranteed to be valid after cpShapeCacheBB() or cpSpaceStep() is called. Moving a body that a shape is connected to does not update it's bounding box.
# sensor – cpBool: A boolean value if this shape is a sensor or not. Sensors only call collision callbacks, and never generate real collisions.
# e – cpFloat: Elasticity of the shape. A value of 0.0 gives no bounce, while a value of 1.0 will give a "perfect" bounce. However due to inaccuracies in the simulation using 1.0 or greater is not recommended however. See the notes at the end of the section.
# u – cpFloat: Friction coefficient. Chipmunk uses the Coulomb friction model, a value of 0.0 is frictionless. Tables of friction coefficients. See the notes at the end of the section.
# surface_v – cpVect: The surface velocity of the object. Useful for creating conveyor belts or players that move around. This value is only used when calculating friction, not resolving the collision.
# collision_type – cpCollisionType: You can assign types to Chipmunk collision shapes that trigger callbacks when objects of certain types touch. See the callbacks section or an example for more information.
# group – cpCollisionGroup: Shapes in the same non-zero group do not generate collisions. Useful when creating an object out of many shapes that you don't want to self collide. Defaults to CP_NO_GROUP.
# layers – cpLayers: Shapes only collide if they are in the same bit-planes. i.e. (a->layers & b->layers) != 0 By default, a shape occupies all bit-planes. Wikipedia has a nice article on bitmasks if you are unfamiliar with how to use them. Defaults to CP_ALL_LAYERS.
# data – cpDataPointer: A user definable data pointer. If you set this to point at the game object the shapes is for, then you can access your game object from Chipmunk callbacks.

space

Este sería nuestro mundo, aquí agregamos los bodyes

sus propiedades son:
# iterations – int: Allow you to control the accuracy of the solver. Defaults to 10. See the section on iterations above for an explanation.
# gravity – cpVect: Global gravity applied to the space. Defaults to cpvzero. Can be overridden on a per body basis by writing custom integration functions.
# damping – cpFloat: Amount of viscous damping to apply to the space. A value of 0.9 means that each body will lose 10% of it's velocity per second. Defaults to 1. Like gravity can be overridden on a per body basis.
# idleSpeedThreshold – cpFloat: Speed threshold for a body to be considered idle. The default value of 0 means to let the space guess a good threshold based on gravity.
# sleepTimeThreshold – cpFloat: Time a group of bodies must remain idle in order to fall asleep. The default value of INFINITY disables the sleeping algorithm.
# staticBody – cpBody: A statically allocated infinite mass body that the space uses to substitute for NULL bodies on shapes and constraints. Set the space->staticBody.data pointer to something helpful if you want to have some context from within callbacks.


Constraints

A constraint is something that describes how two bodies interact with each other. (how they constrain each other) Constraints can be simple joints that allow bodies to pivot around each other like the bones in your body, or they can be more abstract like the gear joint or motors.

sus propiedades son:

# a – cpBody*: The first body that the constraint acts on.
# b – cpBody*: The second body that the constraint acts on.
# maxForce – cpFloat: is the maximum force that the constraint can use to act on the two bodies. Defaults to INFINITY.
# biasCoef – cpFloat: is the percentage of error corrected each step of the space. (Can cause issues if you don't use a constant time step) Defaults to 0.1.
# maxBias – cpFloat: is the maximum speed at which the constraint can apply error correction. Defaults to INFINITY.
# data – cpDataPointer: A user definable data pointer. If you set this to point at the game object the shapes is for, then you can access your game object from Chipmunk callbacks.

http://www.youtube.com/watch?v=ZgJJZTS0aMM&feature=player_embedded

a mi se me ocurre que podrias agregar algunas variables locales, como ser (quizas algunas sobren o falten otras, es una idea):

- si interactua con el motor de fisica o no     
En el memento que un shape se agrega a un body, el motor de física lo usa. Los cuerpos se pueden dormir, pero esto equivale a hacer un freeze en bennu
Quote
An example of how this could be used is to set up a piles of boxes that a player can knock over. Creating the piles and letting them fall asleep normally would work, but it means that all of the boxes would need to be simulated until they fell asleep. This could be slow if you had a lot of piles. Instead you can force them to sleep and start the game with the boxes already sleeping.

Another example would be collapsing platforms. You could create a sleeping object that is suspended in the air. As soon as the player comes along to jump on it, it wakes up and starts falling. In this case, it would be impossible to have the platform fall asleep naturally.
Esta indicación sería para hacer las correcciones en el body de su x e y (cuando se cambian las coordenadas del proceso, hay que cambiar también las del boody, igual a la inversa), angle y momento de inercia. quizá también para eliminar el body cuando el proceso muere; cuando el proceso se duerme no sabría como hacerlo.


- forma del objeto (circular, rectancular)
Existen tres formas de cuerpo: circular, linea y polígono. Recordemos que un body se puede hacer de varios shapes, así que la forma del objeto de un proceso puede ser tan complicada como lo necesitemos (esto complica hacer el cuerpo con simples seteos). Además un body poligonal se forma de una lista de vértices, esto lo complica un poco más, pero lo hace más potente.

- si es fijo o movil
esto es sencillo, un cuerpo fijo no se mueve a menos que se force el movimiento, como en el caso de nuestro rectángulo que gira. Otro cuerpo no lo moverá ni la gravedad

- obtener el tamaño del objeto en base al tamaño del grafico (y quizas size tambien)
Se puede obtener el área

- el angulo, que sea el angulo
Esto es secillo, tanto de leer como de escribir, es una propiedad del body

- tipo de superficie (esto imagino que tendra algo que define que resistencia o material es, supongo que no es lo mismo un liquido o una superficie pegagosa, que una resbaladiza o una aspera o una lisa, no se como o si permite definir estas cosas)
esto se define por elasticidad y frección. la viscosidad es una propiedad de todo el space

- peso del objeto
La masa del objeto y el momento de inercia son propiedades del body, y su lectura y escritura es sencilla.

variables globales:

- gravedad
esta es una propieada del espacio, así como la viscosidad

existen también las globales que puse al principio


En chipmuk no he visto size (cambiar el tamaño)
____________________________________________________________

también quiero poner un enlace al tema que lo comenzó todo:
http://forum.bennugd.org/index.php?topic=1534.0

y para finalizar decir que he terminado de pasar todas las funciones de chipmunk a bennu, ahora hay que comenzar a integrarlo más nativamente.

...
sería genial que el motor se pudiera dejar como el oficial, o como algún recomendado... es muy bueno, quizá no tiene todo lo que quisiéramos, pero tiene muchas cosas que no nos imaginábamos como los constraits que permiten hacer bones o motores.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

crashon182

www.elbooz.com.ar - Cursos online Gratuitos!

Prg

#26
gracias amigo.

una preguntita:

cpSpace *Space;
int space;

void __bgdexport( libchipmunk, module_initialize )()
{
   cpInitChipmunk();
   Space = cpSpaceNew();
   cpSpaceInit(Space);
   space=(int)Space;
   printf("%d %d\n",space,Space);
}


void __bgdexport( libchipmunk, module_finalize )()
{
   cpSpaceFreeChildren(Space);
   cpSpaceFree(Space);
   printf("Descargado");
}

char * __bgdexport( libchipmunk, globals_def ) =
"space;\n"
;
DLVARFIXUP __bgdexport( libchipmunk, globals_fixup )[] =
{
{ "space", NULL, -1, -1 },
{ NULL, NULL, -1, -1 }
};

space no toma valor en bennu, cómo le hago?

en bennu, en el main está este código:

[code language="bennu"]Begin
   set_mode(800,600,32);
   graph=load_png("pelota.png");

   say(space);[/code]

la salida en la consola es:

Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "bgdi" ejem

14167448 14167448
0
> Execution finished.

y luego crash

que me falta?
esto es ya para ir automatizando, que elimine la memoria de la librería al cerrar el programa, y que al iniciar el programa haga el espacio para comenzar a agregar bodies.

lo demás lo haré en el .h desde bennu, pero aprovechando que la dll se entera cuando el programa inicia y finaliza, quiero hacer esto ya desde aquí.

saludos

pd: el nombre de la librería lo he cambiado a libChipmunk, para que sea más acorde y no milib como antes.

pd2: si me reconoce la variable, pero no le asigna el valor que debería tener. intenté darle la posición de memoria de space pero nada
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

al declararla asi la estas declarando como int.

tenes que crear la estructura, como la crearias en bennugd, o sea, en la string de global, pones la estructura tal cual la crearias en bennugd, esa string es como crear un .h con la definicion en bennugd.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

yo la que quiero sacar es la variable que es entero, la otra tiene mayúscula la primera letra y es un puntero. En bennu trabajo con enteros en lugar de usar punteros a estructuras. he cambiado el nombre de la variable, y me sigue arrojando 0

[code language="bennu"]int space234;

void __bgdexport( libchipmunk, module_initialize )()
{
    cpInitChipmunk();
    space234 = (int)cpSpaceNew();
   cpSpaceInit(space234);
   printf("%d\n",space234);
}


void __bgdexport( libchipmunk, module_finalize )()
{
    cpSpaceFreeChildren(space234);
    cpSpaceFree(space234);
    printf("Descargado");
}

char * __bgdexport( libchipmunk, globals_def ) =
"space234;\n"
;
DLVARFIXUP __bgdexport( libchipmunk, globals_fixup )[] =
{
{ "space234", NULL, -1, -1 },
{ NULL, NULL, -1, -1 }
};[/code]

Quote> Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "bgdi" pruebas

34821824
0
Descargado
> Execution finished.

De cualquier forma, ya he comenzado a meter código bennu en el .h para facilitar el uso de la librería en bennu, como habíamos quedado. Cuando termine te lo paso para que lo revises y que le hagas lo que consideres necesario.

saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

claro, ya veo... lo tenes que hacer asi...


#define SPACE234    0

para usarla tenes que poner

GLODWORD( libchipmunk,  SPACE234 )

y elimina el

int space234;

del codigo C

el valor 0, es porque es la primer variable definida en el fixup
Download Lastest BennuGD Release: http://www.bennugd.org/node/2