[RESOLVIDO] Lerp não funciona direito com valores grandes
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Lerp não funciona direito com valores grandes
Olá, preciso de ajuda com Lerp, pois este não está funcionando direito, por exemplo : se eu usar o Lerp em um objeto no eixo X, de 100 à 200(de acordo com o eixo global), o mesmo não realiza a função padrão do Lerp, mas se eu definir o eixo X de 0 à 10 este funciona normalmente, e isso é totalmente estranho...
Esta foi a linha de código que usei para realizar a função do Lerp, mas por algum motivo totalmente estranho e esquisito ele não move o valor quando é um valor alto(eixo X de 100 à 200, ou de 300 à 350)... Alguém pode me explicar por que isso acontece?
- Código:
transform.position = Vector3.Lerp(transform.position, MinVec, velocidade);
Esta foi a linha de código que usei para realizar a função do Lerp, mas por algum motivo totalmente estranho e esquisito ele não move o valor quando é um valor alto(eixo X de 100 à 200, ou de 300 à 350)... Alguém pode me explicar por que isso acontece?
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Aqui está o código completo :
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public Vector3 MaxVec;
public Vector3 MinVec;
public float velocidade;
public char eixo;
private string eix;
public bool indo;
public float Minimo;
public float Maximo;
public bool variar;
void Update () {
eix = eixo.ToString();
if (eix == "y")
{
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
}
if (eix == "x")
{
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
}
if (eix == "z")
{
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
}
if (transform.position == MaxVec)
{
indo = true;
}
if (transform.position == MinVec)
{
indo = false;
}
if (indo == true)
{
transform.position = Vector3.Lerp(transform.position, MinVec, velocidade);
}
else
{
transform.position = Vector3.Lerp(transform.position, MaxVec, velocidade);
}
if (variar)
{
velocidade = Random.Range(0.1f,0.4f);
}
}
}
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Tente isto... Eu troquei algumas coisas, e em vez do Lerp eu coloquei um MoveTowards, para fazer uma interpolação linear
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public float velocidade = 10;
public enum axis{EixoX, EixoY, EixoZ}
public axis Eixo = axis.EixoX;
public float Minimo, Maximo;
public bool variar;
bool indo;
Vector3 MaxVec;
Vector3 MinVec;
void Start(){
switch (Eixo) {
case axis.EixoX:
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
break;
case axis.EixoY:
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
break;
case axis.EixoZ:
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
break;
}
}
void Update () {
if (transform.position == MaxVec){
indo = true;
}
if (transform.position == MinVec){
indo = false;
}
if (indo == true){
transform.position = Vector3.MoveTowards(transform.position, MinVec, velocidade*Time.deltaTime);
}
else{
transform.position = Vector3.MoveTowards(transform.position, MaxVec, velocidade*Time.deltaTime);
}
if (variar){
velocidade = Random.Range(velocidade*0.5f,velocidade*1.5f);
}
}
}
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Obrigado... mas eu não queria uma interpolação linear, e também queria uma explicação de o por que o Lerp não funcionar direito quando o valor do eixo é altoMarcosSchultz escreveu:Tente isto... Eu troquei algumas coisas, e em vez do Lerp eu coloquei um MoveTowards, para fazer uma interpolação linear
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public float velocidade = 10;
public enum axis{EixoX, EixoY, EixoZ}
public axis Eixo = axis.EixoX;
public float Minimo, Maximo;
public bool variar;
bool indo;
Vector3 MaxVec;
Vector3 MinVec;
void Start(){
switch (Eixo) {
case axis.EixoX:
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
break;
case axis.EixoY:
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
break;
case axis.EixoZ:
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
break;
}
}
void Update () {
if (transform.position == MaxVec){
indo = true;
}
if (transform.position == MinVec){
indo = false;
}
if (indo == true){
transform.position = Vector3.MoveTowards(transform.position, MinVec, velocidade*Time.deltaTime);
}
else{
transform.position = Vector3.MoveTowards(transform.position, MaxVec, velocidade*Time.deltaTime);
}
if (variar){
velocidade = Random.Range(velocidade*0.5f,velocidade*1.5f);
}
}
}
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Com lerp? usando comparação de vetores com "=="???
neeem a pau, o fim do lerp vai ser lento DEMAIS, e o início do lerp vai ser rápido DEMAIS... tem certeza que quer isso?
neeem a pau, o fim do lerp vai ser lento DEMAIS, e o início do lerp vai ser rápido DEMAIS... tem certeza que quer isso?
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Com lerp fica assim:
E pra mim não deu nenhum problema com números grandes O.o
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public float velocidade = 10;
public enum axis{EixoX, EixoY, EixoZ}
public axis Eixo = axis.EixoX;
public float Minimo, Maximo;
public bool variar;
bool indo;
Vector3 MaxVec;
Vector3 MinVec;
void Start(){
switch (Eixo) {
case axis.EixoX:
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
break;
case axis.EixoY:
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
break;
case axis.EixoZ:
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
break;
}
}
void Update () {
if (!indo) {
if (Vector3.Distance (transform.position, MaxVec) < 0.1f) {
indo = true;
}
transform.position = Vector3.Lerp(transform.position, MaxVec, velocidade*Time.deltaTime);
} else {
if(Vector3.Distance(transform.position, MinVec) < 0.1f){
indo = false;
}
transform.position = Vector3.Lerp(transform.position, MinVec, velocidade*Time.deltaTime);
}
if (variar){
velocidade = Random.Range(velocidade*0.5f,velocidade*1.5f);
}
}
}
E pra mim não deu nenhum problema com números grandes O.o
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
MarcosSchultz escreveu:Com lerp? usando comparação de vetores com "=="???
neeem a pau, o fim do lerp vai ser lento DEMAIS, e o início do lerp vai ser rápido DEMAIS... tem certeza que quer isso?
A unica coisa que eu queria entender é o porque de o Lerp funcionar com valores como 10 à 20, 0 à 8... mas quando é 310 à 320 ele nunca volta à dar o Lerp de volta para o MinVec. Eu só quero interpolar suavemente entre dois valores repetidamente.
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Cara vou tentar usar este código aqui e ver como funcionaMarcosSchultz escreveu:Com lerp fica assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public float velocidade = 10;
public enum axis{EixoX, EixoY, EixoZ}
public axis Eixo = axis.EixoX;
public float Minimo, Maximo;
public bool variar;
bool indo;
Vector3 MaxVec;
Vector3 MinVec;
void Start(){
switch (Eixo) {
case axis.EixoX:
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
break;
case axis.EixoY:
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
break;
case axis.EixoZ:
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
break;
}
}
void Update () {
if (!indo) {
if (Vector3.Distance (transform.position, MaxVec) < 0.1f) {
indo = true;
}
transform.position = Vector3.Lerp(transform.position, MaxVec, velocidade*Time.deltaTime);
} else {
if(Vector3.Distance(transform.position, MinVec) < 0.1f){
indo = false;
}
transform.position = Vector3.Lerp(transform.position, MinVec, velocidade*Time.deltaTime);
}
if (variar){
velocidade = Random.Range(velocidade*0.5f,velocidade*1.5f);
}
}
}
E pra mim não deu nenhum problema com números grandes O.o
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Daniel Pires da Silva escreveu:MarcosSchultz escreveu:Com lerp? usando comparação de vetores com "=="???
neeem a pau, o fim do lerp vai ser lento DEMAIS, e o início do lerp vai ser rápido DEMAIS... tem certeza que quer isso?
A unica coisa que eu queria entender é o porque de o Lerp funcionar com valores como 10 à 20, 0 à 8... mas quando é 310 à 320 ele nunca volta à dar o Lerp de volta para o MinVec. Eu só quero interpolar suavemente entre dois valores repetidamente.
Ah, sim, tente com esse último código que eu postei
O que ocorre é que o Lerp interpola linearmente, dividindo sempre a distância por 2 e diminuindo, exemplo
De 0 a 20, ele vai fazer as seguintes posições:{ 0, 10, 15, 17.5, 18.25 e assim por diante}
Então, no final o movimento vai ficando cada vez mais lento, mas nunca chega exatamente em 20, vai sempre pegando a distância restante e dividindo por 2, ai percorre aquela metade e faz o cálculo novamente... e isto se agrava se você tem números muito grandes, pois vai dificultar mais ainda de chegar no 20.000000 (que é o limite da float, 7 casas decimais depois da virgola), e então vai ser difícil você igualar a comparação para a variável booleana trocar de estado... tipo
20,000001 é diferente de 20 exato, então vai demorar até que o a posição extrapole 7 casas decimais de precisão.
A solução para isto é usar um Vector3.Distance como eu utilizei, ou o melhor de todos, o MoveTowards, para fazer um movimento com velocidade constante
Re: [RESOLVIDO] Lerp não funciona direito com valores grandes
Cara funcionou muito bem, muito obrigado mesmo cara, e eu descobri aonde era o problema, era sim no "==", pois para ele mudar de Lerp tinha que ser o valor exato do MaxVec, e a unica coisa que eu precisava que eu nem percebi era usar Vector3.Distance e comparar a distância mínima para mudar o valor do Lerp, muito obrigado mesmo cara :vMarcosSchultz escreveu:Com lerp fica assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Armadilha : MonoBehaviour {
public float velocidade = 10;
public enum axis{EixoX, EixoY, EixoZ}
public axis Eixo = axis.EixoX;
public float Minimo, Maximo;
public bool variar;
bool indo;
Vector3 MaxVec;
Vector3 MinVec;
void Start(){
switch (Eixo) {
case axis.EixoX:
MaxVec = new Vector3(Maximo, transform.position.y, transform.position.z);
MinVec = new Vector3(Minimo, transform.position.y, transform.position.z);
break;
case axis.EixoY:
MaxVec = new Vector3(transform.position.x, Maximo, transform.position.z);
MinVec = new Vector3(transform.position.x, Minimo, transform.position.z);
break;
case axis.EixoZ:
MaxVec = new Vector3(transform.position.x, transform.position.y, Maximo);
MinVec = new Vector3(transform.position.x, transform.position.y, Minimo);
break;
}
}
void Update () {
if (!indo) {
if (Vector3.Distance (transform.position, MaxVec) < 0.1f) {
indo = true;
}
transform.position = Vector3.Lerp(transform.position, MaxVec, velocidade*Time.deltaTime);
} else {
if(Vector3.Distance(transform.position, MinVec) < 0.1f){
indo = false;
}
transform.position = Vector3.Lerp(transform.position, MinVec, velocidade*Time.deltaTime);
}
if (variar){
velocidade = Random.Range(velocidade*0.5f,velocidade*1.5f);
}
}
}
E pra mim não deu nenhum problema com números grandes O.o
Daniel Pires da Silva- Avançado
- PONTOS : 2754
REPUTAÇÃO : 37
Idade : 20
Áreas de atuação : Cursando C#
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Como Fazer Baked De Luz em Cenas Grandes?
» [RESOLVIDO] NavMesh nao funciona direito com terrain ?
» [RESOLVIDO] Unity - Giro do Personagem não está funcionando direito
» [RESOLVIDO] Como fazer um Mathf.Lerp com velocidade constante?
» [RESOLVIDO] Como fazer com que os valores do bool sejam iguais ao da lista?
» [RESOLVIDO] NavMesh nao funciona direito com terrain ?
» [RESOLVIDO] Unity - Giro do Personagem não está funcionando direito
» [RESOLVIDO] Como fazer um Mathf.Lerp com velocidade constante?
» [RESOLVIDO] Como fazer com que os valores do bool sejam iguais ao da lista?
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos