Autor Tema: Calcular coordenadas X e Y donde botará una bola.

0 Usuarios y 1 Visitante están viendo este tema.

04 Diciembre, 2023, 07:48 am
Leído 1400 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Debo multiplicar el tiempo que tarde en caer, por cuánto avanza en X e Y en cada instante ¿no?

No sé calcular cuánto tiempo tarda en caer.

Con una velocidad Z inicial de 0:
En 1 instante caerá 0.1 pixeles.
En 2 instantes habrá caído 0.3 píxeles.
En 3 instantes habrá caído 0.6 píxeles.
La velocidad Z se reduce (la bola cae más rápido) a medida que ocurren instantes.
Instantes*(Instantes+1)/200 = Lo que cae.
Similar a la fórmula de Gauss.

Basado en eso deducimos que:
Si la bola inicia en 0.1 pixeles o menos de altura, botará en 1 instante. O sea... ¿Altura / (Instantes*(Instantes+1)/200)? ¿esa es la fórmula? ¿tan fácil? No lo creo, confirmen. Si es la fórmula, sería con redondeo hacia arriba.
Si la bola inicia en 0.3 o menos de altura (pero más de 0.1), botará en 2 instantes.
Etc.

Pero la velocidad inicial puede ser distinta de 0. Positiva o negativa.

Sé esto:
Altura de la bola cuando llega al punto Y = Altura-DuraciónhastaPuntoY*(DuraciónhastaPuntoY+1)/200+VelocidadZ*DuraciónhastaPuntoY

No recuerdo bien cómo obtuve eso pero funciona. Se los digo por si sirve de algo.

Por ejemplo si se pudiera sustituir lo 1ero por 0 y... despejar la duración... con eso tal vez se obtendría cuánto tarda la bola en tener altura 0. Luego multiplico eso por distancia recorrida por instante y gualá ¿no?

En fin, ayuda.

04 Diciembre, 2023, 11:45 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola. Vamos desde cero,
Tienes una cancha que se mide en horizontal o ancho de cancha con la variable $$x$$, en pantalla la representas como $$posx$$, en vertical o largo de cancha con la variable $$y$$ en pantalla la presentas con $$posy$$, para la altura respecto a piso la variable es $$z$$, tu la simulara en pantalla aumentando el radio de la bola $$r$$ y el tiempo ocurre a ritmo $$tpo$$ sacado del reloj de ordenador, cada impacto de raqueta-bola sucede a tiempo $$t0$$ sacado del ordenador. Así que el tiempo luego del impacto lo controlas con la variable $$t$$ que será igual a $$t=tpo-t0$$ por ejemplo si impactas a la hora $$8:40.12,456 =t0$$ , cada vez que requieras del tiempo $$t$$ lo calculas con la hora actual por ejemplo $$8:40.13,456=tpo$$ y el tiempo pasado luego del impacto será $$t=1$$ segundo si usas, fórmula anterior.

Pensemos en el juego , los jugadores se mueven por el terreno por dentro y también por fuera de la cancha, por lo que el origen de coordenadas no estará en la esquina inferior izquierda de la cancha sino en la esquina inferior  izquierda del terreno que le permita jugar, la dimensión total del terreno es $$xmax$$ en horizontal o ancho, y $$ymax$$ en largo o vertical. Para la altura z no hay límite.
Cualquier posición de la bola, po debajo de cero o por encima de esos límites estará fuera de juego y no podrá ser impactada.

Vamos bien?

La cancha tiene dimensiones  su esquina inferior izquierda estará en $$x0 e y0$$, tiene  ancho $$xancho$$ y largo $$ylargo$$ el campo se divide en sectores propio y del rival, cuando la posición y esté por encima de $$y>y0+ylargo/2$$
También hay que definir el ancho de la banda, como $$xb$$ y la zona de pique en el saque de longitud $$yp$$.
En un juego single de 2 jugadores es legal que la bola pique entre $$x>x0+xb$$ y $$x>x0+xancho-xb$$ y en un dobles, $$x>x0$$ y $$x<x0+xancho$$.

El primer tiro luego de un saque tiene que caer al lado invertido del terreno ya veras como calcularlo según la posición del saque alternado posicion y debe caer en $$y>y0+ylargo/2$$ pero antes de $$y<y0+ylargo+yp$$ .cuando saca el rival sera buen saque si $$y<y0+ylargo/2$$ pero mayor a$$y>y0+ylargo/2-yp$$

Bueno me voy a trabajar, luego la sigo.



Saludos  \(\mathbb {R}^3\)

05 Diciembre, 2023, 02:36 am
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Bueno, ahora que ya sabes donde necesitas que caiga vamos ver , como tienes que calcular la trayectoria para un golpe .


de algún modo tu programa tiene que decidir como asignar la direccion,  y la velocidad y el sentido del tiro. Allí no me meto,


