[RESOLVIDO] Ajuda com rotação local
4 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Ajuda com rotação local
Iae pessoal !!! Preciso de uma ajuda com a rotação em volta do eixo Y local do objeto. Abaixo está a imagem:
Na imagem gostaria que o objeto selecionado rotacione em volta do eixo Y local. Consegui fazer isso com o código abaixo :
O problema é que se eu mostrar o ângulo do eixo Y local ele mostra um resultado diferente do setado, que deveria ser 294° como na imagem abaixo:
Tentei fazer a rotação com transform.localEulerAngles mas ai ele rotaciona no eixo global.
Alguém poderia dizer como poderia fazer essa rotação mas indo para o mesmo ângulo que está setado no eixo Y?
Para mostrar o ângulo estou usando o código abaixo:
Na imagem gostaria que o objeto selecionado rotacione em volta do eixo Y local. Consegui fazer isso com o código abaixo :
- Código:
transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.Euler(0, 0, 45) * Quaternion.Euler(0, 294f, 0), Time.deltaTime * 50);
O problema é que se eu mostrar o ângulo do eixo Y local ele mostra um resultado diferente do setado, que deveria ser 294° como na imagem abaixo:
Tentei fazer a rotação com transform.localEulerAngles mas ai ele rotaciona no eixo global.
Alguém poderia dizer como poderia fazer essa rotação mas indo para o mesmo ângulo que está setado no eixo Y?
Para mostrar o ângulo estou usando o código abaixo:
- Código:
GUI.Label(new Rect(10, 30, 150, 100), "Eixo B = " + transform.localEulerAngles.y.ToString() + "°");
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
- Código:
public Vector3 Angulo;
public float Velocidade;
void Update()
{
Vector3 In = this.gameObject.transform.localEulerAngles + Angulo;
StartCoroutine(Rotacao(Angulo,Velocidade));
}
IEnumerator Rotacao(Vector3 final, float speed)
{
Vector3 inicio = transform.localEulerAngles;
for(float T = 0f; T <1f; T += speed * Time.deltaTime)
{
transform.localEulerAngles = Vector3.Lerp(inicio, final, T);
yield return null;}
transform.localEulerAngles = final;
}
}
oque realmente você esta tentando fazer?
Última edição por ffabim em Ter Abr 23, 2019 5:55 pm, editado 1 vez(es)
ffabim- MembroAvançado
- PONTOS : 3354
REPUTAÇÃO : 69
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
Desculpe mas o código acima fez ele girar no eixo Y global ainda.
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
Nowsfeky escreveu:Iae pessoal !!! Preciso de uma ajuda com a rotação em volta do eixo Y local do objeto. Abaixo está a imagem:
Na imagem gostaria que o objeto selecionado rotacione em volta do eixo Y local. Consegui fazer isso com o código abaixo :
- Código:
transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.Euler(0, 0, 45) * Quaternion.Euler(0, 294f, 0), Time.deltaTime * 50);
O problema é que se eu mostrar o ângulo do eixo Y local ele mostra um resultado diferente do setado, que deveria ser 294° como na imagem abaixo:
Tentei fazer a rotação com transform.localEulerAngles mas ai ele rotaciona no eixo global.
Alguém poderia dizer como poderia fazer essa rotação mas indo para o mesmo ângulo que está setado no eixo Y?
Para mostrar o ângulo estou usando o código abaixo:
- Código:
GUI.Label(new Rect(10, 30, 150, 100), "Eixo B = " + transform.localEulerAngles.y.ToString() + "°");
Trabalhar com rotações na Unity é complicado. A Unity trabalha com quaternions, e eles sempre convertem a rotação setada para o "menor valor" em graus. É difícil de explicar.
Tente trabalhar com soma de eulerAngles, dai a Unity não vai fazer bagunça, tipo:
localEulerAngles = newVector3(localEulerAngles.x, localEulerAngles.y, inicialEulerAnglesZ + anguloQueVoceQuer);
Re: [RESOLVIDO] Ajuda com rotação local
Pois então Marcos, realmente tá complicado isso aki rsrsrsrsrs. Tentei de várias formas com o localEulerAngles mas ele sempre rotaciona no eixo Y global.
Caso você tenha um tempo de fazer um tutorial sobre rotação local para ajudar agradeço. Flw...
Caso você tenha um tempo de fazer um tutorial sobre rotação local para ajudar agradeço. Flw...
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
Nowsfeky escreveu:Pois então Marcos, realmente tá complicado isso aki rsrsrsrsrs. Tentei de várias formas com o localEulerAngles mas ele sempre rotaciona no eixo Y global.
Caso você tenha um tempo de fazer um tutorial sobre rotação local para ajudar agradeço. Flw...
O seu ponto de visualização está como 'Global' ou 'Pivot'?
Re: [RESOLVIDO] Ajuda com rotação local
MarcosSchultz escreveu:Nowsfeky escreveu:Pois então Marcos, realmente tá complicado isso aki rsrsrsrsrs. Tentei de várias formas com o localEulerAngles mas ele sempre rotaciona no eixo Y global.
Caso você tenha um tempo de fazer um tutorial sobre rotação local para ajudar agradeço. Flw...
O seu ponto de visualização está como 'Global' ou 'Pivot'?
Está exatamente como na sua imagem. "Pivot" e "Local".
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
Ta, tenho uma dúvida... por que tu ta multiplicando um quaternion de 45 com um quaternion de 294?
Tente só isto:
Tente só isto:
- Código:
transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.Euler(0, 294f, 0), Time.deltaTime * 50);
Re: [RESOLVIDO] Ajuda com rotação local
Porque se não multiplicar ele não mantem a inclinação em 45. Com esse código acima o objeto sai da inclinação em 45 e fica em 0.MarcosSchultz escreveu:Ta, tenho uma dúvida... por que tu ta multiplicando um quaternion de 45 com um quaternion de 294?
Tente só isto:
- Código:
transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.Euler(0, 294f, 0), Time.deltaTime * 50);
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
De início, preciso te dizer algo óbvio... O que você vê no transform de cada objeto é a posição, rotação e escala referente ao objeto PAI na hierarquia, caso não exista um objeto pai, estes valores serão em relação ao mundo.
Tendo dito isto, vamos pro seu exemplo, você tem um objeto inicialmente rotacionado em 45 graus, filho de um objeto alinhado com os eixos do mundo, você pensa estar rotacionando apenas no Y, mas como a rotação que aparece no transform é referente ao PAI, pra ele você rotacionou um pouco em cada eixo pra ficar naquela rotação, pois suas posições/rotações não eram iguais no inicio da transformação.
Pra facilitar sua vida, você só precisa duplicar o objeto Eixo 45, filiar o original a essa cópia para que o original, referente a seu novo pai, tenha a rotação zerada, logo, ambos compartilham da mesma rotação. Assim você pode até mesmo rotacionar seu objeto usando o transform.Rotate(0,velocidade*Time.deltatime,0) que ele irá rotacionar corretamente (pois seu global agora é seu pai, que tem a mesma rotação que ele). Não se esqueça de remover do objeto pai os componentes não necessários como Mesh Renderer, etc. Deixe apenas o Transform.
Sobre mostrar esse valor correto da rotação num texto ou coisa parecida, também é fácil. Note que sua rotação agora é baseada num simples transform.Rotate(), basta você armazenar o valor que você usou no transform.Rotate em uma variável ex: float angulo;
Na função onde você rotaciona seu objeto, diga que angulo += velocidade*Time.deltatime;
Com isso você terá o valor exato da rotação (angulo, este não mais limitado a 180° ou 360°) e o correto comportamento da rotação do seu objeto.
isso tudo sem se preocupar com cálculos usando Quaternions ou EulerAngles... fácil, como deve ser.
Aqui o resultado que consegui seguindo essa lógica:
#---------- Não implementei isto no exemplo, mas é relativamente fácil de fazer ------------#
Caso queira definir um ângulo manualmente, fazendo com que o Eixo 45 gire até ele, basta fazer:
se angulo < anguloDesejado, você incrementa no transform.Rotate().
se angulo > anguloDesejado, você decrementa no transform.Rotate().
#----------------------------------------------------------------------------------------#
Olhe sua caixa de entrada, mandei uma PM pra você com o link desse projeto.
Tendo dito isto, vamos pro seu exemplo, você tem um objeto inicialmente rotacionado em 45 graus, filho de um objeto alinhado com os eixos do mundo, você pensa estar rotacionando apenas no Y, mas como a rotação que aparece no transform é referente ao PAI, pra ele você rotacionou um pouco em cada eixo pra ficar naquela rotação, pois suas posições/rotações não eram iguais no inicio da transformação.
Pra facilitar sua vida, você só precisa duplicar o objeto Eixo 45, filiar o original a essa cópia para que o original, referente a seu novo pai, tenha a rotação zerada, logo, ambos compartilham da mesma rotação. Assim você pode até mesmo rotacionar seu objeto usando o transform.Rotate(0,velocidade*Time.deltatime,0) que ele irá rotacionar corretamente (pois seu global agora é seu pai, que tem a mesma rotação que ele). Não se esqueça de remover do objeto pai os componentes não necessários como Mesh Renderer, etc. Deixe apenas o Transform.
Sobre mostrar esse valor correto da rotação num texto ou coisa parecida, também é fácil. Note que sua rotação agora é baseada num simples transform.Rotate(), basta você armazenar o valor que você usou no transform.Rotate em uma variável ex: float angulo;
Na função onde você rotaciona seu objeto, diga que angulo += velocidade*Time.deltatime;
Com isso você terá o valor exato da rotação (angulo, este não mais limitado a 180° ou 360°) e o correto comportamento da rotação do seu objeto.
isso tudo sem se preocupar com cálculos usando Quaternions ou EulerAngles... fácil, como deve ser.
Aqui o resultado que consegui seguindo essa lógica:
#---------- Não implementei isto no exemplo, mas é relativamente fácil de fazer ------------#
Caso queira definir um ângulo manualmente, fazendo com que o Eixo 45 gire até ele, basta fazer:
se angulo < anguloDesejado, você incrementa no transform.Rotate().
se angulo > anguloDesejado, você decrementa no transform.Rotate().
#----------------------------------------------------------------------------------------#
- Codigo usado:
- Código:
using UnityEngine;
using UnityEngine.UI;
public class MostrarAnguloEixo : MonoBehaviour
{
public Text texto;
public float velocidade;
public float rotacao = 0;
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Rotate(0, velocidade * Time.deltaTime, 0);
rotacao += velocidade * Time.deltaTime;
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotate(0, -velocidade * Time.deltaTime, 0);
rotacao += -velocidade * Time.deltaTime;
}
texto.text = "Eixo B = "+rotacao.ToString("F2")+"°";
}
}
Olhe sua caixa de entrada, mandei uma PM pra você com o link desse projeto.
Isabela- Avançado
- PONTOS : 2834
REPUTAÇÃO : 260
Idade : 24
Respeito as regras :
Re: [RESOLVIDO] Ajuda com rotação local
Nossa Isabela !!! Simplesmente sensacional. Resolveu meu problema e minha dúvida em relação à como trabalhar com objetos pai e filho. Muito bom saber que a rotação segue a do objeto pai.
Muito obrigado !!!!
Muito obrigado !!!!
Nowsfeky- Iniciante
- PONTOS : 2312
REPUTAÇÃO : 5
Idade : 37
Áreas de atuação : Iniciante em programação C#.
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Ajuda com orientação de rotação de objeto
» [RESOLVIDO] Duas condiçao ''if''' em um so local
» [RESOLVIDO]MultiPlayer Local Android!
» [RESOLVIDO] Ajuda com o IEnumerator... SERIAO MSM, Preciso de ajuda.
» [RESOLVIDO] Como consigo uma conexão local?
» [RESOLVIDO] Duas condiçao ''if''' em um so local
» [RESOLVIDO]MultiPlayer Local Android!
» [RESOLVIDO] Ajuda com o IEnumerator... SERIAO MSM, Preciso de ajuda.
» [RESOLVIDO] Como consigo uma conexão local?
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos