Noticias

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

rotacion al cambiar 2 objetos entre si

Iniciado por Abramelin, Agosto 28, 2015, 06:40:05 PM

Tema anterior - Siguiente tema
Agosto 28, 2015, 06:40:05 PM Ultima modificación: Agosto 28, 2015, 06:41:02 PM por Abramelin
al cambiar entre el objeto first y third no hay problema alguno, solo que siempre quedan mirando hacia la misma dirección.en target1 hay un children de first que siempre queda delante del jugador.en target3 un children del objeto third que siempre queda delante de él.
var first : GameObject;
var third : GameObject;
var target1 : Transform;
var target3 : Transform;

private var playerpos1 : Transform;
private var playerpos3 : Transform;

private var relativePos1 = target3.position - transform.position;
private var relativePos3 = target1.position - transform.position;    
private var rotation1 = Quaternion.LookRotation(relativePos1);
private var rotation3 = Quaternion.LookRotation(relativePos3);  
   
function Start () {
    playerpos1 = first.transform;
    playerpos3 = third.transform;    
}
   
function Update () {
    if(Input.GetButtonDown("camview")){
        if (first.activeSelf == true){
            third.SetActive(true);
            third.transform.position = playerpos1.position;
           
            third.transform.rotation = rotation1;
            first.SetActive(false);
        }
        else{
            first.SetActive(true);
            first.transform.position = playerpos3.position;
           
            first.transform.rotation = rotation3;
            third.SetActive(false);
        }
    }
}
¿que está mal? ¿porque no rotan en la direccion del target?

mmm  puedes explicar un poco que es lo que quieres lograr?

Bye Bye



Cita de: Oak Human Flesh date=1440885680" data-ipsquote="" data-cite="Oak Human Flesh" class="ipsQuote">mmm :(

Hay una función lookat en transform o rotation.

Agosto 30, 2015, 06:31:38 PM #4 Ultima modificación: Agosto 30, 2015, 06:32:57 PM por Abramelin
Cita de: iRobb date=1440947410" data-ipsquote="" data-cite="iRobb" class="ipsQuoteHay una función lookat en transform o rotation.
utilicé esa función, pero me rota todos los ejes y me deja el player "doblado"... creo que lo único que necesito es rotar el eje X, pero con el código que he puesto siempre "resetean" ambos objetos hacia la misma dirección... digo resetean porque me da la impresión que al hacer el cambio se gira hacia el 0.

Tal vez el problema sea que las rotaciones rotacion1 y rotacion3 son fijas, las inicializas al principio.

