2010-06-10 12 views
13

Usando Bullet 2.76 Estoy tratando de congelar un objeto (cuerpo rígido) para que deje de moverse instantáneamente, pero aún así responde a las colisiones.Motor de física de bala, cómo congelar un objeto?

Intenté configurar su estado de activación en DISABLE_SIMULATION, pero luego es prácticamente inexistente para otros objetos. Además, si los objetos "chocan" con él cuando está desactivado, comienzan a suceder cosas extrañas (los objetos caen a través de cuerpos estáticos, etc.)

Supongo que convertirlo temporalmente en un cuerpo rígido estático podría funcionar, pero ¿hay algún problema? ¿existe una forma "nativa" de lograr esto por parte de Bullet?

Edit: ¿Hay alguna forma de desactivar la gravedad para un objeto específico?

Respuesta

6

La documentación es un poco escaso, pero es de suponer que el método más adelante se podría utilizar para desactivar la gravedad sobre un cuerpo específico:

void btRigidBody::setGravity(const btVector3 &acceleration) 
+0

Esto es todo! Uno tiene que encargarse de la desactivación después de colisiones, etc. ¡pero funciona! ¡Perfecto! ¡Muchas gracias! – sunside

1

establecen la velocidad y la cantidad de movimiento en cero y configuran la masa en un número realmente grande.

+0

No se pudo probar todavía, pero ¿realmente no congela el objeto si está en el aire? (Y, bueno, mantenlo ahí?) – sunside

+0

Lo hace si estás usando las ecuaciones reales para la gravedad: F = G * (m1 * m2)/r^2 Sin embargo, la mayoría de los motores no usarían esta ecuación y simplemente asumirían constante gravedad (F = m * g) por lo que también deberías desactivar la gravedad y cualquier otra fuerza constante para este objeto. Sin embargo, esto debería funcionar para cualquier fuerza elástica y para su motor de colisión (que probablemente usa fuerzas elásticas). – eeeeaaii

+0

Entonces la pregunta es: ¿Cómo desactivo la gravedad para un objeto específico (en Bullet)? – sunside

4

Hay funciones para btRigidBody llamados setLinearFactor(x,y,z) y setAngularFactor(x,y,z) que permiten limitar movimiento a lo largo de un eje específico y rotación alrededor de un eje específico, respectivamente. Llamar a ambas funciones con todos los 0 como argumentos deberían detener todo movimiento. Llamarlos de nuevo con todos 1's permitirá el movimiento nuevamente.

2

Para este método para detener a su actor debe llamar a este cada cuadro de actualización.

void StopActor() 
{ 
    m_pRigidBody->setLinearVelocity(btVector3(0,0,0)); 
} 
3

Establecer el estado de activación a cero. Esto es lo que sucede cuando el objeto duerme de forma natural. La gravedad y demás no tendrán efecto hasta que se despierte nuevamente.

rigidBody->setActivationState(0); 

A continuación, al igual que cualquier objeto de dormir, puede ser despertada en una colisión o si se aplica una fuerza a la misma.

+0

entonces, ¿cómo lo despiertas? – MiniGod

+0

@MiniGod Aplica una fuerza, ya sea directamente o mediante una colisión. – weston

+0

esto significa que también podríamos hacerlo dormir en el aire? también, desafortunadamente esto parece no estar expuesto en el contenedor de balas JMonkeyEngine –

Cuestiones relacionadas