[Unity] Duda de matemáticas y quaternions

marod

Hola a todos.

Un día más vengo con mis dudas, esta vez me encontraba yo viendo un tutorial de como hacer un juego Top Down 2D y el que lo explica pone este codigo:

var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Quaternion rot = Quaternion.LookRotation(transform.position - mousePosition, Vector3.forward);

Mi duda reside en directamente el metodo LookRotation(), no entiendo porqué directamente no escribe mousePosition y en cambio resta la posición del objecto a la posición del ratón ni tampoco el porqué pone Vector3.forward.

Un saludo y gracias.

VicoViper

Voy a serte sincero.

No preguntes por los quaternions, al menos no por ahora. Son algo muy complicado, un dolor de cabeza. Los quaternions trabajan con sus propios métodos porque es extremadamente complicado trabajar con ellos de cualquier otra manera.
Nunca intentes modificar los quaternions por tu cuenta. Y sinceramente, si puedes ignorarlos por ahora, cuando tengas más nivel de Unity, puede que valga la pena volver a estas lecciones, pero ahora mismo te digo que uses sus métodos propios y te lo tomes como un dogma.

Si estás comenzando. Hay cosas más importantes por ahora.

2 2 respuestas
B

Los cuaterniones es una extensión de los números complejos (en 2D) a 3D.

Su álgebra para quien no domine algo las matemáticas es algo bastante dificil de operar y entender. Un cuaternión puede definir tu actitud (orientación) en
un espacio 3D, y su interés es enorme en gráficos 3D ya que el coste de operar con ellos es considerablemente bajo con respecto a otros métodos más intuitivos.

Cómo dice #2, no es tanto un tema de Unity xD. Aquí tienes más info en español:

https://es.wikipedia.org/wiki/Cuaterni%C3%B3n

1 1 respuesta
marod

#2 #3 Gracias por contestar, pero más o menos los Cuaternion sé lo que son y sé también que son un poco berenjenal... pero bueno, intento entender todo lo que se me explica.

Ya he resuelto la duda de porqué usa Vector3.forward y es porque le indicas en que dirección debe mirar, en este caso en el eje Z. Lo que no he entendido aún a ver si me lo sabéis explicar es porqué hace esta resta "transform.position - mousePosition"

1 respuesta
FernandoA

#4 Al restar dos Vector3 obtienes un Vector3 con las diferencias de las coordenadas entre ámbos. Ejemplo:

Vector3(5,6,2) - Vector3(2,2,2) te daría: Vector3(3,4,0).

El resultado, si te fijas, es un Vector3 que indica la diferencia de coordenadas entre uno y otro o, lo que es lo mismo, la dirección que tiene que tomar en cada uno de los ejes para desplazarte de una posición a otra. En el caso que preguntas la resta se debe a que el primer valor que hay que pasarle a ese método es la dirección (por lo tanto la diferencia entre la posición inicial y la final) y no la posicion final (que sería mousePosition).

El segundo parámetro no es la dirección en la que debe mirar, ese es el primer parámetro. El segundo es opcional, se refiere a, en tu World Space, que dirección se corresponde con Vector3.Up (El eje Y positivo). Por defecto es Vector3.Up, pero si especifica uno será porque está la cámara girada, los ejes colocados de manera diferente o estás trabajando en 2D y te sobra uno de los ejes, eso ya no sé.

Por último: Vector3.Forward, .Up, .Down, etc son constantes que definen direcciones:
Vector3.Zero = Vector3(0,0,0)
Vector3.Forward = Vector3(0,0,1)
Vector3.Up = Vector3(0,1,0)
.... etc

1 1 respuesta
marod

#5 Vale vale, ya lo entiendo mejor. Yo lo que estoy averiguando con esa resta es la dirección del nuevo vector en el cual quiero que el Quaternion mire. Tengo las matemáticas un poco oxidadas pero poco a poco voy entendiendo las cosas.

Sí, quería referirme en el World Space respecto al segundo parámetro.

Muchas gracias a todos por vuestro tiempo en resolver mis dudas.

B

#1

Oye, al final cómo estás aprendiendo a emplear Unity? se te ve motivado :P

1 respuesta
marod

#7 Si no me motivo yo, no habrá nadie que lo haga, y no aprendere :D. Me estoy comiendo todos los Live sessions de Unity porque explican mucho mejor que los tutoriales de youtube y te lo dejan mucho más claro. Por ahora estoy con los de 2D pero mi intención es verme todos los Live Sessions que hay para empaparme de todo, intento hacer lo que dicen, pero no solo copiando y pegando sino intentando entender todo para que me quede claro, de ahí que siempre esté preguntado "chorradas", así en un futuro, cuando quiera hacer algún proyecto sabré usarlo, saber para que son las cosas y que puedo o no necesitar.

1 respuesta
B

#8

Hombre, no hay ninguna chorrada hasta que no la aprendes xD.

Son estos los tuto que estás siguiendo? https://unity3d.com/learn/live-training

En algún momento del año que viene cuando termine otras movidas me meteré con Unity, ya nos vas contando tu experiencia de primera mano.

Yo hasta ahora todo lo que he hecho ha sido a pelo, es decir, uso librerías de terceros (siempre libres) y nunca he usado ningún motor. También es cierto que nunca
he necesitado hacer un juego y siempre es bueno saber otras herramientas.

1 respuesta
marod

#9 Sí, esos mismos. Aprendes bastante.

Pues ya has hecho más que yo, antes de Unity me intente poner con LibGDX pero yo lo que quiero es dedicarme a hacer el juego en sí, no calentarme la cabeza de como debería adaptar el engine para que funcione, así que me decante por Unity que lo veo muchísimo más facil.

Yo voy a ir dejando un riguero de dudas por este foro, así que si alguna vez te pones, ya sabes xD

B

Para "bajo" nivel, a mi me valió empezar aprendiendo SDL con estos tutoriales

http://lazyfoo.net/tutorials/SDL/index.php

Y lo cierto que para 2D, no necesito nada más xD.

Ya le echo uno vistazo a esos live-training entonces, gracias!

Usuarios habituales