Jump to content

animação nas rodas


Recommended Posts

boa tarde,

Pessoal queria saber se o MTA tem uma função que faz uma animação na esteira em skin de tanques (tipo Rhino) uma animação nas rodas, um exemplo é a esteira do Rhino tem um site do GTA:SA normal e vi um mod em modo CLEO que Habilita a animação da esteira do Rhino. E eu queria fazer a esteira de uma skin de um tanque mexer, pois ela fica PARADA e não mexe.

https://www.mixmods.com.br/2020/09/rhino-animated-tanque-original-animado/

Link to comment
On 20/01/2022 at 13:46, Lord Henry said:

Basicamente você pega a textura da esteira (vc precisa saber o nome dessa textura que está no TXD) e "movimenta" ela usando o shader.

Entendi, mais qual deles eu posso usar? Pois nao achei a shader que movimenta. Eu coloquei na shader e ele fica parado ainda

 

Link to comment
  • Other Languages Moderators

Como eu mencionei anteriormente, você usa o shader UV Scroll. Mas precisa saber configurar as coisas para que funcione.

Depois de estudar bastante o shader, fiz o resource inteiro e também editei um Rhino para testar. Também vinculei a velocidade do veículo ao movimento da textura.

client.lua

Spoiler
local ID = 432
local txd = {[ID] = engineLoadTXD ("rhino.txd")}
local dff = {[ID] = engineLoadDFF ("rhino.dff")}

addEventHandler ("onClientResourceStart", resourceRoot, function () 
    engineImportTXD (txd[ID], ID)
    engineReplaceModel (dff[ID], ID)
end)

-- |---------------------------------------------|
-- |  DAQUI PRA BAIXO É O CONTROLE DAS ESTEIRAS  |
-- |---------------------------------------------|
local shaders = {} -- Cada veículo terá um shader separado, caso contrário um tanque em movimento irá movimentar as texturas dos outros também.

addEventHandler ("onClientResourceStart", resourceRoot,	function() -- Executa essa função ao iniciar este resource.
    -- Version check
    if getVersion().sortable < "1.1.0" then
        outputChatBox ("Resource 'uv_scroll' is not compatible with this client.")
        return
    end
    for _, veh in pairs (getElementsByType("vehicle", true)) do -- Para cada veículo que o jogador está renderizando, faça:
        shaders[veh] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader usando este .fx, prioridade normal, visível até 70 metros de distância, somente em texturas de veículos.
        if (shaders[veh]) then -- Se o shader foi criado com sucesso, então:
            dxSetShaderValue (shaders[veh], "speed", 0) -- Variável que determina a velocidade do movimento da textura. Valores negativos movimentam ao contrário.
            engineApplyShaderToWorldTexture (shaders[veh], "tanktrack", veh) -- Aplica o shader somente na textura "tanktrack" do veículo específico.
        end
    end
end)

addEventHandler ("onClientElementStreamIn", root, function () -- Executa essa função sempre que um novo elemento começa a ser renderizado pelo jogador. (não executa para elementos nativos do cenário)
    if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então:
        if not (shaders[source]) then -- Se este veículo não tem um shader, então:
            shaders[source] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader da mesma forma que acima, vinculando-o ao source.
            if (shaders[source]) then
                dxSetShaderValue (shaders[source], "speed", 0)
                engineApplyShaderToWorldTexture (shaders[source], "tanktrack", source)
            end
        end
    end
end)

addEventHandler ("onClientElementStreamOut", root, function () -- Executa essa função sempre que um elemento parar de ser renderizado pelo jogador. (não executa para elementos nativos do cenário)
    if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então:
        if (shaders[source]) then -- Se este veículo tem um shader, então:
            destroyElement (shaders[source]) -- Destrói o shader.
            shaders[source] = nil -- Anula a variável do shader para liberar espaço na memória.
        end
    end
end)