Digamos tu tienes una variable llamada ángulo que escribiré $$\alpha$$ este ángulo es positivo si el tiro sale hacia derecha y negativo hacia izquierda,
Tambien otro angulo que es el de elevación a la salida $$\beta$$, será positivo por encima de la horizontal y negativa si apunta hacia abajo, el primero lo puedes aplicar en un globo y el segundo en un remate.
El tercer dato es el de la velocidad, que es la energía  que le aplicas al golpe , lo que tu llamas fuerza, que poco nos sirve, pero si nos sirve si sacaste un tiro rápido o uno lento. en cuanto al sentido e de espera que siempre apuntarás hacia la canch del contrincante y no hacia fuera del terreno, aquí no juegas al Paddle.


 bien con todo esto hay que hacer notar que la pelota  es impacta en unas coordenadas x,y,z del espacio del juego,  ya he dicho que puedes impactar cuando x e y están dentro del terreno es decir valores mayores a cero pero menores a un máximo $$(xmax, ymax)$$, pero tambien un buen tiro es aquel que golpees no muy cerca del suelo , pues para elevar la pelota la raqueta tiene que estar en un ángulo, que a los efectos del juego creo que es muy difícil se pueda dominar como lo hace un tenista, pero si puedes hacer que si la bola es impactada por debajo de (zmin), sal un tiro perdedor, y por otro lado si z  es muy alto la bola pasara por encima el tenista su brazo extendido y un posible salto, ese sera una altura máxima (zmax)


bien 
$$0\leq x\leq xmax$$
$$0\leq y\leq ymax$$
$$zmin\leq z\leq zmax$$

ahora ya sabes que en que punto del espacio $$(x_i,y_i,z_i)$$ golpearas la bola con direccion y velocidad $$(\alpha,\beta, v)$$ en el instante $$t0$$ es decir cuando pones a correr el tiempo de vuelo de la bola en $$t=0$$  es decir cuando $$tpo=t0$$

bien veamos la trayectoria hasta el pique , si la trayectoria vista desde arriba es una recta la velocidad en la direccion x e y debe ser una constante , lo que no será constante es en la direccion z.

si su vas a juagar a 10 frames por segundo   tu debes graficar los jugadores y a bloca cada 0.1segundos  , defines una variable llamada $$dt=0.1$$ todo el calculo posterior lo hara cuando surja un evento de tiempo de duración $$dt$$

En ese evento el tiempo t lo puedes calcular como $$t=tpo-t0$$ o incrementando la variable t  haciendo $$t+=dt$$



la nueva posición de la bola en la coordenada $$x$$ en el tiempo $$t$$ te queda

$$x=x_i+v\cdot\sin\alpha\cdot t\cdot \cos\beta$$

$$y=y_i+v\cdot\cos\alpha\cdot t\cdot \cos\beta$$


$$z=z_i+v\sin\beta\cdot t-\dfrac{g}{2}\cdot t^2$$ Ec1


donde g es la gravedad $$g=9.8m/s^2$$


Iras iterando y agregando tiempo hasta que $$z<=0$$ es decir la bola impacta con el piso, que no será justo en el tiempo de un frame pero si en el intervalo entre uno u otro frame.


Pero si quieres puedes resolver primero el tiempo que tardara en tocar suelo y dividir ese tiempo en un numero de frames a calcular ,en ese caso
la ecuación que marque con Ec1  puedes resolverla anticipadamente con una ecuación cuadrática   $$t =\dfrac{-v\sin\beta+\sqrt{(v\sin\beta)^2+4\cdot \dfrac{g}{2}\cdot zi}}{g}$$


ese número te dirá en qué instante la bola golpea el piso luego del impacto, no necesariamente será un valor de tiempo justo con décimas exactas.
 
Una vez que la bola pique podrás agregarle  efectos que pudiste dar con el teclado al momento el impacto , es decir  sumarle o restarle ángulo a $$\alpha$$ , si restas irá hacia la izquierda y si sumas a derecha.


El ángulo con que la bola golpea el piso sale de la siguiente relación $$\gamma =arctan\left(\dfrac{v\cos\beta}{v\sin\beta-g\cdot t}\right)$$ este ángulo debería resultar siempre negativo, pero al picar , se hace positivo  es decir le cambias de signo y será tu nuevo valor de ángulo de ascenso $$\beta=-\gamma$$


Al momento del pique tienes que evaluar la posición en la cancha, si está dentro o fuera , y si es un saque si está en el rectángulo correcto.


La bola continúa camino si no la impacta el contrincante, si vuelve a tocar piso por segunda vez o se sale el terreno, es punto para el que ha pegado por ultima vez.


si pones efecto topspin  reduces el ángulo beta y si le das backspin , se lo aumentas


si es impactada todo inicia de nuevo con todos los datos del contrincante pero ahora el valor de la velocidad lo pones en sentido inverso



$$x=x_i-v\cdot\sin\alpha\cdot t\cdot \cos\beta$$

$$y=y_i-v\cdot\cos\alpha\cdot t\cdot \cos\beta$$

$$z=z_i+v\sin\beta\cdot t-\dfrac{g}{2}\cdot t^2$$ Ec1

