
Car-surface alignment
By: a guest on
Jun 30th, 2012 | syntax:
Lua | size: 1.11 KB | hits: 28 | expires: Never
--vehicle-surface alignment script by CrystalMV
function getEulerAnglesFromMatrix(x1,y1,z1,x2,y2,z2,x3,y3,z3)
local nz1,nz2,nz3
nz3 = math.sqrt(x2*x2+y2*y2)
nz1 = -x2*z2/nz3
nz2 = -y2*z2/nz3
local vx = nz1*x1+nz2*y1+nz3*z1
local vz = nz1*x3+nz2*y3+nz3*z3
return math.deg(math.asin(z2)),-math.deg(math.atan2(vx,vz)),-math.deg(math.atan2(x2,y2))
end
function getAnglesFromNormalAndAngle(zx,zy,zz,rz)
rz = math.rad(rz)
local yx,yy,yz = -math.sin(rz),math.cos(rz),0
local xx,xy,xz = yy*zz-yz*zy,yz*zx-yx*zz,yz*zy-yy*zx
yx,yy,yz = zy*xz-zz*xy,zz*xx-xz*zx,zx*xy-zy*xx
return getEulerAnglesFromMatrix(xx,xy,xz,yx,yy,yz,zx,zy,zz)
end
function putCarOnSurface()
local car = getPedOccupiedVehicle(localPlayer)
if not car then return end
local x,y,z = getElementPosition(car)
local hit,sx,sy,sz,hitel,nx,ny,nz = processLineOfSight(x,y,z,x,y,z-1000,true,false,false,true)
if not hit then return end
local rx,ry,rz = getElementRotation(car)
rx,ry,rz = getAnglesFromNormalAndAngle(nx,ny,nz,rz)
setElementRotation(car,rx,ry,rz,"ZXY")
end
addEventHandler("onClientPreRender",root,putCarOnSurface)