addEventHandler ("onClientPreRender", root, function () -- Executa essa função no início de cada frame.
    for veh, shader in pairs (shaders) do -- Para cada shader que está na tabela shaders, faça:
        if (isElement(veh)) then
            local sx, sy, sz = getElementVelocity (veh) -- Obtém a velocidade X, Y, Z do veículo.
            local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula a velocidade em km/h
            local speed = kmhs * 0.55 -- Aqui vc muda esse valor para sincronizar a velocidade da textura com a velocidade do veículo. Texturas de diferentes tamanhos tem valores diferentes.
            if (isVehicleReversing(veh)) then -- Se o veículo está indo pra trás, então:
                speed = kmhs * -0.55 -- Torna a velocidade da esteira negativa para que ela se movimente ao contrário.
            end
            if (shader) then
                dxSetShaderValue (shader, "speed", speed) -- Aplica a velocidade de movimento na esteira.
            end
        end
    end
end)

function isVehicleReversing(theVehicle) -- Função que verifica se o veículo está indo pra trás ou não.
    local getMatrix = getElementMatrix (theVehicle)
    local getVelocity = Vector3 (getElementVelocity(theVehicle))
    local getVectorDirection = (getVelocity.x * getMatrix[2][1]) + (getVelocity.y * getMatrix[2][2]) + (getVelocity.z * getMatrix[2][3])
    if (getVehicleCurrentGear(theVehicle) == 0 and getVectorDirection < 0) then
        return true
    end
    return false
end

 

uv_scroll.fx

Spoiler
// Example shader - uv_scroll.fx

float gTime : TIME;
float speed;

//-------------------------------------------
// Returns UV anim transform
//-------------------------------------------
float3x3 getTextureTransform ()
{
    float posU = 0;    // Scroll Horizontal
    // float posV = 0; // Scroll Vertical
    // float posU = -fmod( gTime/8 ,1 ); // Habilite esta linha para movimento horizontal.
    float posV = -fmod(gTime*speed, 1);  // Habilite esta linha para movimento vertical.

    return float3x3(
                    1, 0, 0,
                    0, 1, 0,
                    posU, posV, 1
                    );
}

technique tec0
{
    pass P0
    {
        // Set the UV thingy
        TextureTransform[0] = getTextureTransform ();

        // Enable UV thingy
        TextureTransformFlags[0] = Count2;
    }
}

 

meta.xml

Spoiler
<meta>
    <info author="Lord Henry" name="Rhino 2.0" description="Rhino com esteira funcional nas rodas." version="1.3" type="misc" />
    <script src="client.lua" type="client" />
    <file src="uv_scroll.fx" />
    <file src="rhino.txd" />
    <file src="rhino.dff" />
</meta>

 

 

rhino.dff rhino.txd

Edited by Lord Henry
Códigos comentados.
  • Thanks 1
Link to comment
41 minutes ago, Lord Henry said:

Como eu mencionei anteriormente, você usa o shader UV Scroll. Mas precisa saber configurar as coisas para que funcione.

Depois de estudar bastante o shader, fiz o resource inteiro e também editei um Rhino para testar. Também vinculei a velocidade do veículo ao movimento da textura.

client.lua

  Reveal hidden contents
local ID = 432
local txd = {[ID] = engineLoadTXD ("rhino.txd")}
local dff = {[ID] = engineLoadDFF ("rhino.dff")}

addEventHandler ("onClientResourceStart", resourceRoot, function () 
    engineImportTXD (txd[ID], ID)
    engineReplaceModel (dff[ID], ID)
end)

-- |---------------------------------------------|
-- |  DAQUI PRA BAIXO É O CONTROLE DAS ESTEIRAS  |
-- |---------------------------------------------|
local shaders = {} -- Cada veículo terá um shader separado, caso contrário um tanque em movimento irá movimentar as texturas dos outros também.

addEventHandler ("onClientResourceStart", resourceRoot,	function() -- Executa essa função ao iniciar este resource.
    -- Version check
    if getVersion().sortable < "1.1.0" then
        outputChatBox ("Resource 'uv_scroll' is not compatible with this client.")
        return
    end
    for _, veh in pairs (getElementsByType("vehicle", true)) do -- Para cada veículo que o jogador está renderizando, faça:
        shaders[veh] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader usando este .fx, prioridade normal, visível até 70 metros de distância, somente em texturas de veículos.
        if (shaders[veh]) then -- Se o shader foi criado com sucesso, então:
            dxSetShaderValue (shaders[veh], "speed", 0) -- Variável que determina a velocidade do movimento da textura. Valores negativos movimentam ao contrário.
            engineApplyShaderToWorldTexture (shaders[veh], "tanktrack", veh) -- Aplica o shader somente na textura "tanktrack" do veículo específico.
        end
    end
end)

addEventHandler ("onClientElementStreamIn", root, function () -- Executa essa função sempre que um novo elemento começa a ser renderizado pelo jogador. (não executa para elementos nativos do cenário)
    if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então:
        if not (shaders[source]) then -- Se este veículo não tem um shader, então:
            shaders[source] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader da mesma forma que acima, vinculando-o ao source.
            if (shaders[source]) then
                dxSetShaderValue (shaders[source], "speed", 0)
                engineApplyShaderToWorldTexture (shaders[source], "tanktrack", source)
            end
        end
    end
end)

addEventHandler ("onClientElementStreamOut", root, function () -- Executa essa função sempre que um elemento parar de ser renderizado pelo jogador. (não executa para elementos nativos do cenário)
    if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então:
        if (shaders[source]) then -- Se este veículo tem um shader, então:
            destroyElement (shaders[source]) -- Destrói o shader.
            shaders[source] = nil -- Anula a variável do shader para liberar espaço na memória.
        end
    end
end)

addEventHandler ("onClientPreRender", root, function () -- Executa essa função no início de cada frame.
    for veh, shader in pairs (shaders) do -- Para cada shader que está na tabela shaders, faça:
        if (isElement(veh)) then
            local sx, sy, sz = getElementVelocity (veh) -- Obtém a velocidade X, Y, Z do veículo.
            local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula a velocidade em km/h
            local speed = kmhs * 0.55 -- Aqui vc muda esse valor para sincronizar a velocidade da textura com a velocidade do veículo. Texturas de diferentes tamanhos tem valores diferentes.
            if (isVehicleReversing(veh)) then -- Se o veículo está indo pra trás, então:
                speed = kmhs * -0.55 -- Torna a velocidade da esteira negativa para que ela se movimente ao contrário.
            end
            if (shader) then
                dxSetShaderValue (shader, "speed", speed) -- Aplica a velocidade de movimento na esteira.
            end
        end
    end
end)

function isVehicleReversing(theVehicle) -- Função que verifica se o veículo está indo pra trás ou não.
    local getMatrix = getElementMatrix (theVehicle)
    local getVelocity = Vector3 (getElementVelocity(theVehicle))
    local getVectorDirection = (getVelocity.x * getMatrix[2][1]) + (getVelocity.y * getMatrix[2][2]) + (getVelocity.z * getMatrix[2][3])
    if (getVehicleCurrentGear(theVehicle) == 0 and getVectorDirection < 0) then
        return true
    end
    return false
end

 

uv_scroll.fx

  Reveal hidden contents
// Example shader - uv_scroll.fx

float gTime : TIME;
float speed;

//-------------------------------------------
// Returns UV anim transform
//-------------------------------------------
float3x3 getTextureTransform ()
{
    float posU = 0;    // Scroll Horizontal
    // float posV = 0; // Scroll Vertical
    // float posU = -fmod( gTime/8 ,1 ); // Habilite esta linha para movimento horizontal.
    float posV = -fmod(gTime*speed, 1);  // Habilite esta linha para movimento vertical.

    return float3x3(
                    1, 0, 0,
                    0, 1, 0,
                    posU, posV, 1
                    );
}

technique tec0
{
    pass P0
    {
        // Set the UV thingy
        TextureTransform[0] = getTextureTransform ();

        // Enable UV thingy
        TextureTransformFlags[0] = Count2;
    }
}

 

meta.xml

  Hide contents
<meta>
    <info author="Lord Henry" name="Rhino 2.0" description="Rhino com esteira funcional nas rodas." version="1.3" type="misc" />
    <script src="client.lua" type="client" />
    <file src="uv_scroll.fx" />
    <file src="rhino.txd" />
    <file src="rhino.dff" />
</meta>

 

eu fiz os testes e nao deu certo. A esteira nao mexeu no rhino. Preciso configura algo?

rhino.dff 219.36 kB · 1 download rhino.txd 57.84 kB · 1 download

 

não deu certo. Ele nao executa. os movimentos

Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...