de nuevo cuando z=0 la bola pica, a menos que hayas intentado pegarle antes  en pleno vuelo.


se entiende ? o es chino, no me preguntes el porqué de las fórmulas , es física y amenos que te las pongas a estudiar  de los libros, entonces me dices cual leiste y te explico las dudas, pero cree que son así.

Una vez que hay hecho estos cálculos frame a frame tiene que convertir la posición de la bola a una posición de pantalla

si tu pantalla tiene $$n \times m$$ píxeles  donde $$n$$ va en horizontal y $$m$$ en vertical   la posición en pixeles de la bola la calculas con

$$posx =\dfrac{x}{xmax}\cdot n$$

$$posy =\dfrac{y}{ymax}\cdot m$$

y la altura de la bola elijes una constante de proporcionalidad $$k$$ y radio de bola mínimo $$(rmin)$$ cuando esta en el piso y haces que el radio de la bola a dibujar varíe con la altura


$$r=k\cdot z+rmin$$


Pd cuando o donde crees que debes evaluar si pasa o no por encima de la red y como lo harias?


Saludos 
Saludos  \(\mathbb {R}^3\)

05 Diciembre, 2023, 08:23 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Intento explicarte lo del tiempo pero en la práctica es muy sencillo.

Lo que se hace es establecer "Frames por segundo", yo le pongo 120, lo cual en teoría es que en 1 segundo se muestra hasta 120 cambios en la pantalla, creo... O sea, en una misma pantalla o instante o frame puede haber muchos cambios, porque muchas cosas se pueden mover, cambiar de color, etc, pero se refiere al todo.
Si pones 120 frames por segundo, y Mario se mueve 0.1 pixel por frame, y una tortuga 0.01 píxeles por frame, entonces en 1 segundo Mario se moverá 12 píxeles y la tortuga 1.2 píxeles.
Si todo es igual pero pones 12 frames por segundo en vez de 120, entonces el movimiento en 1 segfundo será Mario 1.2 píxeles y la tortuga 0.12 píxeles.
Quizá están mal las cuentas pero en la práctica es así, conviene poner mucho framerate para que si algo se mueve muy rápido se vea en cada lugar, en vez de que se vea entrecortado. También depende de la velocidad de refresco del monitor, así que poner 120 es medio en vano si el monitor no soporta tanto, pero en fin.

El tiempo de los tiros yo lo cuento en el programa, así que no hay necesidad de calcularlo. O sea, cuando el tiro se realiza, empiezo a contar cuántos frames o instantes ocurrieron desde eso. Lo hago porque Ivorra o Fuentes (no recuerdo) me recomendó hacerlo para calcular mejor la posición en que se encontrará el tiro en cada T.

Para la altura z no hay límite.
Para X e Y tampoco, sólo que los jugadores quedarían fuera de la pantalla, y no tiene mucho sentido golpear la bola desde ahí, el jugador no se vería. Aunque la imagen de la cancha y los jugadores se podría reducir en esos casos, para que siempre se vean, pero no es algo que tenga pensado hacer pronto, no saber Matemática o Física, o lo que sea, me hace avanzar a pasos de tortuga.

Citar
Cualquier posición de la bola, po debajo de cero o por encima de esos límites estará fuera de juego y no podrá ser impactada.
Digamos que es así, nadie querría golpear una bola que botará tan out, pero no le veo lo relevante.

Citar
La cancha tiene dimensiones  su esquina inferior izquierda estará en x0ey0
En Flash es al revés, el punto 0, 0 está en la esquina superior izquierda. Y aumenta hacia abajo.

Citar
el campo se divide en sectores propio y del rival, cuando la posición y esté por encima de y>y0+ylargo/2
A ver, la hoja de Flash la configuré que mida 800x600, y el centro de la red està en 400, 300, con lo cual, si la bola está a < 300 está en la parte de arriba y si está a > 300 está abajo. Si está en 300 está justo en medio. Entonces sí, es Largo(600)/2, pero eso de Y>Y0 no sé bien qué es. Supongo que el límite, debe estar dentro del límite sí si hubiera, pero también del otro límite entonces (debe ser =>min y <=max).

Las zonas legales de pique se pueden establecer de modo similar, la cancha está dibujada, no sé mucho de operaciones matemáticas, simplemente miro en qué punto X o Y están ubicadas las líneas y si es menos o más que eso, según el caso, es in u out. Pero realmente no llegué a eso, simplemente establecí un "punto ideal" donde debe botar la bola, e intento calcular qué velocidades deben tener los tiros para que la bola bote ahí, si el personaje tiene suficiente fuerza, sino intenta lanzar más recto y, bueno, no es el tema...
Una vez que sepa cómo hacer el cálculo para que bote en ese punto, pondré la opción de cambiarlo. Lo de chequear si fue in u out va más adelante. A ver, te muestro un diagrama que estoy intentando hacer (no sé si está bien):

Primero la fuerza del personaje se reparte en XY de modo que la bola se dirija al punto deseado. Pero la velocidad Z es 0, por lo que pueden ocurrir muchas cosas indeseadas. Ahí es donde entra en acción el diagrama. Pero recién estoy viendo en qué medida puedo responder la 2nda pregunta. La idea es que antes de realizarse el tiro que te comenté se calcule cómo será, y se vaya modificando hasta que sea el tiro "perfecto". Luego, según la puntería y suerte del personaje, puede modificarse mucho, poco o nada.

Creo que hay formas más sencillas de hacer eso, pero no las sé. Puede que la respuesta esté aquí:
https://foro.rinconmatematico.com/index.php?topic=122044.0
Pero algún problema hubo y yo ya no intento resolverlo de ese modo, es como que esperé demasiada ayuda (un profesor también dijo que me ayudaría, me dijo que fuera un día, lo esperé como 1 hora porque estaba tomando exámenes y luego era tarde ¿pero para qué me dijo que fuese en ese momento entonces?), ahora pido cosas más sencillas y yo intentaré hacer el resto que pueda.

Citar
El primer tiro luego de un saque tiene que caer al lado invertido del terreno
Sí pero por ahora no es relevante, quisiera que me respondas las preguntas del tema... Las reglas del tenis ya las sabemos en general.

Citar
Digamos tu tienes una variable llamada ángulo
No sé cómo calcularla. Yo hago esto:
Norma = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
BallXSpeed = DistanciahastaDestinoX/Norma*-AlexFuerzadetiros;
BallYSpeed = DistanciahastaDestinoY/Norma*-AlexFuerzadetiros;
BallZSpeed = 0;

O sea, el ángulo es calculable supongo, pero no sé de eso. Es como que yo obtengo un triángulo: La velocidadX es el largo, y la velocidadY es la altura. Viendo el topic de rotación de las flechas quizá podría calcularlo.

Citar
puedes hacer que si la bola es impactada por debajo de (zmin), sal un tiro perdedor
Tendré que pensarlo, un tiro que bota muy poco no se puede devolver fuerte, pero de ahí a que la devolución siempre choque la red no me parece.

Citar
la nueva posición de la bola en la coordenada $$x$$ en el tiempo $$t$$ te queda

$$x=x_i+v\cdot\sin\alpha\cdot t\cdot \cos\beta$$

$$y=y_i+v\cdot\cos\alpha\cdot t\cdot \cos\beta$$
Eso me enseñaron a hacerlo así:
Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro
BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro

En cuanto a la BallZ no recuerdo si me dijeron algo pero aún no intenté aplicarlo, hago esto:
BallZSpeed = BallZSpeed-0.01;
BallZ = BallZ+BallZSpeed;

Citar
donde g es la gravedad $$g=9.8m/s^2$$
Al principio del tema expliqué cómo funciona la gravedad en este juego, me parece más simple así. Y lo tienes en las fórmulas que acabo de poner.

Bueno, en otra ocasión intento aplicar tu fórmula y leo el resto, por hoy este asunto me cansó. ¡

06 Diciembre, 2023, 02:57 pm
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Debo traducir tu fórmula a Excel para confirmar que funcione.

¿Cómo calculo $$\beta$$?
Como expliqué, yo establezco velocidades, no ángulos. Si la bola es un punto puedo pensar que la velocidadZ es la altura del triángulo, y la velocidadY es el lado. Ver flechas verdes en la imagen. Trazo unas líneas imaginarias del otro lado. Trazo lo que sería la hipotenusa hacia ese lado.

Ahora miro este video a ver si me sirve:

Bien, tengo que usar esa del tangente, la hipotenusa no la preciso. Como expliqué, inicialmente le doy velocidadZ 0, entonces el resultado me da:

Bueno, V asumo que es velocidadZ.

No está bien.
En el 2ndo ejemplo (2nda fila sin contar la cabecera) se asume que la bola inicia en el suelo y la velocidad es poquita, no tarda 70 frames en caer, tarda 1 (sube ese poquito pero cae la misma cantidad, por lo tanto vuelve al suelo, no subió, la fuerza no fue suficiente).
En el 3er ejemplo reduje la velocidad Y y eso hizo que la bola tarde menos en caer, lo cual no tiene sentido, ya había preguntado por eso, dijimos que la velocidad de caída sólo depende de cuánto está subiendo, de su posición Z origen y de la gravedad. Y del viento y el spin pero eso es otro tema. Me pareció raro que incluyeras la velocidadY en la fórmula...

Bueno, si me explicas qué tiene mal eso (quizá cómo apliqué las fórmulas, no ellas en sí) sigo.

06 Diciembre, 2023, 05:52 pm
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Para que te pueda  ayudar correctamente , tu tienes que indicarme como tomaras los ángulos, yo te he propuesto una forma , pero veo que no hiciste caso, así que comentame cuando cada ángulo tomara el valor cero, y que tipo de movimiento se produciría cuando aumenta.


