Sign in to follow this  
manawydan

Um pouco sobre interpolate

Recommended Posts

Eai pessoal,

Hoje tentarei fazer um tutorial sobre a função "interpolateBetween", segundo a wiki (traduzida):Interpola um vetor 3D entre um valor de origem e um valor-alvo usando interpolação linear ou de qualquer outro.

Então ela pode ser usada para interpolar(seria algo como pegar valores entre o inicio e o fim de valores, entenderam melhor vendo o tutorial).

-- teste interpolação 
  
local px,py,pz,a,b,c 
local iniciou = false 
local tempoIni = false 
local tempoFin = false 
local roda = nil 
  
addCommandHandler("teste", 
function() 
if(iniciou)then outputChatBox("Ja esta iniciado") return end 
 px,py,pz = getElementPosition(localPlayer) 
 local r = getPedRotation(localPlayer) 
 a,b,c = px+math.sin(math.rad(-r))*10,py+math.cos(math.rad(-r))*10,pz 
 tempoIni = getTickCount() 
 tempoFin = tempoIni+10000 
 roda = createObject(1085,a,b,c) 
 addEventHandler("onClientRender",root,interpoleRender) 
end) 
  
function interpoleRender() 
local tickAgora = getTickCount() 
local tempoPassado = tickAgora - tempoIni 
local duration = tempoFin - tempoIni 
local progreso = tempoPassado / duration 
  
if(tickAgora>=tempoFin)then 
removeEventHandler("onClientRender",root,interpoleRender) 
else 
local x,y,z = interpolateBetween(px,py,pz,a,b,c,progreso,"InElastic") 
outputChatBox(x) 
setElementPosition(roda,x,y,z) 
end 
end 

Basicamente, criamos um objeto na frente do jogador(por isso tive que usar seno e coseno) e entao movemos ele pra frente, a função de interpolação que eu usei é "InElastic", nela os primeiros valores são baixos, alguns até negativos, e o final é mais rápido(parecendo um movimento de elástico). Teste você tambem para ver o efeito.

Você pode acessar as funções de interpolação(Easing) em https://wiki.multitheftauto.com/wiki/Easing

Por inquanto é isso, pretendo dar mais alguns exemplos para vocês (e eu ja que nunca usei essa função)entenderem.

Video exemplo:

Script do marker colorido:

-- teste interpolação 
  
local r,g,b,a,b2,c 
local iniciou = false 
local tempoIni = false 
local tempoFin = false 
local roda = nil 
  
addCommandHandler("teste", 
function() 
if(iniciou)then outputChatBox("Ja esta iniciado") return end 
local x,y,z = getElementPosition(localPlayer) 
 tempoIni = getTickCount() 
 tempoFin = tempoIni+5000 
r,g,b=255,0,0 
a,b2,c = 0,0,255 
 roda =  createMarker(x,y,z,"cylinder",1,r,g,b,255) 
 addEventHandler("onClientRender",root,interpoleRender) 
end) 
  
function interpoleRender() 
local tickAgora = getTickCount() 
local tempoPassado = tickAgora - tempoIni 
local duration = tempoFin - tempoIni 
local progreso = tempoPassado / duration 
  
if(tickAgora>=tempoFin)then 
removeEventHandler("onClientRender",root,interpoleRender) 
else 
local x,y,z = interpolateBetween(r,g,b,a,b2,c,progreso,"Linear") 
setMarkerColor(roda,x,y,z,255) 
end 
end 

Esse foi apenas um tutorial básico para se ter noção desta função. Esta é a primeira vez que a utilizo então me corrijam se eu estiver errado.

Share this post


Link to post

Você poderia ter explicado sobre cada argumento usado na função interpolateBetween (px, py, pz, a, b, c, progreso), acho que iria acrescentar muito mais ao tutorial.

Seria bem útil também, deixar comentários pelo código.

No entanto, achei uma ótima iniciativa e espero que você possa melhorá-lo para que as pessoas possam aprender sobre isso.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.