simulando chipmunk

Started by Futu-block, October 29, 2011, 12:47:21 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

quiero hacer un movimiento rectilineo que segun vaya llegando a su destino decelere considerablemente la velocidad de avance, he intentado usar chipmunk pero ni zorra de nada; me gustaria ir poco a poco aprendiendo cada una de sus funciones ...


por otro lado lo he intentado con el seno de una circunferencia aplicado solo al eje y (que es el movimiento que quiero hacer) para conseguir el proposito ...


o alguien me enseña a manejar chipmunk para dummies de dumies (idiotas en mi pueblo) o me aconsejais alguna funcion matematica para que el movimiento no sea tan artificial


quiero simular una pseudo gravedad dentro del agua

KeoH

Yo te recomiendo q te veas un par de conceptos de física xD .. aqui te dejo una web que tiene ejemplos interactivos: http://www.sc.ehu.es/sbweb/fisica/

Drumpi

¿Qué tal moverte una fracción de la distancia que separa tu cosa de donde tiene que pararse? por ejemplo:

avanzar = distancia/10;
if (avanzar > max_velocidad) avanzar=max_velocidad; end
if (avanzar < 1) avanzar=1; end
y += avanzar;

He puesto 10 como podría haber puesto 3 o 20, eso ya es cuestión de que experimentes. Lo de <1 es porque cuando está cerca, la división empieza a valer 0 y nunca llega a su destino. Este método funciona mejor si se usa RESOLUTION.

Lo pruebas y, si te gusta, lo usas, si no, siempre puedes ir a la fórmula de movimiento rectilineo uniformemente acelerado y calcular a la distancia a la que debe empezar a frenar (y asegurarte que la cosa movil esa pasa por ese punto exacto o no se parará donde quieres :D).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

#3
vale, ya voy cogiendo onda, reparto de karmas :D
lo complicado viene ahora, me interesa que ese movimiento sea muy muy lento, pero el añadir 0.5 a la 'y' como que empana al proceso y no lo mueve...

¿hay otro metodo mas simple para que vaya super-pauperrimamente lento??


[edito]
definitivamente el metodo ''incremento de velocidad'' que me estaba apañando no me servia, y he vuelto al seno/angulo/etc...

Drumpi

Como he dicho: usa resolution ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

Estas cosas son las que ni en la biblia ni en el wiki te dicen como van...

no me entero de ná; ¿¿resolution para que es y como funciona??

al parecer resolution hay que asignarle un valor, pongamos que 3, no se pa que...
a continuacion lo pongo que para que al pulsar una tecla me avance una tercera parte de un pixel pero no hace nada

no entiendo nada de nada de resolution y eso que le estoy dando mas vueltas

Drumpi

Vamos a ver: por defecto, si a X le sumas 1, el proceso avanza un pixel horizontalmente.
Si a su variable LOCAL resolution le asignas el valor 3, para que el proceso avance un pixel tienes que sumarle a X 3, por lo que si en cada frame le sumas 1 tardará 3 frames en avanzar al siguiente pixel.

Si le pones 100, los valores que sumes a X e Y, o los que uses con advance, valdrán centésimas de pixel (aunque visualmente sólo se notará el movimiento de pixel en pixel, pero es porque el pixel es la unidad mínima de representación de una imágen).

Resalto que la variable es LOCAL, por lo que cada proceso tendrá la suya, que puede ser tu problema, y que te los puede causar cuando tengas dos procesos con resolutions distintas interactuando entre sí.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

Aaaaah...
migo, que es una
Quote from: Drumpi on November 01, 2011, 07:14:56 PM
variable LOCAL, por lo que cada proceso tendrá la suya
fijate tú como una pamplina tan grande me vuelve loco de tal manera...

ahora al ponerlo dentro de cada proceso tambien hay que cambiarle la posicion de inicio ¿no?
si resolution vale 3 y estaba a 100, tendré que situarlo en 300 ¿no?

KeoH

Quote from: Futublock on November 02, 2011, 08:51:38 AM
si resolution vale 3 y estaba a 100, tendré que situarlo en 300 ¿no?

O en 100*resolution ... y asi no tienes q cambiar todo si cambias resolution xD

Drumpi

CUIDADO: si se va a multiplicar por resolution, aseguraos antes de que este no vale 0, QUE ES SU VALOR POR DEFECTO. Ya tuve mis más y mis menos por lo mismo.
Una solución a esto es definir, al menos, resolution a 1 en todos los procesos, por si acaso (aunque no sé si esto incrementará los cálculos internos).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Prg

#10
si quieres una aceleración y desaceleración en chipmunk lo que tienes que hacer es definir la viscocidad del mundo con gphysics.damping=0.8;                           //Viscosidad entre 0 y 1

y para aplicar el impulso se usa

APPLYIMPULSE(id,1000,100,0,0);

por ejemplo:

Quote//PRG, ejemplo para el motor de física

import "mod_key";
import "mod_text";
import "mod_proc";
import "mod_grproc";
import "mod_video";
import "mod_wm";
import "mod_map";
import "mod_say";
import "mod_math";
import "mod_screen";
import "mod_chipmunk"

global
        //gráficos
    cuadro;
    bola;
    bomba;

Begin
    set_mode(800,600,32);

    bola=map_new(20,20,32);
    map_clear(0,bola,0FFFFFF00h);
     gphysics.damping=0.8;                           //Viscosidad entre 0 y 1

    //Cantidad de correcció de intersección cada frame/phresolution
        gphysics.bias_coef=0;


    bomba(250,150,10.0);

while (!key(_esc))

        frame;

    end
    let_me_alone();
end
process bomba(x,y,float masa)
private
    cpVect pos;
    pego=true;           //se considera que la bomba inicia tocando al protagonista
cpVect    velocidad;

begin

        lphysics.mass=masa;
    priority=father.priority-2;
    lphysics.group=2;
    lphysics.elasticity=0.3;
    lphysics.friction=0;
    graph=bola;
    lphysics.ShapeType=TYPE_CIRCLE;
    forceCreateBody();
    //Antes de llamar a getOptimalInertia hay que actualizar el cuerpo, ya sea forzando su creación (cuando éste aún no existe) o haciendo un frame(v) antes, con v igual a cualquier valor o sin v.
        lphysics.inertia=GETOPTIMALINERTIA(lphysics.ShapeType,lphysics.shape);
        write_var(0,400,300,4,velocidad.x);
        write_var(0,400,350,4,velocidad.y);
        APPLYIMPULSE(id,1000,100,0,0);
    while (!key(_esc))
    getBody(lphysics.body,CP_C_V,&velocidad);
        frame;

    end
end

también puedes aplicar fuerzas en lugar de impulsos y usar updateVelocity para desacelerar más rápido los cuerpos.

Si lo quieres hacer desde bennu puedes usar alguna función como logaritmos o  seno usando rangos adecuados, algo así:

Quoteprocess avd()
private int av=-90000;
begin
  x=100;
  y=100;
  graph=bola;
  loop
    if (av<0)
      av+=300;
      x-=sin(av)*4;
    end
    frame;
  end
end
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)