Yo te había propuesto que cuando viaja recto paralelo a los bordes de la cancha en vertical el ángulo $$\alpha$$ sea cero  si tiras cruzado hacia la derecha es positivo y si tiras a la izquierda negativo, para $$\beta$$ te había dicho que si sale horizontal sería $$beta=0$$ si aumenta la altura $$\beta$$ será positivo hasta 90 (caso que dará el error) y si remata apuntando al piso, beta será negativo, hasta -90 (donde de nuevo habrá un error salvable por anticiparte en la programación)



El error de división por cero que te aparece es porque debías dividir la celda $$b2/a2$$ resultando cero, es decir, que estaría haciendo un tiro que sale sin elevación es decir es horizontal.
En el supuesto caso que la bola no avance en el campo hacia adelante pero sí que sale hacia arriba, te dará dividido cero de nuevo, entonces antes de hacer cualquier división en computación se hace una pregunta sobre si el denominador es cero, y en cuyo caso tomas una decisión y no calculas lo que ya sabes te dará un error, en ese caso el ángulo es 90° , es decir un tiro vertical, intenta calcular la tangente de 90° y veras que te da ese error.


Si tu en el golpe ya has calculado cuánto es $$v_x, v_y$$ y $$v_z$$  los ángulos los calculas de esta manera


$$\alpha=\arctan\left(\dfrac{vx}{vy}\right)$$


observa que valores de velocidad en x negativos resultan en ángulos negativos  eso significa que la bola tiene velocidad hacia la izquierda


La velocidad de la bola al salir de la raqueta , que yo denomine $$v$$ se calcula como $$v=\sqrt{v_x^2+v_y^2+v_z^2}$$


El ángulo de elevación sale de


$$\beta=\arctan\left(\dfrac{v_z}{\sqrt{v_x^2+v_y^2}}\right)$$


Si la velocidad $$v_z$$ resultase  negativa entonces el ángulo es negativo, es decir has golpeado con algo de velocidad hacia abajo, esto sucede en los remates, o en algún tiro muy cercano a la red.


Ese cálculo con los exponentes al cuadrado te permite calcular el total de velocidad de la bola , en el primer caso en el espacio 3d, y en el segundo es la velocidad proyectada sobre el plano de la cancha.


$$\sqrt{v_x^2+v_y^2}$$ es el largo de la línea roja entre las dos flechas verdes, es aplicar el teorema de Pitágoras.

Saludos
Saludos  \(\mathbb {R}^3\)

07 Diciembre, 2023, 10:00 am
Respuesta #6

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
tienes que indicarme como tomaras los ángulos, yo te he propuesto una forma , pero veo que no hiciste caso
Será que no te entendí.

Te muestro lo que tengo del juego, mira el video más adelante.

El personaje no puede usar más fuerza de la que tiene, la dice en la parte inferior de la pantalla, yo la cambio pero en el juego no se podrá cambiar de ese modo.

Por ahora el personaje intenta hacer un saque que:
1- Bote en el área de saque izquierda.
2- Pase por encima de la red sin tocarla.
3- Se dirija más o menos al punto más profundo e izquierdo del área de saque izquierdo.
4- Avance a la máxima velocidad posible, es decir, la velocidad de subida es secundaria.

Todo eso puede parecer contradictorio pero no, cada punto debe cumplirse en la medida en que no se deje de cumplir uno anterior, si eso no se puede entonces él no se cumple. El de la fuerza podría considerarse el punto 0. Entonces, por ejemplo, si el personaje tiene muy poca fuerza, el tiro no debe llegar a la red. No se puede cumplir el punto 1 ni el 2.

Bueno, yo necesito saber cómo debe administrarse la fuerza para que se cumpla la condición 0 (es redundante decirlo, pero bue), y si es posible la 1, y si es posible la 2, y así.

Yo cumplo la 0, la 3 y la 4, haciendo esto:
Código: [Seleccionar]
Norma = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
BallXSpeed = DistanciahastaDestinoX/Norma*-AlexFuerzadetiros;
BallYSpeed = DistanciahastaDestinoY/Norma*-AlexFuerzadetiros;
BallZSpeed = 0;

Obviamente esto no es la solución.

Cuando el personaje tiene poca fuerza (pero no poquísima), para cumplir los puntos 1 y 2 parte de la fuerza debe ser usada para que la bola vaya hacia arriba. ¿Cuánto? No sé calcularlo.

Cuando el personaje tiene bastante fuerza, para cumplir esos puntos parte de su fuerza debe ser usada en enviar la bola hacia abajo. ¿Cuánto? No sé.

Y cuando el personaje tiene mucha fuerza, para cumplir esos puntos debe usar menos de la que tiene. ¿Cuánta? No sé. La idea es que pueda usar efecto liftado y otros, pero por ahora no.

Pero también pienso para casos en que el personaje golpee la bola desde debajo de la red (quiero decir, por debajo de la parte más alta de la red) o desde sitios distintos, o hacia sitios distintos, por eso no es cuestión de hallar los números para algunos casos y ya.

