2011-07-08 15 views
7

Hola, estoy tratando de integrar SFML y Box2D, y SFML ha hecho que los centros de configuración para sprites, formas, etc. sean muy fáciles. Box2D, por otro lado, estoy teniendo problemas ya que no puedo encontrar la forma de establecer o incluso encontrar el centro de una forma o accesorio.Cómo establecer centros de formas/instalaciones/cuerpos en Box2D

Me parece que cuando la adición de vértices manualmente a un b2_PolygonShape el centro se establece en el primer vértice en la matriz de vértice, pero los resultados son muy diferentes cuando se utiliza el funciones de acceso directo SetAsBox() o cualquier otra SetAs_ _(). El centro es el medio de la forma, o la mitad de la (s) extensión (es) de la caja/forma.

Necesito normalizar el sistema de centrado de box2D y SFML, pero no puedo entender cómo funcionan los sistemas de coordenadas locales para los objetos.

¿Cómo configuro/obtengo los centros de muchos objetos como formas, accesorios, cuerpos, etc. en Box2D?

+1

¿qué quieres decir con un centro de b2body? El centro de masa? – Andrew

+1

el centro que se utiliza para el posicionamiento en el sistema de coordenadas mundial mundial. No es el sistema de coordenadas del cuerpo local que supongo que se usa para colocar los elementos en un cuerpo. – Griffin

Respuesta

4

Ok Me di cuenta de que SFML y Box2D en realidad no eran tan diferentes, pero simplemente no estaba pensando en cómo las formas se hacen/renderizan correctamente en coordenadas mundiales.

A menos que se especifique lo contrario, (0,0) siempre se utiliza como punto/centro de referencia del objeto cuando se mueve/dibuja su posición, y cada vértice se dibuja en relación con ese punto.

el tutorial SFML era un poco complicado, ya que dijo establecer el centro de una forma/de sprite fue el desplazamiento desde la esquina superior izquierda del objeto, no (0,0).

-1

Usted puede simplemente hacer esto:

b2Body *body = ...; 
b2Vec2 pos = body->GetPosition(); 

Esta es la posición del cuerpo en el mundo (pos.x y pos.y, definido en metros). Esto significa que debe usar una relación, por ejemplo: 1 metro = 20 píxeles. Entonces, debes multiplicar las coordenadas por tu relación para obtener la posición en píxeles.

Utilice esa posición para dibujar sus imágenes. Si es necesario, puede agregar coordenadas a su imagen y dibujar la imagen en estas coordenadas relativas a la posición del cuerpo.

Tenga en cuenta que también debe dibujar sus imágenes con esa relación. Cuando la relación cambia (acercar o alejar), las imágenes también deben agrandarse.

Para mi juego, estoy usando SDL con OpenGL, que es una combinación muy buena, así que no sé exactamente cómo funciona SFML.

+0

estoy hablando del centro local, que afecta cómo las coordenadas globales terminan dibujando todos los vértices alrededor del centro local. – Griffin

2

Creo que con box2d usted es responsable de que el 'centroide' del polígono coincida con la posición de su cuerpo. Básicamente lo que tienes que hacer es algo como esto.

  • Calcular el centro de gravedad de su lista de vértices (b2vec)

  • Shift los vértices de -centroid.

Box2d proporciona las funciones necesarias para ayudarle con esta tarea. Lo que sucede con SetAs__ es que el centroide es (0,0) y el polígono se crea simétricamente alrededor del centro del cuerpo.

1

Lo intentaré de nuevo. Estoy bastante seguro de que puedo ayudarte, pero no entiendo completamente tu pregunta.

Un cuerpo tiene una posición (b2Vec2) en el mundo.
Un cuerpo tiene b2Fixture s (densidad, la fricción, la restitución, forma, etc ...)
El b2PolygonShape tiene vértices y los datos de masa. Esos vértices son relativos a la posición del cuerpo.

Ejemplo vértices de un b2PolgygonShape (rectángulo, tamaño: 1 metro * 1 metro)

(-0.5f, -0.5f) // left upper corner 
(0.5f, -0.5f) // right upper corner 
(0.5f, 0.5f) // right lower corner 
(-0.5f, 0.5f) // left lower corner 

tener en cuenta que no pueden ajustar los vértices usted mismo! Debe pasarlos a

b2PolgygonShape::Set(b2Vec2 *vertices, int count); 

Este método calculará los datos de masa, dependiendo de los vértices.

+0

Gracias por intentarlo, ¡pero lo descubrí! Mi pregunta era un poco confusa, pero descubrí que no importa qué 0,0 se utilice como punto de referencia cuando se renderiza la forma en coordenadas globales y mundiales. ¡Sabía que iba a ser obvio al final! – Griffin

0

Esto está relacionado, aunque estoy usando Box2DWeb y Easel.js en lugar de Box2D y SFML. El problema que encontré es que el regX/regY de Easel.js (el centro gráfico del sprite) necesita coincidir con el centro de masa físico.

Para un b2Body simple con un b2FixtureDef, el centro de masa del cuerpo coincide con el m_centroid del b2FixtureDef.shape (ya sea SetAsBox, SetAsArray, new b2CircleShape, etc.).

Para carrocerías de múltiples fijaciones y polígonos irregulares, lo que funcionó para mí fue agregar todos los accesorios (es decir, llamar a b2Body.CreateFixture), luego establecer el gráfico regX/regY igual a b2Body.m_sweep.localCenter.x/y (multiplicado por el factor de escala píxeles/metro).

Esto no funcionó para círculos y cajas simples, pero en primer lugar no fueron un problema. Espero que esto ayude.

Cuestiones relacionadas