[quote author=juanma_teso date=1440952770" data-ipsquote="" data-cite="juanma_teso" class="ipsQuote">Tal vez el problema sea que las rotaciones rotacion1 y rotacion3 son fijas, las inicializas al principio.[/quote]las puse justo en los renglones vacios que hay en update pero me daba un error "not find rotation" o algo asi... por eso las puse al principio ¿como seria exactamente lo que tu dices? duplico estas lineas y las pongo en los renglones vacios de update?
private var rotation1 = Quaternion.LookRotation(relativePos1);
private var rotation3 = Quaternion.LookRotation(relativePos3
								

No, yo lo que digo es:
private var rotacion1;

//Tu función de cambio de cámara.
rotacion1 = Quaternion.LookRotation(relativePos1);
third.transform.rotation = rotation1;
Justo antes de aplicar el cambio de rotación, la defines de nuevo.

Ya lo he puesto como me has dicho y siempre me devuelve la misma direccion, seguro que algo esta mal en mi codigo...seguire dandole vueltas, gracias de todas formas.

Agosto 31, 2015, 01:43:32 AM #9 Ultima modificación: Agosto 31, 2015, 06:12:32 AM por Oak Human Flesh
no comprendo mucho lo que quieres hacer, debido a que el calculo de las rotaciones no es solo tomando como referencia los tres ejes de rotación y es un tanto mas complejo de explicar, pero imaginar que tengo un objeto a 5mts delante de la cámara luego sus vectores serian x = 0, y = 0, z = 5, pero para mirar a el objeto, si la cámara esta en la posición del vector 0 entonces sus rotaciones serian en los tres ejes locales 0 (esto es con respecto a su centro y no al mundo ).Entonces se me ocurre mover aquel objeto 5mts a la izquierda luego sus valores nuevos serian PosObj = Vector3(-5, 0, 5), luego la cámara para mirar hacia el tendría que establecer una rotación de 0° en x, 315° en Y y en z serian 0°...[quote author=Abramelin" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="19433" data-ipsquote-contentcommentid="105962">utilicé esa función, pero me rota todos los ejes y me deja el player "doblado"... creo que lo único que necesito es rotar el eje X, pero con el código que he puesto siempre "resetean" ambos objetos hacia la misma dirección... digo resetean porque me da la impresión que al hacer el cambio se gira hacia el 0.[/quote]entonces utilizar el lookAt no esta muy lejos de solucionar el problema, puesto que este nos hace el calculo de la dirección hacia el objeto rápidamente y sin liarnos con los Quaternions.entonces un código básico para manejar la cámara principal usando el LookAt seria al asi:
Camera.main.transform.LookAt(target);
y luego su implementación básica para mirar hacia objetos estáticos seria por ejemplo algo como esto
   CameraControl (target1, position1.position);
}
if(Input.GetButtonDown("Fire1")){
   CameraControl (target2, position2.position);
}
}
function CameraControl (target : Transform, newPos : Vector3)
{
Camera.main.transform.position = newPos;
Camera.main.transform.LookAt(target);
}
luego si se desea aplicar algún tipo de corrección en el punto a donde se desea apuntar la cámara se puede usar un ejemplo algo asi:
function CameraControl (target : Transform, newPos : Vector3)
{
Camera.main.transform.position = newPos;
Camera.main.transform.LookAt(target.position - newPos);
//   Camera.main.transform.LookAt(target);
}
entonces se puede apreciar que estamos pasando como parámetro un resultado de topo Vector3.Luego si deseamos controlar hacia donde mira (que seria el punto al cual mira) nuestra cámara, se puede usar algo como esto:
Camera.main.transform.LookAt(Vector3(target.position.x, target.position.y, target.position.z));
entonces el código de ejemplo quedaría algo asi:
#pragma strict
var target1 : Transform;
var target2 : Transform;
var position1 : Transform;
var position2 : Transform;
var camRotation : Vector3;
function Start () {

}

function Update () {
if(Input.GetButtonUp("Fire1")){
   CameraControl (target1, position1.position);
}
if(Input.GetButtonDown("Fire1")){
   CameraControl (target2, position2.position);
}
}
function CameraControl (target : Transform, newPos : Vector3)
{
Camera.main.transform.position = newPos;
Camera.main.transform.LookAt(Vector3(target.position.x, target.position.y, target.position.z));
//   Camera.main.transform.LookAt(target);
}
finalmente, si la cámara queda en una posición mas lejana al target automaticamante corregirá sus rotaciones.ahora lo que se debe tener en consideración es si los objetos son hijos de otro obj o no, si no lo son, sus transformaciones son respecto al mundo, y si son hijos de un objeto entonces sus transformaciones locales corresponderán a las heredadas del objeto padre mas sus transformaciones locales.es como si los objetos partieran siendo hijos de las transformaciones del mundo, luego si son hijos de otros objetos estos toman como referencia para sus transformaciones el Objeto padre.  Esto hay que tenerlo muy claro para jugar con sus transformaciones, ejemplo:
function Update () {
// orienta nuestra cámara 315° solo en el eje y... resultado en el inspector de unity: rotation(0, 315, 0)
Camera.main.transform.localEulerAngles = Vector3 (0, 315, 0);
}
 con lo cual ya se puede empezar a experimentar con la rotación local (que es relativa al objeto padre) fácilmente usando esto:
#pragma strict
var myRotacionLocal : Vector3;
function Update () {
transform.localEulerAngles = myRotacionLocal;
}
luego trabajar con los angulos Euler puede resultar algo complejo (no imposible). ref Angulos Euler https://es.wikipedia.org/wiki/%C3%81ngulos_de_Euler">https://es.wikipedia.org/wiki/Ángulos_de_Eulertambién se puede trabajar usando el Quaternion como indica http://unityspain.com/profile/26011-juanma_teso/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F19433-rotacion-al-cambiar-2-objetos-entre-si%252F" data-ipshover="" href="<___base_url___>/profile/26011-juanma_teso/">juanma_teso , un ejemplo de código seria algo asi (usando la rotación local (no los angulos Euler))
var direccion : Vector3;
transform.localRotation = Quaternion.LookRotation(direccion);
este cambia la rotación local respecto al mundo según el valor de la dirección.luego algo un poco mas complejo seria como este ejemplo:
#pragma strict
var myRotacionLocal : Vector3;
var target : Transform;
var rumbo : Vector3;
var direccion : Vector3;
var distancia : float;
var controlOver : boolean;
function Update () {
rumbo = target.position - transform.position;
distancia = rumbo.magnitude;
direccion = rumbo / distancia;
if(controlOver)
   transform.localRotation = Quaternion.LookRotation(direccion);
else
   transform.localRotation = Quaternion.LookRotation(myRotacionLocal);
}
este script estaría directamente asignado al objeto cámara para su ejecución.en el objeto target se puede asignar algo simple como esto para probarlo:
function Update () {
transform.Translate(Input.GetAxis("Horizontal") * Time.deltaTime * 3, 0, 0);
}
entonces el resultado seria que nuestra cámara dirigiría su mirada hacie el target, target que puede moverse usando los controles del eje Horizontal (por defecto en Unity flrchas Lh Rh, o teclas a s).luego un cambio de target seria muy simple:
#pragma strict
var myRotacionLocal : Vector3;
var target : Transform;
var target1 : Transform;
var target2 : Transform;
var rumbo : Vector3;
var direccion : Vector3;
var distancia : float;
var controlOver : boolean = true;
var changeTarget : boolean;
function Update () {
// activa o desactiva el control por com*** de direccion
if(Input.GetKeyDown("c"))
{
   controlOver = !controlOver;
}
// controla el cambio del target
if(Input.GetButtonUp("Fire1"))
{
   changeTarget = !changeTarget;
}
// cambia el target
if(changeTarget)
{
   target = target2;
}
else
{
   target = target1;
}
// establece un control de la rotacion local
if(controlOver){
   // com*** la direccion hacia el target y luego la pasa
   // a la rotacion local.
   rumbo = target.position - transform.position;
   distancia = rumbo.magnitude;
   direccion = rumbo / distancia;
   transform.localRotation = Quaternion.LookRotation(direccion);
}
else{
   // establece la rotacion local segun el valor del vector3 myRotacionLocal
   transform.localRotation = Quaternion.LookRotation(myRotacionLocal);
}
}
ref: http://docs.unity3d.com/es/current/Manual/ComputingNormalPerpendicularVector.html">http://docs.unity3d.com/es/current/Manual/ComputingNormalPerpendicularVector.htmlhttp://docs.unity3d.com/es/current/Manual/DirectionDistanceFromOneObjectToAnother.htmlcon esto se deben crear dos targets estos pueden ser para pruebas unos cubos a los cuales se les puede asignar este script (a cada uno), para proposito de test:
#pragma strict

function Update () {
if(transform.gameObject.name == "target1")
   transform.Translate(Input.GetAxis("Horizontal") * Time.deltaTime * 3, 0, 0);
else if(transform.gameObject.name == "target2")
   transform.Translate(0, Input.GetAxis("Vertical") * Time.deltaTime * 3, 0);
}
entonces hemos finalmente cambiado la rotación local y sin entrar demasiado en el calculo de angulos, esto lo hace el transform.lookAt().luego un script basico de cambio de cámara en primera persona y en tercera persona, podría proyectarse algo asi:#pragma strict
var myRotacionLocal : Vector3;
var player : Transform;
var target : Transform;
var target1 : Transform;
var target2 : Transform;
var posCamPrimeraPers : Transform;
var posCamTerceraPers : Transform;
var puntoMedio : Vector3;
var camTrim : float = 0.5;
var rumbo : Vector3;
var direccion : Vector3;
var distancia : float;
var controlOver : boolean = true;
var changeTarget : boolean;
function Start ()
{
player = GameObject.FindWithTag("Player").transform;
}
function Update () {
// activa o desactiva el control por com*** de direccion
if(Input.GetKeyDown("c"))
{
   controlOver = !controlOver;
}
// controla el cambio del target
if(Input.GetButtonUp("Fire1"))
{
   changeTarget = !changeTarget;
}
// cambia el target
if(changeTarget)
{
   target = target2;
   Camera.main.transform.position = posCamTerceraPers.position;
}
else
{
   target = target1;
   Camera.main.transform.position = posCamPrimeraPers.position;
}
// establece un control de la rotacion local
if(controlOver){
   // com*** la direccion hacia el target y luego la pasa
   // a la rotacion local de la camara.
   if(target == target2){
      // calculo de puntoMedio a orientar camara en tercera persona
      puntoMedio = (target.position - player.position) * camTrim;
      rumbo = puntoMedio - Camera.main.transform.position;
   }
   else
   {
      // calculo de rumbo para camara en primera persona
      rumbo = target.position - Camera.main.transform.position;
   }
   distancia = rumbo.magnitude;
   direccion = rumbo / distancia;
   Camera.main.transform.localRotation = Quaternion.LookRotation(direccion);
}
else{
   // establece la rotacion local de la camara segun el valor del vector3 myRotacionLocal
   Camera.main.transform.localRotation = Quaternion.LookRotation(myRotacionLocal);
}
}Ahi dejo una descarga con un proyecto de test con el layout especifico a como me imagine lo que te explique, espero te ayude (M.H 3hrs) CameraControllerBasics.unitypackage

Bye Bye



Te los has trabajado @Oak Human Flesh y gracias por explicarle que se pueden gira cualquier eje. 

[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="19433" data-ipsquote-contentcommentid="106078">Te los has trabajado http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard" data-mentionid="25934" href="<___base_url___>/profile/25934-oak-human-flesh/">@Oak Human Flesh y gracias por explicarle que se pueden gira cualquier eje. [/quote]es un trabajo relacionado más con un hobby ;)

Bye Bye



joder mil gracias @http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F19433-rotacion-al-cambiar-2-objetos-entre-si%252F%253F_fromLogin%253D1" title="Go to Oak Human Flesh's profile" href="<___base_url___>/profile/25934-oak-human-flesh/">Oak Human Flesh, voy a trastearlo bien porque son muchas cosas nuevas de golpe. Los objetos son todos childrens, en el caso de la primera persona si seria la camara la que rota, pero al ser children del first (que tambien es children de otro objeto), roto este directamente (first) ya que va a rotar sus children. en el third es distinto ya que es el modelo el que tiene que girar y no la camara (camara distinta con propiedades distintas, no queda siempre atras del jugador), por eso en ningun caso meto a la camara en el codigo. los objetos target son un cubo justo delante a poca distancia, he comprobado mil veces que el cubo queda justo delante al girar para asegurarme...me voy a mirar tu ejemplo despacito y te agradezco mucho que te hayas tomado la molestia en explicarmelo tan detalladamente

[quote author=Abramelin" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="19433" data-ipsquote-contentcommentid="106111">joder mil gracias @http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F19433-rotacion-al-cambiar-2-objetos-entre-si%252F%253F_fromLogin%253D1" title="Go to Oak Human Flesh's profile" href="<___base_url___>/profile/25934-oak-human-flesh/">Oak Human Flesh, voy a trastearlo bien porque son muchas cosas nuevas de golpe. Los objetos son todos childrens, en el caso de la primera persona si seria la camara la que rota, pero al ser children del first (que tambien es children de otro objeto), roto este directamente (first) ya que va a rotar sus children. en el third es distinto ya que es el modelo el que tiene que girar y no la camara (camara distinta con propiedades distintas, no queda siempre atras del jugador), por eso en ningun caso meto a la camara en el codigo. los objetos target son un cubo justo delante a poca distancia, he comprobado mil veces que el cubo queda justo delante al girar para asegurarme...me voy a mirar tu ejemplo despacito y te agradezco mucho que te hayas tomado la molestia en explicarmelo tan detalladamente[/quote]ahi hay bastante material ;)

Bye Bye



Cita de: Oak Human Flesh date=1440994466" data-ipsquote="" data-cite="Oak Human Flesh" class="ipsQuote">ahi hay bastante materialimg]Smileys/invision/default_wink.png] Exito
te lo resubo con una escena aparte para que se entienda mejor lo que quiero hacer. de momento no he tocado nada, estoy viendo como adaptarlo.

Etiquetas: