Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda rotación y movimiento

Iniciado por enelmenu, Junio 03, 2017, 06:11:29 AM

Tema anterior - Siguiente tema
Junio 03, 2017, 06:11:29 AM Ultima modificación: Junio 03, 2017, 06:17:28 AM por enelmenu
Hola gente, estoy haciendo un proyecto 3d en donde necesito mover un cubo rotandolo con las flechas o "w a s d", es decir que su movimiento sea un fuerza de desplazamiento y rotacion al mismo tiempo, donde el cubo se mueva rotandose, y logre hacer que rote y se desplace al mismo tiempo, pero mi problema principal es que cuando esa rotacion y desplazamiento ocurre mi cubo se me mueve de la pocision a donde quiero que valla...
 
Para explicarme mejor les dejo imagenes haber si me pueden ayudar
 
Bueno, como ven en las fotos (espero que se entienda mi nivel avanzado de paint) trato de explicar lo que me pasa en imagenes, ya que es dificil describir mi problema.
 
Pero basicamente, al hacer una fuerza de movimiento con rotacion (flecha numero 1), el cubo termina rebotando en el suelo y se separa lo cual mi cubo no cae donde quiero... Entonces lo que quiero lograr es intentar que (en la flecha numero 2) no se despege del suelo, asi cada movimiento que hago controlo la ubicacion del reposo del cubo (en la flecha numero 3 color Verde) en el suelo rotando 180º y a su vez desplazando hacia la direccion.
 
La ultima foto demuestra el error
 
La flecha roja indica la tecla que preciono en este caso "D", y ahi esta claro el error donde mi cubo se separa del suelo y reposa en la linea verde clarito, que es donde no quiero que repose, yo quiero que repose en la linea verde oscuro.
 
 
 
Aca les dejo mi Script que uso basicamenet uso ridgybody y velocity
 
https://pastebin.com/f0U5rEMu
 

 

 

 
 
 
 
 
Esto quiero que ocurra
 

 
 
 
Esto quiero que no ocurra
 

Hola, no probaste jugando con el parametro drag y mass? pregunto porque en las imagenes veo los valores por default. Si sale volando proba aumentar el mass, tene en cuenta que hay unos modos de fuerza que ignoran el mass, pero el default del addforce no. El drag te va a dar mas arrastre, por lo que la fuerza debe ser mayor, pero lo vas a tener mas "a suelo".
 
Pd: todo el mundo tiene Pro? sera que soy tan pobre

Cita de: lightbug date=1496465918Hola, no probaste jugando con el parametro drag y mass? pregunto porque en las imagenes veo los valores por default. Si sale volando proba aumentar el mass, tene en cuenta que hay unos modos de fuerza que ignoran el mass, pero el default del addforce no. El drag te va a dar mas arrastre, por lo que la fuerza debe ser mayor, pero lo vas a tener mas "a suelo".
   
   
      Pd: todo el mundo tiene Pro? sera que soy tan pobre


Si probe, pero me ignora el mass, nosabia que addforce no lo ignoraba, ahora mismo pruebo y te aviso


Hehehehe no es el Pro... mp si queres el modo dark jajaja <3

Cita de: enelmenu date=1496466129Si probe, pero me ignora el mass, nosabia que addforce no lo ignoraba, ahora mismo pruebo y te aviso


      Hehehehe no es el Pro... mp si queres el modo dark jajaja <3
   


Ajajja seee...el modo dark
 
AddForce tiene en cuenta todo, si lo usas (me parece) en velocitychange o cambias el vector de velocidad manualmente el mass esta de mas

Junio 03, 2017, 07:34:31 AM #4 Ultima modificación: Junio 03, 2017, 07:37:43 AM por enelmenu
Cita de: lightbug date=1496466796Ajajja seee...el modo dark
   
      AddForce tiene en cuenta todo, si lo usas (me parece) en velocitychange o cambias el vector de velocidad manualmente el mass esta de mas
   


Si ahi lo probe asi, dentro de Update y le cree la variable public float movementSpeed = 0.0f para editar la volocidad de la fuerza(AddForce).
 
No hay forma hermano, no puedo controlar el cubo loco este jajaja, si tenes un tiempito libre pobra el codigo, lo deje en pastebin en el post, y metele este if en el void Move() y saca el horizontal para probar vas a veeer es imposiblee jajajaja me da mucha bronca por que es algo tan simple y complejo a la vez... creo que tengo que usar los temidos Quaterniones me parece :/, fijate si lo probas por ahi se te ocurre algo si es que no te robo mucho tiempo.
 
metele un script Player a un cubo con un plano y proba
 

if (Input.GetAxis ("Vertical") != 0)
   {
//         rb.constraints = RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationX;
      float hAxis = Input.GetAxis ("Vertical");
      Vector3 moveDir = new Vector3 (hAxis, 0, 0);
      rb.AddForce(moveDir * movementSpeed);
   }

El valor de getaxis lo podes tomar de una antes de hacer todo asi ya te queda para cualquier calculo, igualmente la ventaja del getaxis es que en muchos casos te queda bien sin hacer el condicional, sobre todo si usas fuerzas
 
Como la dir es conocida (Vector3.right o 1,0,0 * hAxis) no es necesario usar un New, podes hacer.
 
El "rb.constraints" lo podes setear en OnEnable si queres y no cada vez apretas la tecla.
 
La parte de las fisicas(fuerzas y velocidades) van en fixedUpdate, la parte de las Input van en Update
 

