Jump to content

Problème Rotation


Recommended Posts

Salut, j'ai fait un script pour coller une image sur un bus ( en utilisant dxDrawMaterialLine3D ) mais quand je bouge le bus l'image reste droite, j'ai aussi essayer avec les arguments faceTowardZ, Y, X mais toujours aucun resultat. Voici le script:

  
local img = dxCreateTexture("file.png") 
addEventHandler("onClientPreRender", root, function() 
    x, y, z = getElementPosition(getPedOccupiedVehicle(getLocalPlayer())) 
    a, b, c = (-1.3400488281),  
(4.400024414), 
 (-0.59999961853) 
        dxDrawMaterialLine3D (x-a, y-b, z-c, x-a, (y-b)+3, z-c, img, 0.75, tocolor(255,255,255,255), tocolor(255,255,255,255), 0, 0, 0) 
end) 

Et le problème en image : http://img15.hostingpics.net/pics/21084 ... 132906.png

Link to comment
  • Moderators

Bonsoir ma2med,

J'ai mis un peu de temps parce que je ne suis pas très à l'aise avec les matrices. Ce genre de problème j'ai l'habitude de les régler via de la trigonométrie mais les matrices sont bien plus rapides à utiliser dès qu'on les a compris.

Voici le code:

addEventHandler("onClientPreRender", root, function() 
    for k, veh in ipairs (getElementsByType("vehicle")) do 
        local vehmodel = getElementModel(veh) 
        if vehmodel == 431 then -- BUS 
            local offsetX, offsetY, offsetZ = 1.3073, -4.400024414, 0.59999961853 -- position relative du début de la ligne par rapport au veh 
             
            local x, y, z = getPositionFromElementOffset(veh, offsetX, offsetY, offsetZ) -- position absolue du début de la ligne par rapport au veh 
            local x2, y2, z2 = getPositionFromElementOffset(veh, offsetX, offsetY+2, offsetZ) -- position absolue de la fin de la ligne par rapport au veh 
            local faceX, faceY, faceZ = getPositionFromElementOffset(veh, offsetX+5, offsetY, offsetZ) -- position absolue vers laquelle l'image doit être orienté 
             
            dxDrawMaterialLine3D(x, y, z, x2, y2, z2, img, 0.75, tocolor(255,255,255,255), faceX, faceY, faceZ) 
        end 
    end 
end) 
  
  
-- Taken from [url=https://wiki.multitheftauto.com/wiki/GetElementMatrix]https://wiki.multitheftauto.com/wiki/GetElementMatrix[/url] example 
function getPositionFromElementOffset(element, offX, offY, offZ) 
    local m = getElementMatrix ( element )  -- Get the matrix 
    local x = offX * m[1][1] + offY * m[2][1] + offZ * m[3][1] + m[4][1]  -- Apply transform 
    local y = offX * m[1][2] + offY * m[2][2] + offZ * m[3][2] + m[4][2] 
    local z = offX * m[1][3] + offY * m[2][3] + offZ * m[3][3] + m[4][3] 
    return x, y, z  -- Return the transformed point 
end 

Explications:

La fonction getPositionFromElementOffset (que j'ai copiée collée) permet de calculer une position x, y, z dans la map de GTA à partir d'un offset x, y, z d'un élément donné. Elle va utiliser la matrice de l’élément qui contient en gros la position x, y, z et la rotation rx, ry, rz de l'élément dans la map de GTA.

J'ai donc dû calculer 3 positions absolues (absolue = position dans la map de GTA et relative = position par rapport au centre de l'élément):

- la 1ère est la position absolue x, y, z du début de la ligne

- la 2ème est la position absolue x, y, z de la fin de la ligne

- la 3ème est la position absolue x, y, z vers laquelle l'image doit être orientée (l'image est placée sur la droite du bus donc il faut orienter la face de l'image en direction d'une position x, y, z qui doit être encore plus à droite du bus (d'où le offsetX + 5).

J'ai également ajusté l'offsetX de ton code initial car on pouvait voir un espace entre l'image et le bus. Je l'ai donc passé de 1.3400488281 à 1.3073.

Et en bonus, j'ai changé le code pour que l'image s'affiche sur tous les bus, même si on est pas en train de le conduire (j'ai donc viré le getPedOccupiedVehicle pour faire une boucle for sur tous les véhicules et j'exécute le code sur tous les 431 (= bus)).

Résultat:

J'ai placé le bus de façon à ne pas être à 0° et je l'ai également penché de travers pour prouver que ça suit bien la rotation du bus (ce que ne pouvait pas faire ton code initial même orienté à 0°).

5ef48fdc2dfce78ab902d107ed28115a.png

Link to comment

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
  • Recently Browsing   0 members

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