Eso es lo que hago, aquí tienes el video:
https://drive.google.com/file/d/1vgtRFJsQM9hM9y0qXCqAmuV5yoPqU2Nq/view?usp=sharing

Lo puedo intentar hacer con ángulos pero no sé bien cómo, si me dices cómo entonces lo intento.

Citar
comentame cuando cada ángulo tomara el valor cero, y que tipo de movimiento se produciría cuando aumenta.
No entiendo bien tu pedido. Si te refieres al ángulo de subida, como expliqué estoy estableciendo que no se use fuerza en Z, para luego ver cuánta conviene usar, haciendo ensayo y error. Si no se usa, supongo que eso significa que es ángulo 0, y ocurre con cada tiro, al menos hasta que haga los cambios, pero 1ero debo saber qué valores debe tomar, es como que me estás pidiendo que te diga algo que se calcula a partir de una incógnita (velocidadZ) que no sé calcular.

Pero la incógnita del tema es dónde bota un tiro una vez establecido (yo le pongo velocidadZ 0 pero como expliqué lo voy variando así que la fórmula debe asumir que puede variar).

Citar
Yo te había propuesto que cuando viaja recto paralelo a los bordes de la cancha en vertical el ángulo $$\alpha$$ sea cero  si tiras cruzado hacia la derecha es positivo y si tiras a la izquierda negativo, para $$\beta$$ te había dicho que si sale horizontal sería $$beta=0$$ si aumenta la altura $$\beta$$ será positivo hasta 90 (caso que dará el error) y si remata apuntando al piso, beta será negativo, hasta -90 (donde de nuevo habrá un error salvable por anticiparte en la programación)
Bueno, $$\alpha$$ supongo que es negativo, por ahora sólo saca a la izquierda, y $$\beta$$ es inicialmente 0 pero dependiendo de los cálculos que haga (que no sé cómo hacerlos aún, por eso pregunto) podrá ser mayor o menor. Los límites digamos que están bien también, por ahora no pensé en eso.

Citar
El error de división por cero que te aparece es porque debías dividir la celda $$b2/a2$$ resultando cero, es decir, que estaría haciendo un tiro que sale sin elevación es decir es horizontal.
El tiro es horizontal sí, ángulo 0 supongo, pero lo que hago es b2/c2, es decir velocidadX/velocidadZ ¿está mal?

Citar
intenta calcular la tangente de 90° y veras que te da ese error.
En Excel =TAN(90) me dió -1,995200412.

En este momento no puedo continuar pero leí lo siguiente y no entiendo bien qué me sugieres que haga.

07 Diciembre, 2023, 11:18 am
Respuesta #7

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola. Solo necesito me contestes una pregunta,,pues no entiendo  como es que sabes donde caerá la bola, si todavía no la golpeaste, porque desconoces con que velocidad hacerlo....entonces , por favor, dime, antes de cada tiro tu escoges donde quieres que caerá la bola?, es decir la posición del pique ya es un dato?


Otra cosa Excel toma los ángulos en radianes por eso con 90 no te da prueba con $$\tan(\pi/2)$$ , ese argumento $$\pi/2$$ es 90 convertido a radianes


Ángulo en radianes= ángulo en grados por pi dividido 180


$$\theta_r=\dfrac{\theta°\cdot \pi}{180}$$


Te reitero que no está bien hablar de fuerza de Alex sino de velocidad de salida de la bola cuando Alex la golpea. Si Alex no le da suficiente  velocidad inicial la pelota no pasa la red.


Por otro lado como distingues que algo este a la izquierda o la derecha del  jugador, cuando usas la palabra distancia tienes que saber que las distancias son siempre  positivas, si de A hasta B hay 5 metros de distancia de B hasta A habrá también 5 metros de distancia.  Pero si estoy en A para ir a B necesito aumentar mi posición 5 metros $$posB =posA+5$$, pero si estoy en B y quiero ir a A tengo que reducir mi posición en 5 metros $$posA= posB-5$$ , para un lado sumo para otro lado resto,  eso es lo que hacen los ángulo aportarte los signos y proporciones para calcular las diferencias de posiciones entre el punto de partida y el de llegada.


Así que cuando escribes distancia..en código no entiendo que quieres lograr porque no se puede prever  si va a derecha o izquierda. Hacia arriba o abajo en pantalla,  o si sube o baja en z.


$$Distancia AB=\sqrt{(posxA-posxB)^2+(posyA-posyB)^2+(poszA-poszB)^2}$$
Siempre es positiva , se entiende?


Si todos los tiros son horizontales o sin ángulo de elevación,  todos los tiros que partan de una altura menor a la altura de la red nunca podrán cruzarla.


Luego la sigo, no tengo tiempo  ni para corregir ortografía.
Saludos

Saludos  \(\mathbb {R}^3\)

