Me gustaría recrear este juego , pero no tengo idea de cómo crear la cuerda o sus influencias en la pelota.
Básicamente, hay una cuerda, "unida", en un extremo, al puntero del mouse, y en el otro extremo atado a una bola masiva. A medida que el usuario mueve su mouse, la cuerda y la pelota lo siguen, como si balanceara un mayal en la vida real.
¿Cómo haría para crear una cuerda como en el juego anterior?
Necesito conocer los conceptos básicos y la física detrás de la creación de tal cuerda, no cómo usar una biblioteca preexistente para crear una. Me gustaría poder implementar una cuerda desde cero, así que necesito saber cómo se puede hacer.
La cuerda en su ejemplo es probablemente una simple articulación física que limita la distancia de la pelota al cursor del mouse. Estas juntas generalmente se denominan "Junta de cuerda" o "Junta de resorte".
Parece que las ondas en la cadena no se basan en una simulación física real. Lo más probable es que se trate de una curva bezier donde los puntos de control se alejan aún más del eje central cuando la pelota está más cerca de la posición del mouse.
Si bien la respuesta aceptada explica cómo crear una cuerda realista dentro del motor de física, a veces es preferible tener una solución mucho más simple (como se describe anteriormente). La solución más simple (con una sola articulación) mejora en gran medida la estabilidad de la simulación. Múltiples articulaciones conectadas que tienen grandes fuerzas aplicadas tienden a temblar y pueden resultar en cadenas de articulaciones rotas y en movimiento errático.
Por supuesto, también puede combinar ambos métodos, creando su cuerda como tal:
Una cadena de nodos, conectados por articulaciones.
Una unión de cuerda / resorte desde el primer hasta el último nodo de la cadena que garantiza que no se pueda separar la cadena más allá de una distancia máxima dada (una de las razones principales por las que estas cadenas se vuelven inestables).
Esto dará como resultado una cadena de movimiento más realista (que incluso puede reaccionar a otros objetos en el motor de física) pero requerirá más potencia de procesamiento que solo una unión de resorte con un comportamiento de cadena "falso".
¡Gracias por señalar eso! Sin embargo, ¿cómo se manipularían los puntos de control del bezier, porque el ejemplo parece muy realista, no simplemente como un bezier donde está enderezado y "aplastado".
theonlygusti
No creo que se vea muy realista en absoluto. Simplemente agrega algunas ondas a la cuerda, no se dobla ni nada ... para mí parece que solo se está enderezando y aplastando.
bummzack
Pero he notado que las curvas pueden estar en ángulos diferentes entre sí; ¿Cómo se está logrando esto?
theonlygusti
¿Agregar algunas compensaciones aleatorias para que se vea diferente cada vez?
bummzack
Ok si parece que así fue como se hizo en el juego, pero en realidad (y esto parecerá extraño para todos) el lenguaje de programación que estoy usando hace que sea más fácil crear un motor de física como señaló la respuesta de Kyranstar que dibujar curvas bezier.
theonlygusti
10
Básicamente, necesitarás crear un motor de física. Conceptualmente, una cuerda es un grupo de "nodos" conectados entre sí con resortes.
Básicamente, cada tic, cada nodo ejercerá una fuerza sobre los nodos por encima y por debajo proporcional a su distancia (o cuán lejos de su cómoda longitud de estiramiento). Si desea unir una bola, simplemente conéctela con una junta de resorte al nodo inferior de la cuerda.
Este es un gran tutorial para crear un motor de física, pero en realidad no entra en restricciones o articulaciones.
Aquí hay un tutorial que cubre resortes básicos, que debería ser todo lo que necesita para una cuerda como esa.
Esta es una cuerda creada en mi motor de física (muy básico) . Obviamente tiene algunas peculiaridades (la extraña vibración) pero generalmente es lo que estás buscando. Cuando dibujes la cuerda, simplemente no dibujes los nodos.
Editar:
Para hacer una cuerda de buena apariencia, una "unión de cuerdas" es en realidad mucho más bonita y más cercana a su ejemplo. Una unión de cuerdas es básicamente un resorte, pero solo corrige los objetos cuando están demasiado separados (no cuando están demasiado cerca).
Esta es mi cuerda con una articulación de cuerda en su lugar:
"Cuando dibujas la cuerda, simplemente no dibujes los nodos". - me hizo reír :) Gracias por tomar en cuenta mi extrema novación. ¿La pelota sería otro nodo entonces? ¿De una masa mayor? (¿Cada nodo tiene una masa?)
theonlygusti
¡Ellos si! En general, la mejor manera de calcular intuitivamente las masas es darle densidad a cada bola y simplemente multiplicarla por su área. Siempre puedes modificar esto para obtener mejores resultados en tu juego real.
Kyranstar el
Normalmente, implementaría esto en un lenguaje orientado a objetos, con una clase para un nodo, con propiedades de densidad, masa, etc., pero me veo obligado a usar un lenguaje donde OOP es casi imposible; ¿Cómo configuraría nodos, etc., bajo estas restricciones?
theonlygusti
Para ser honesto, tengo muy poca experiencia con idiomas que no son OPO. Podrías mirar Chipmunk2D , que es un motor de física escrito en C. Obviamente, necesitarás alguna forma de almacenar estos datos en una unidad cohesiva.
Kyranstar
OK gracias; última pregunta, ¿es el nodo gris un nodo en el sentido de los demás? ¿Qué tiene de especial que haga que se quede quieto?
Básicamente, necesitarás crear un motor de física. Conceptualmente, una cuerda es un grupo de "nodos" conectados entre sí con resortes.
Básicamente, cada tic, cada nodo ejercerá una fuerza sobre los nodos por encima y por debajo proporcional a su distancia (o cuán lejos de su cómoda longitud de estiramiento). Si desea unir una bola, simplemente conéctela con una junta de resorte al nodo inferior de la cuerda.
Este es un gran tutorial para crear un motor de física, pero en realidad no entra en restricciones o articulaciones.
Aquí hay un tutorial que cubre resortes básicos, que debería ser todo lo que necesita para una cuerda como esa.
Esta es una cuerda creada en mi motor de física (muy básico) . Obviamente tiene algunas peculiaridades (la extraña vibración) pero generalmente es lo que estás buscando. Cuando dibujes la cuerda, simplemente no dibujes los nodos.
Editar:
Para hacer una cuerda de buena apariencia, una "unión de cuerdas" es en realidad mucho más bonita y más cercana a su ejemplo. Una unión de cuerdas es básicamente un resorte, pero solo corrige los objetos cuando están demasiado separados (no cuando están demasiado cerca).
Esta es mi cuerda con una articulación de cuerda en su lugar:
fuente