ma2med Posted November 8, 2015 Share Posted November 8, 2015 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 Citizen Posted November 8, 2015 Moderators Share Posted November 8, 2015 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°). Link to comment
ma2med Posted November 8, 2015 Author Share Posted November 8, 2015 Parfait, merci infiniment Citizen. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now