10 Diciembre, 2023, 12:07 pm
Respuesta #8

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola. Solo necesito me contestes una pregunta,,pues no entiendo  como es que sabes donde caerá la bola, si todavía no la golpeaste, porque desconoces con que velocidad hacerlo....entonces , por favor, dime, antes de cada tiro tu escoges donde quieres que caerá la bola?, es decir la posición del pique ya es un dato?
Los datos son:
- Gravedad.
- Fuerza del personaje.
- Posición X de salida del tiro.
- Posición Y de salida del tiro.
- Posición Z de salida del tiro.
- PosiciónY de la red, y con ello distanciaY entre la salidaY y la red.
- Altura de la red, y con ello distancia entre la salidaZ y la altura de la red.
- Distancias diagonales (XY, XYZ y no sé si otra) desde la salida hasta la red.
- PuntoXY hacia donde se quiere que vaya la bola. Como dije es el área más izquierda y profunda del área de saque. Cuando el personaje tiene suficiente fuerza puede entenderse como el punto donde se quiere que bote la bola, pero sino no, es hacia donde se quiere que vaya o se acerque, de modo que, si el tiro pudiera continuar, pasaría por ahí.
- DistanciaX entre la salida y el puntoX "destino".
- DistanciaY entre la salida y el puntoY "destino".
- DistanciaXY entre la salida y el puntoXY "destino".
- ÁnguloXY del tiro, creo.

Incógnitas:
- VelocidadX del tiro.
- VelocidadY del tiro.
- VelocidadZ del tiro.
- Altura del tiro cuando llegue a la red. Lo puedo calcular basado en lo anterior:
Altura-DuraciónhastaPuntoY*(DuraciónhastaPuntoY+1)/200+VelocidadZ*DuraciónhastaPuntoY
- PuntoXY donde botará la bola.

Condiciones que deben intentar cumplirse (priorizando este órden, noté errores así que lo cambié un poco):
1- Necesario, siempre: El personaje no debe usar más fuerza de la que tiene. Puede usarla toda o menos.
2- Necesario, siempre: En cada frame, la bola debe caer 0.01 más de lo que estaba cayendo, es decir, la gravedad debe aplicarse.
3- La bola debe botar en el área de saque izquierda. Si no se tiene suficiente fuerza ni se está suficientemente cerca, no será posible.
4- La bola debe pasar por encima de la red sin tocarla. Idem, y esto además depende de cuan arriba se golpee la bola, golpear demasiado abajo combinado con lo anterior podría imposibilitar cumplir esta condición.
5- La bola debe dirigirse hacia el punto mencionado en los datos. Si bota ahí o no, es secundario. Si debido a poca fuerza o lo que sea no es posible cumplir las condiciones anteriores, este punto cambia de modo que sí, si es posible.
6- La velocidadXY de la bola debe ser la mayor posible. O sea, tiros que cumplan las condiciones anteriores puede haber muchos, pero con esta condición, dentro de las posibilidades, se toma el que tenga mayor velocidadXY, es decir al que se le haya dedicado menos velocidadZ. Tener en cuenta que una velocidadZ negativa es también haber dedicado fuerza a eso.

Creo que eso es todo, pero ya te lo había dicho creo...

Citar
antes de cada tiro tu escoges donde quieres que caerá la bola?
Cuando juegas en la realidad, elaboras planes, decides, "quiero que vaya lo más rápido posible" o "quiero que bote en X lugar", etc, luego calculas cómo lograrlo, piensas cómo golpear, apuntas, y luego intentas golpear así o hacia ahí.

En este juego distintas teclas o combinaciones de teclas harán distintos tipos de tiros, aún no pensé mucho en eso, por ahora es sólo uno como describí arriba. Mira esto:
De 4:20 a 4:32. ¿Ves que todos los saques botan en la punta? El jugador está apuntando hacia ahí, de hecho en cuanto a dirección sólo hay 3 opciones (en lo profundo de la izquierda, en lo profundo de la derecha o en lo profundo del centro). Algo así quiero hacer. Pero en mi juego es posible tener mucho menos fuerza, así que habrá saques que boten menos profundo.

En definitiva, el jugador humano elige una direcciónXY, y el personaje (o el programa) elige las velocidades, incluyendo Z, para que el tiro cumpla las condiciones, si es posible. Yo debo hacer que el programa haga eso.

Citar
como es que sabes donde caerá la bola, si todavía no la golpeaste, porque desconoces con que velocidad hacerlo....
No sé dónde caerá, pero si el personaje tiene mucha fuerza o considerable entonces es deducible que debe caer lo más profundo posible (pero dentro del área de saque), porque si se quisiera que bote antes debería ir más lento porque sino choca con la red, pero en este tipo de tiro que intento programar (habrá otros) la velocidad importa más que el ángulo, por lo tanto en esos casos botará profundo, para que pueda ser más veloz. En la realidad botar cerca de la red, o sea poco profundo, podría ser conveniente para que tenga más ángulo, pero por ahora no estoy haciendo eso.

Sigo otro día, aunque no lo creas me toma horas escribir todo eso.

11 Diciembre, 2023, 03:43 pm
Respuesta #9

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Otra cosa Excel toma los ángulos en radianes por eso con 90 no te da prueba con $$\tan(\pi/2)$$ , ese argumento $$\pi/2$$ es 90 convertido a radianes


