4 votos

¿Cómo puedo girar un barco?

Así que, al chocar dos barcos juntos, yo actualmente uso:

if (distancex < 10 && distancez < 20 && distancex > -10 && distancez > -20){

Que obviamente, es un cuadro alrededor de la nave. Desde el barco es muy cuadrado, luego de que funciona bien.

distancex, distancez son simplemente la distancia de un barco a otro.

Así que, permítanme señalar algunos diagramas.

enter image description here

Lo anterior funciona bien, porque es el valor predeterminado de la rotación de la nave, y así, el rojo de la nave puede fácilmente chocan.

Sin embargo, enter image description here si el barco se hace girar en un ángulo como el que, que no se puede trabajar de la manera de tener el mismo o similar línea de código, pero todavía tienen que trabajar.

Seguro, sé que mi matrices de rotación, sin embargo, ya sea sólo estoy siendo tonto o no me son de mucha ayuda aquí.

Para cualquier programadores (sé que no son todos los programadores aquí), aquí está toda mi código:

for (Clients cl : GameServer.players){
                if (cl.backOff < 1){
                for (Clients can : GameServer.players){
                    if (can != cl){
                        if (!(can.y < 45)){
                        Vector3f b = new Vector3f(cl.x + (Math.sin(Math.toRadians(cl.x)) * 20), cl.y, cl.z + (Math.cos(Math.toRadians(cl.z)) * 20));
                            int distancex = (int) (b.x - can.x); //Reverse? 
                            int distancez = (int) (b.z - can.z); //Reverse?

                            if (distancex < 10 && distancez < 20 && distancex > -10 && distancez > -20){

                                System.out.println("X: " + distancex + " Z: " + distancez);
                                can.damage-=100 * cl.speed;
                                if (can.damage < 1){
                                    can.sinking = true;
                                }
                                cl.speed = 0;
                                cl.backOff = 1000;
                            }
                        }
                    }
                }
                }

3voto

flawr Puntos 4409

Yo diría que usted no debe girar en el mismo barco, gire todo el mundo (o el sistema de coordenadas) de modo que el barco está de nuevo en la misma orientación que en la primera imagen. En la primera imagen de la nave puntos en el diretion de $a = (-1,0)^t$ ($^t$ significa simplemente que me escribió un vector fila, pero me refiero a un vector columna.) En la 2ª imagen es más o menos en la dirección de la $b = \frac{1}{\sqrt{2}} (-1,1)^t$. El ángulo entre los es $\alpha = \cos^{-1}\left( \frac{\langle a,b\rangle}{\vert a \vert \cdot \vert b \vert} \right) $ donde $\langle a, b \rangle = a_1b_1+a_2b_2$ es el estándar de producto escalar de dos 2-dimensiones de los vectores, y $\vert a \vert = \sqrt{a_1^2+a_2^2}$ es la longitud (norma) del vector. Ahora para la rotación de los vectores podemos utilizar una matriz de rotación:

$$ v_{rot} = \begin{pmatrix} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha)\end{pmatrix} \cdot v = \begin{pmatrix} \cos(\alpha) v_1 - \sin(\alpha) v_2 \\ \sin(\alpha) v_1 + \cos(\alpha) v_2\end{pmatrix}$$

En nuestro caso $$ a = \begin{pmatrix} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha)\end{pmatrix} \cdot b = \begin{pmatrix} \cos(\alpha) b_1 - \sin(\alpha) b_2 \\ \sin(\alpha) b_1 + \cos(\alpha) b_2\end{pmatrix} = \begin{pmatrix} \frac{1}{\sqrt{2}} \frac{-1}{\sqrt{2}} - \frac{1}{\sqrt{2}} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}}\frac{-1}{\sqrt{2}}+\frac{1}{\sqrt{2}}\frac{1}{\sqrt{2}}\end{pmatrix} = \begin{pmatrix} -1 \\ 0 \end{pmatrix}$$

Si, ahora, el verdadero vector de distancia $d = (d_1, d_2)$ entre los dos barcos, se puede aplicar la misma rotación a $d$ y consigue $d_{rot}$ y, a continuación, aplicar su normal verificación de colisión en el vector $d_{rot}$, así:

$$ d_{rot} = \begin{pmatrix} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha)\end{pmatrix} \cdot d = \begin{pmatrix} \cos(\alpha) d_1 - \sin(\alpha) d_2 \\ \sin(\alpha) d_1 + \cos(\alpha) d_2\end{pmatrix} $$

PS: Si los dos barcos no están en un buen ángulo recto uno respecto del otro, me gustaría calcular las cuatro esquinas de la caja de una nave (y no la distancia que es - supongo - sólo la distancia al centro de cada barco), y comprobar si están dentro de la caja de la otra nave usando el mencionado método.

ACTUALIZACIÓN: Ah, ok, yo no sabía acerca de su conocimiento. Me imagine ahora que usted sabe acerca de la trigonometría básica ($\sin \cos \tan$) puede convencionalmente imaginar vectores en 2d ord 3d, ahora me simplyfy cosas: vamos a hablar sobre el 2d: Un vector es básicamente un punto en el espacio: Un vector tiene 2 coordenadas, uno en dirección x uno en una dirección, por ejemplo,$a = (3,5)$. La cosa es que al llamar a algo un vector, que puede hacer cosas que no puedes hacer con los puntos: por ejemplo, Se puede multiplicar un vector por un valor de: $5 \cdot (-1,4) = (-5,20)$ o $-0.2\cdot (20,0) = (-4,0)$ (Que significa que usted estire un vector por esa cantidad). Usted puede también agregar vectores: Como $(2,5)+(-1,2) = (1,7)$ (Hacer un dibujo: Se puede interpretar vectores como arows que comienzan en $(0,0)$ y al final con el jefe de las flechas en las coordenadas proporcionadas. La adición de dos vectores significa anexar uno de los vectores de la "cola" a los demás de la cabeza.)

Luego podemos hablar de la longitud (un.k.una. la norma indica $||$ alrededor del vector). de un vector. Eso es simple: utilizar el teorema de pitágoras: si $a = (3,4)$$|a| = |(3,4)| = \sqrt(3^2+4^2)$.

Ahora los bits de la parte difícil: Las matrices (en singular 'matrix') están en nuestro caso 2x2 tablas que representan una función que asigna un 2d-sistema de coordenadas a otro 2d-sistema de coordenadas. Pero esta asignación tiene propiedades especiales, los llamados linealidad , por ejemplo, las líneas paralelas se sigue en paralelo después de la aplicación de esa asignación. Eso significa que básicamente se pueden utilizar matrices para estirar el sistema de coordenadas en cualquier dirección o girar (o combinar los dos). Ahora bien, si tiene un vector en el primer sistema de coordenadas, se tiene que multiplicar con la matriz, para obtener las coordenadas de los vectores en el segundo sistema de coordenadas.

Pero ¿cómo se puede multiplicar una tabla de 2x2 con un vector?

Para este propósito hacemos convencionalmente escribir los vectores verticalmente y no horizontalmente: $(1,3) = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$ (El horizontal es sólo conveniente para escribir los vectores dentro de un texto, pero el vertical es más conveniente a la hora de calcular.)

Así que tenemos una matriz (normalmente escrito en letras grandes) $A = \begin{pmatrix} a & b \\ c & d \end{pmatrix}$ donde $a,b,c,d$ son valores reales (como $0.5,100,-2.1345123,\sqrt{2}$) Ahora tenemos un vector $v = (v_1 , v_2) = \begin{pmatrix} v_1 \\ v_2 \end{pmatrix}$ que queremos mapa de la primera oen el segundo sistema de coordenadas. El mapeado versión de la misma en el segundo sistema de coordenadas ahora llamo a $w = (w_1 , w_2) = \begin{pmatrix} w_1 \\ w_2 \end{pmatrix}$. Ahora vamos a ver cómo se multiplica la matriz con los vectores:

$$\begin{pmatrix} w_1 \\ w_2 \end{pmatrix} = w = A\cdot v = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \cdot \begin{pmatrix} v_1 \\ v_2 \end{pmatrix} = \begin{pmatrix} a \cdot v_1 + b \cdot v_2 \\ c \cdot v_1 + d \cdot v_2 \end{pmatrix}$$

Así que ahora la nueva coordenada x es $w_1 = a \cdot v_1 + b \cdot v_2$ y la nueva coordenada y es $w_2 = c \cdot v_1 + d \cdot v_2$.

Ahora, la última cosa que necesitamos es calcular el ángulo entre dos vectores: Si se tienen dos vectores $a$ $b$ puede construir el ángulo de la siguiente manera: Si dibuja los puntos con el mismo sistema de coordenadas como $a$ $b$ y conectar cada punto con una línea recta con el punto de $(0,0)$ que se puede medir el ángulo entre las dos líneas en $(0,0)$. Este es el ángulo entre los vectores. Aquí es donde el llamado producto escalar : Eso es un 'producto' que 'multiplica' dos vectores y devuelve un valor escalar (a veces también llamado 'punto'. Se define como sigue: $\langle a , b \rangle = a_1\cdot b_1 + a_2 \cdot b_2$. Lo que ocurre es que si se divide ese valor por la longitud de ambos vectores, se obtiene el coseno del ángulo entre los dos: $\frac{\langle a , b\rangle}{|a|\cdot|b|} = \cos(\alpha)$ Así que si tenemos dos vectores de la misma longitud y desea determinar cuánto tenemos que convertir uno (el pivote siempre va a ser $(0,0)$) para obtener el segundo, podemos resolver esta ecuación para $\alpha$. Por lo que si ahora plug $\alpha$ en la matriz de rotación se consigue la exacta correspondencia que gira todo el sistema de coordenadas exactamente esa cantidad. Esto significa que si usted ahora multiplique el primer vector con la matriz, obtendrá el vector rotado, el segundo. (Eso es lo que he escrito primero en la respuesta con los ejemplos $a = (-1,0)$$b = \frac{1}{\sqrt{2}} (-1,1)$.

Sé que ha sido un minimalista introducción al cálculo con vectores. Es un gran tema, pero también divertido y útil, especialmente cuando usted está en la programación de juegos. Me gustaría absolutamente como para darle una recomendación de un libro o una web de recursos para llegar a esto, pero sé que nada de esto en inglés. Espero que los haya ayudado (y motivación).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X