¿Cómo calculo las fuerzas ejercidas por un alambre tenso que envuelve objetos 2D?
10
Supongamos que tengo una física primitiva que voy a llamar un "cable", envuelto alrededor de un entorno 2D (como se describe en esta pregunta ).
Aquí hay una ilustración de cómo se vería eso:
En la ilustración de ejemplo: el cable tira de la caja hacia arriba (la sostiene) y la caja tira del cable hacia abajo. El objeto empuja hacia abajo el resorte, pero también lo empuja hacia arriba.
Si bien aún no he descubierto cómo implementarlo, suponga que el cable se deslizará libremente a través de los puntos que lo envuelven.
En una simulación de física 2D (es decir, basada en cuadros), ¿cómo calcula las fuerzas (o impulsos) que se aplican a los objetos que están unidos o envueltos por un cable como este?
Como aludí en mi primera pregunta , imagino que si el único objeto no estático "en" el cable fuera la masa al final, entonces la fuerza sería idéntica a una unión de longitud fija entre la masa y el punto anterior eso en el cable.
La caja que tira del cable aplica una tensión al cable. La tensión es una fuerza, medida en Newtons. Si hacemos algunos supuestos simplificadores (sin fricción entre el cable y el entorno), entonces la tensión es la misma en todos los puntos a lo largo del cable.
Si consideramos que su ejemplo es estático, la tensión en el cable es solo el peso de la caja:
T = m * g
donde m es la masa de la caja yg es la aceleración debida a la gravedad (es decir, 9.8 m / s ^ 2). Tenga en cuenta que esto solo es válido en el caso estático, consulte a continuación para obtener una explicación de cómo calcularlo en el caso dinámico.
La fuerza en cada curva en el cable es entonces solo la proyección de la tensión en la dirección correspondiente. Por ejemplo, la fuerza en la punta del objeto de resorte es una fuerza a lo largo del contacto normal, de magnitud:
F = T * cos(angle between wire and contact normal)
En este caso, la dirección normal del contacto sería la bisección del ángulo entre los segmentos del cable. La fuerza en su segundo punto marcado sobre el medio ambiente es irrelevante, ya que no tiene impacto en la tensión ni en ninguna otra cosa.
Ahora, en el caso dinámico, la tensión es simplemente la fuerza de restricción que aplica a la caja para mantenerla unida al cable. Entonces, si el motor de física está basado en impulsos, la tensión es solo:
T = impulse / timestep
Esto lleva al algoritmo general para envolver el cable alrededor del entorno también. La propiedad importante es la longitud total del cable. Solo el último segmento necesita ser simulado, todos los segmentos anteriores pueden considerarse fijos. Por lo tanto, se conoce la longitud del último segmento, solo resta las longitudes de los segmentos anteriores de la longitud total. Entonces el último segmento puede ser una simple restricción de resorte. Luego, simplemente divida un segmento cada vez que se cruza con el entorno y elimine la división cuando la curva se endereza.
Entonces, solo para aclarar: tendría la masa libre en una junta de longitud fija que se adhiere al mundo en la próxima "curva" en el cable. Averiguo qué impulso aplica esa junta a la caja de cada cuadro, y desde allí puedo obtener la tensión en el cable.
Andrew Russell
Además, estoy preocupado F = T * cos(angle between wire and spring axis). ¿Qué ángulo exactamente? Además: no creo que (en la simulación) haya una forma sensata de hacer que el cable "sepa" que hay un resorte conectado a ese objeto.
Andrew Russell
@ Andrew - Para su primer punto, sí, la fuerza aplicada a la caja por la articulación es, por definición, igual a la tensión en el cable. Para su segundo punto, tiene razón, esto no estaba muy claro, en realidad es el ángulo entre el cable y el punto de contacto normal. He editado la respuesta para aclarar esto.
Niall
4
Definitivamente aprecio tu frustración en estos hilos basados en cables, es un problema difícil de resolver. Nunca conseguimos que la colisión funcione perfectamente, pero la simulación de restricciones es definitivamente factible y sencilla.
Una restricción de cable es en realidad casi idéntica a una restricción de distancia regular. En lugar de dos puntos de restricción, tiene n + 1 para un cable con n segmentos, uno para cada vértice: en los puntos finales, el jacobiano es idéntico a una restricción de distancia (es decir, es algo así como d / | d | donde d es el vector entre puntos), y para los nodos internos, el jacobiano es algo así como (a / | a | - b / | b |) donde a y b son los vectores del nodo a los nodos adyacentes. (Lo siento, han pasado un par de años desde que toqué esto ...)
No puede fingir a-la "solo el último segmento es dinámico" porque, como en su ejemplo, los objetos pueden interactuar con otros segmentos, pero solo necesita simular masas en los extremos de la cuerda, internamente la cuerda puede ser sin masa Los impulsos de restricción calculados en cada nodo deben aplicarse al objeto que colisiona en ese nodo.
Los tres primeros son relativamente recientes y deberían ayudar mucho. La página 75 del documento inferior describe una restricción "multibar" que es esencialmente un cable.
La idea básica es que la longitud de la cuerda sigue siendo la misma. Si se está empujando hacia arriba, deberá crear un "punto de división" allí. Luego, la cuerda determina de qué lado está unida, porque no puede "crecer" en esa dirección. Debido a que está unido a algo a la derecha, el trozo de cuerda a la izquierda se acortará y la pieza entre el punto de división y el punto adjunto se hará un poco más largo. Luego, como dijo Niall, calcule la tensión del cable. Cómo haría esto es calcular la tensión de cada "pieza" de cuerda. Luego puede usar esto para determinar las fuerzas involucradas.
F = T * cos(angle between wire and spring axis)
. ¿Qué ángulo exactamente? Además: no creo que (en la simulación) haya una forma sensata de hacer que el cable "sepa" que hay un resorte conectado a ese objeto.Definitivamente aprecio tu frustración en estos hilos basados en cables, es un problema difícil de resolver. Nunca conseguimos que la colisión funcione perfectamente, pero la simulación de restricciones es definitivamente factible y sencilla.
Una restricción de cable es en realidad casi idéntica a una restricción de distancia regular. En lugar de dos puntos de restricción, tiene n + 1 para un cable con n segmentos, uno para cada vértice: en los puntos finales, el jacobiano es idéntico a una restricción de distancia (es decir, es algo así como d / | d | donde d es el vector entre puntos), y para los nodos internos, el jacobiano es algo así como (a / | a | - b / | b |) donde a y b son los vectores del nodo a los nodos adyacentes. (Lo siento, han pasado un par de años desde que toqué esto ...)
No puede fingir a-la "solo el último segmento es dinámico" porque, como en su ejemplo, los objetos pueden interactuar con otros segmentos, pero solo necesita simular masas en los extremos de la cuerda, internamente la cuerda puede ser sin masa Los impulsos de restricción calculados en cada nodo deben aplicarse al objeto que colisiona en ese nodo.
Aquí hay algunos documentos relacionados:
Los tres primeros son relativamente recientes y deberían ayudar mucho. La página 75 del documento inferior describe una restricción "multibar" que es esencialmente un cable.
Buena suerte :)
raigan
fuente
La idea básica es que la longitud de la cuerda sigue siendo la misma. Si se está empujando hacia arriba, deberá crear un "punto de división" allí. Luego, la cuerda determina de qué lado está unida, porque no puede "crecer" en esa dirección. Debido a que está unido a algo a la derecha, el trozo de cuerda a la izquierda se acortará y la pieza entre el punto de división y el punto adjunto se hará un poco más largo. Luego, como dijo Niall, calcule la tensión del cable. Cómo haría esto es calcular la tensión de cada "pieza" de cuerda. Luego puede usar esto para determinar las fuerzas involucradas.
Espero que esto ayude.
fuente