Ángulo en radianes= ángulo en grados por pi dividido 180


$$\theta_r=\dfrac{\theta°\cdot \pi}{180}$$
No sé de esos temas aunque acabo de leer algo ¿¿y qué hago? Tenía:
\( Ángulo de subida = Tan(VelocidadY / VelocidadZ) \)
No tiene sentido poner fórmulas que no impliquen esos datos ¿debo suponer que debo agregar lo que dices, dónde?

Citar
Te reitero que no está bien hablar de fuerza de Alex sino de velocidad de salida de la bola cuando Alex la golpea. Si Alex no le da suficiente  velocidad inicial la pelota no pasa la red.
Lo siento pero me cuesta creer que esté mal decir "si no le pone suficiente fuerza", "si no le aplica suficiente fuerza", "si no le da...".
La fuerza es algo que tiene disponible desde antes de golpear la bola, la calidad de sus músculos digamos, de la raqueta, del movimiento (cantidad de impulso que toma), yo lo estoy simplificando o juntando todo en 1 variable que en realidad llamo AlexFuerzadetiros, le puedo llamar MáximaVelocidad si quieres, pero son años y años en que en los videojuegos se le llama fuerza a estas cosas, y no tengo pensado cambiar eso, no le veo el error.
La fuerza de un personaje es su capacidad de hacer que su arma, raqueta, puñetazos o lo que sea, haga más daño o haga que la bola tenga más velocidad. También debería influir en la velocidad de los golpes (que tan rápido se ejecutan) y la puntería (entre más rápido, menos lo puede evadir el enemigo) creo, pero los juegos suelen separarlo.

Citar
Por otro lado como distingues que algo este a la izquierda o la derecha del  jugador
Por ahora no lo hago, pero no creo que sea difícil. Por ejemplo:
Código: [Seleccionar]
Si AlgoX < AlexX
   entonces Algo está a la izquierda de Alex.
sino si AlgoX > AlexX
   entonces Algo está a la derecha de Alex.
sino
   entonces Algo está en la misma posición que Alex.

Por ahora es hacer un saque a la izquierda, cuando deba hacer tiros a la derecha pensaré en eso.

Citar
cuando usas la palabra distancia tienes que saber que las distancias son siempre  positivas
Puede ser, pero si sirve yo tengo pensado ser práctico digamos y en la misma variable decir la distancia y la dirección, como si fuese un vector ¿no? De ese modo ya sé hacia dónde es la distancia.
Yo hago esto:
Código: [Seleccionar]
// Datos para determinar velocidades del tiro:
DistanciahastaDestinoX = BallX-283.1;
DistanciahastaDestinoY = BallY-183;
DistanciahastaRedY = BallY-300;
DistanciahastaMinsafeBallZ = BallZ-MinsafeBallZ;
283.1 y 183 son las coordenadas X e Y por donde se quiere que pase la bola. En el futuro serán variables, por ejemplo dependiendo de si el jugador saca a la izquierda o derecha. En ese caso la distancia podría ser negativa. Quizá es un error conceptual digamos pero por ahora no le veo el problema.
300 es porque la pantalla en Y mide 600 y la red está en el medio.
MinsafeBallZ es la altura mínima por la que la bola debe pasar por la red para no tocarla. Como tengo pensado que la altura de la red pueda variar (distinto modo de juego, o por magia) lo llamé así, pero por ahora es 18.6.
Si es tan malo ¿cómo me recomiendas llamarle?

Citar
Así que cuando escribes distancia..en código no entiendo que quieres lograr porque no se puede prever  si va a derecha o izquierda. Hacia arriba o abajo en pantalla,  o si sube o baja en z.
El video este que te di:
https://drive.google.com/file/d/1vgtRFJsQM9hM9y0qXCqAmuV5yoPqU2Nq/view?usp=sharing
Dura menos de 1 minuto y ahí se muestra, el tiro es siempre hacia la izquierda, arriba (Y), y en cuanto a Z depende de varias cosas, no sé calcularlo, pero básicamente si el personaje tiene poca fuerza irá hacia arriba y sino hacia abajo, como tú mismo has dicho, un globo o un remate. En el video siempre es 0, pero debo mejorarlo.

Citar
Si todos los tiros son horizontales o sin ángulo de elevación,  todos los tiros que partan de una altura menor a la altura de la red nunca podrán cruzarla.
Correcto, aunque en este contexto horizontal se entiende como que es paralelo a la red, que no avanza en Y, hacia la cancha rival, y no hay tiros de esos.

Un consejo, no sé si te servirá. Yo no tengo celular ni portatil, pero sí un pendrive, en el cual si voy a viajar guardo cosas, lo llevo a un cibercafé, lo imprimen, y entonces mientras viajo lo pienso. Por supuesto eso sólo si viajas sin conducir, yo viajo en bus, no leas mientras conduzcas xD Sólo las señales de tránsito y cosas así xD