Mantener la rotación entre dos objetos.


9

En mi juego XNA tengo dos objetos que chocan. Cuando el primer objeto colisiona con el otro, puede engancharse y moverse por el mundo. Tengo un problema con las matemáticas aquí (las matemáticas no son mi punto fuerte). Actualmente tengo el segundo objeto enganchado al primero y me muevo con él, pero no puedo lograr que mantenga su dirección original. Por lo tanto, si el objeto está hacia arriba, debe mantener esta dirección en relación con la forma en que se gira con el elemento original.

ingrese la descripción de la imagen aquí

¿Algún consejo sobre cómo podría lograr esto mejor?


Creo que ambos objetos rotarían sobre el eje del centro del otro objeto.
MichaelHouse

Respuestas:


3

En lo que respecta al ángulo, solo mantenga el ángulo del segundo objeto igual al ángulo del primero. Para la posición, cuando los dos objetos colisionan entre sí, encuentre la distancia del segundo objeto al primero usando la fórmula de la distancia.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Para encontrar la posición del segundo objeto en relación con el primer objeto:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

Además de la respuesta de @ tesselode, te recomendaría que mantengas una lista de objetos adjuntos para cada objeto mundial en tu juego. Algo en la línea de List<WorldObject> AttachedObjects. Luego, cuando detecte una colisión, agregaría el rectángulo negro al rojo AttachedObjects. Después de eso, solo es cuestión de actualizar las posiciones de los niños utilizando el método de @tesselode cada vez que actualice la posición de los padres.


2

Supongo que uno de los dos tendrá control sobre el otro, al igual que una carretilla elevadora. En su dibujo, supongo que este es el negro, y el rojo es el paquete. Solo mencionas que tienes problemas con los ángulos, así que eso es todo lo que cubriré.

Cuando los objetos se unen, debes recordar la diferencia de ángulo entre los dos (llamaré a esto Theta). Dibujé esto en la figura 2 con las flechas de la primera figura dibujadas una sobre la otra. Hasta que los objetos se desenganchen, el ángulo del objeto rojo estará determinado por el ángulo del negro más Theta, como se muestra en la figura 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Diferencia de ángulo


1

Podría implementar la capacidad de tener objetos secundarios para un objeto (donde los objetos secundarios se verían afectados automáticamente por los cambios en la posición / rotación del elemento primario). Luego, en caso de colisión, cuando deberían engancharse, crea un objeto invisible y convierte ambos objetos adjuntos en sus hijos. Luego, en lugar de aplicar transformaciones (movimiento, rotación) en los objetos individuales, lo aplica en el grande, O aún podría aplicar fuerzas a los objetos secundarios individuales, lo que marcaría "¿Tengo un padre?", Y si Sí, la fuerza se enviaría al padre (que fusionaría las fuerzas de todos los objetos secundarios en un vector que se aplicaría a sí mismo).

Además, este enfoque debería manejar adecuadamente su rotación, si calcula el centro de masa para el padre invisible de acuerdo con los pesos de los objetos enganchados, que el método de John no parece lograr (el objeto unido gira alrededor de su nuevo centro de masa compartido, no alrededor del centro de masa de uno de los objetos), y fácilmente podría anidar este tipo de comportamiento sin ningún código adicional requerido. Parece ser el enfoque más robusto y flexible.

+ condición si la fuerza aplicada al niño es lo suficientemente fuerte como para romper la articulación, y puede manejar el "desenclavamiento" simplemente quitando la relación padre-> niño. Si solo queda un niño, también lo hace separado y elimina también el padre invisible.

Puedo proporcionar más detalles (con imágenes y al menos pseudocódigo y demás) si está interesado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.