void OnEnable(){
rb.constraints = RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationX;
}
void Update()
{
float hAxis = Input.GetAxis ("Vertical");
//si no apretas nada, no se aplica fuerza, hace lo mismo que con el if
Vector3 moveDir = hAxis * Vector3.right;   
//tene cuidado que si fuera el caso que apretes vertical y horizontal tendrias
//catetos de longitud 1, es decir longitud total de 1.41 (raiz de 2), es por eso que en los algunos juegos
//vas mas rapido en horizontal que en vertical, por eso te conviene siempre al vector de direccion total normalizarlo
}
void FixedUpdate(){   
rb.AddForce(moveDir * movementSpeed);
}

 
Las fisicas tienen eso, si no tenes el comportamiento matematico exacto (como el calculo de un salto por ejmplo o un tiro parabolico) tenes que terminar probando valores hasta que de.
 
Siempre hacé la prueba de fuego, pone movementSpeed en 5 millones , y si ahi no me mueve es porque hay algo mal mal.

Junio 03, 2017, 11:17:54 PM #6 Ultima modificación: Junio 03, 2017, 11:29:13 PM por enelmenu
Okey me sirvió  muchisimo esa informacion, yo que soy novato esa data que me tiraste me sirvió mucho, hice un gran avanze, ahora controle bien las Physics(fisicas) de mi objeto conrespecto al suelo, pero ahora tengo otro incoveniente, Logre que mi cubo no despege del suelo, pero ahora no se como resolver lo siguiente...
 
Cuando me muevo el eje X quiero que se transforme en un entero para poder ser una posicion exacta de movimiento, por ejemplo, estoy en la posicion transform 1 del eje X, y cuando me desplazo a la pocision 2, termina siendo por ejemplo 2.016761, y eso a la larga me afecta mucho... entonces pense, en crear un collider(tipo trigger) en cada cara del cubo que cuando repose, el eje X transforme(o redondee) un entero(int) en este caso 2, y el siguente 3...4...etc.

Se que existe una posibilidad de rendondear mi X con un collider transformandolo en trigger dandole la señal, pero nose como hacer el script de rendondeo del float de mi X   2.016761, 3.026574, 4.033235...etc que con la señal del trigger se transformen(redondeen) en 2, 3, 4...etc. para posicionar mi cubo perfectamente en cada sentencia de vuelta en mi recorrido
 
Espero haber explicadome hermano, gracias por la buena onda!! espero que puedas ayudarme 
 
Eso del redondeo es lo que se me ocurrio, pero si existe algo mas simple para moverme de eje 1 a 2 con esa rotacion que quiero mejor, no conosco mucho pero estoy aprendiendo mucho poco a poco

Ya lo solucione, desarrollar, programar, repetir repetir aprender, y lograr ese objetivo tan preciado sin duda es algo que no se compara con nada, es algo hermoso esa sensacion de decir "seee quedo una pinturita" dsp de horas y horas de trabajo...
 
Nada amo programar jajajaja

 
 
SOLUCION
 
Basicamente, cree triggers collider en cada cara del cubo como hijos de mi cubo, que cada vez que reposan redondean la posicion a un numero entero y lo acomoda automaticamente... es algo hermoso jajajaja pueden hacer infinidades de mecanicas con esto, como este foro es inteligencia colectiva, les dejo el codigo para que ustedes mismos expreimenten...


Creen una etiqueta "step" al suelo
 

void OnTriggerEnter (Collider col)
{
   if (col.gameObject.tag == "step")
   {
      int iValue = Mathf.RoundToInt(transform.position.x);
//         float fValue = iValue;
      transform.position = new Vector3(iValue,0.7f,3f); //Movimiento Horizontal por eje X
      Debug.Log("int val: " + iValue);   //Muestra de posicion
   }
}

 
 

Genial gracias por compartir, la idea es buena, podrias tambien haber usado raycast (mas "barato") en cada cara tambien, pero la idea está. Es bueno usar el round, te lo snapea muy bien, lo conoci hace poco y lo uso mucho en mis tiles.

Cita de: lightbug date=1496556941Genial gracias por compartir, la idea es buena, podrias tambien haber usado raycast (mas "barato") en cada cara tambien, pero la idea está. Es bueno usar el round, te lo snapea muy bien, lo conoci hace poco y lo uso mucho en mis tiles.
   


See los round yo los conoci en Java y me enamore de esa conversión nose porque jajajaja la magia de un numeraso a un numero totalmente controlado me da satisfaccion jajajaj
 
No hay problema, es uno de mis primeros script y obviamente es demaciado crudo jajajaja se puede mejorar en todo aspecto
 
Hmmmm no conosco ese componente raycast, ahora mismo me pongo a investigar gracias por el dato.

Junio 04, 2017, 08:40:56 AM #10 Ultima modificación: Junio 04, 2017, 08:41:30 AM por lightbug
Cita de: enelmenu date=1496557757See los round yo los conoci en Java y me enamore de esa conversión nose porque jajajaja la magia de un numeraso a un numero totalmente controlado me da satisfaccion jajajaj
   
   
       
   


El round es bastante simple de hacer, si tenes 10,7 te quedas con la mantisa 0.7 ,si es mayor o igual a 0.5 te quedas con 11, si no con 10. Yo bien mono los hacia asi hasta que lei por ahi de los round
 
Cita de: enelmenu date=1496557757Hmmmm no conosco ese componente raycast, ahora mismo me pongo a investigar gracias por el dato.
   


uff bienvenido a la fafa  jajaj con los cast es donde el mundo del desarrollo de juegos se maximiza.

Etiquetas: