Witam napisa?em kod na fizyk? obiekt?w dzia?a on ale chcia?bym jak by to powiedzie? jako? go poprawi? aby obiekty spada? nie w sztuczny spos?b lecz realistyczny wiem o tym ?e mog? do tego wykorzysta? masy obiektu co dodali nam nasi developerzy z mta sa
function FizykaObiekty()
local players = getElementsByType("object")
for k,v in ipairs(players) do
if v == getLocalPlayer() then else
local x1,y1,z1 = getElementPosition (getLocalPlayer())
local x2,y2,z2 = getElementPosition (v)
local visibleto = getDistanceBetweenPoints3D(x1,y1,z1,x2,y2,z2)
local sx,sy,sz = getScreenFromWorldPosition ( x2,y2,z2+1.05 )
local gx = getGroundPosition ( x2,y2,z2 )
local Wysokosc = math.ceil(getGroundPosition ( x1,y1,z1 ))
setElementData(getLocalPlayer(),"Wysokosc",Wysokosc)
setElementData(v,"Wysokosc",gx)
local H = math.ceil(getElementData(v,"Wysokosc"))
local WH = math.ceil(getElementData(getLocalPlayer(),"Wysokosc"))
local P1 = (0.1)
local NX = x2 + 0.1
local NY = y2+ 0.1
local x0, y0, z0, x1, y1, z1 = getElementBoundingBox (v )
if H == WH then
else
setElementPosition ( v,NX,NY,z2 - P1)
end
end
end
end
addEventHandler("onClientRender",getRootElement(),FizykaObiekty)
Jeszcze przyznaje ?e ma bug kiedy obiekt jest ni?ej ni? my to si? zapada pod ziemie je?li by kto? pom?g? b?d? wdzi?czny i postawie piwo.
Dorex, hm no to ja Ci mo?e podpowiem od strony Fizyki jak to powinno dzia?a?.
Puszczasz "cia?o" (czyli obiekt) trzymany powiedzmy na wysoko?ci h. Obiekt ten porusza si? ruchem niejednostajnie przyspieszonym poniewa? gdy pu?cimy obiekt otrzymuje on pr?dko?? V. Przy czym im bli?ej ziemi tym wi?ksza warto?? pr?dko?ci. Przy dotkni?ciu pod?o?a stosujemy si? do 3 prawa Newtona czyli
"Je?eli cia?o A dzia?a na cia?o B si?? F to cia?o B dzia?a na cia?o A si?? -F".
Kr?cej: je?eli kogo? uderzysz zaboli go. Wypada?oby warto?? F obliczy?, potem obliczy? do jakiego miejsca nasze cia?o pofrunie i mniej wi?cej tak to sklepa?. Tyle z teorii. My?l?, ?e powinno Ci to w jaki? spos?b pom?c (nie licz na gotowca z mojej strony ). Nie korzystaj z interpolateBetween poniewa? tam jest niby ta interpolacja "InOutBounce" lecz sprawia to, ?e dany obiekt "podskakuje" jakby by? stworzony z gumy.
Oczywi?cie pr?dko?? z jak? dane cia?o b?dzie si? porusza?o zale?y od jego masy. Przychodzi nam z pomoc? wz?r na si?? czyli
gdzie:
m - masa cia?a
a - przyspieszenie
F - si?a
Polecam zapozna? si? z podr?cznikami do Fizyki dla szk?? ?rednich. Tam jest multum przyk?ad?w i wzor?w. My?l?, ?e w gimnazjum te? by? ten ruch omawiany lecz w liceum wi?cej bazuje si? na punktach odniesienia oraz uk?adzie kartezja?skim (x,y,z).
//EDIT
Nie patrzy?em w kod ale aby uzyska? po?o?enie "ziemi" w danym punkcie u?yj getGroundPosition().
function FizykaObiekty()
local players = getElementsByType("object")
for k,v in ipairs(players) do
if v == getLocalPlayer() then else
local x1,y1,z1 = getElementPosition (getLocalPlayer())
local x2,y2,z2 = getElementPosition (v)
local visible = getDistanceBetweenPoints3D(x1,y1,z1,x2,y2,z2)
local sx,sy,sz = getScreenFromWorldPosition ( x2,y2,z2+1.05 )
local gx = getGroundPosition ( x2,y2,z2 )
local Wysokosc = Zaokraglaj(getGroundPosition ( x1,y1,z1 ))
local WysokoscObiektu = Zaokraglaj(getGroundPosition ( x2,y2,z2 ))
local P1 = (0.1)
local NX = x2 + 0.1
local NY = y2+ 0.1
local speedx, speedy, speedz = getElementVelocity (v)
local aktualnapredkosc = (speedx^2 + speedy^2 + speedz^2)^(0.5) * 2
local m = getObjectMass(v)
local a = aktualnapredkosc
local F = m*a
local Predkosc = F/m
local droga = z2 - gx
local Czas = droga/Predkosc
setElementData(getLocalPlayer(),"Wysokosc",Wysokosc)
setElementData(v,"Wysokosc",WysokoscObiektu)
local H = math.ceil(getElementData(v,"Wysokosc"))
local WH = math.ceil(getElementData(getLocalPlayer(),"Wysokosc"))
if H == WH then
setElementVelocity (v ,0,0,0)
else
setElementVelocity (v , speedx*Predkosc, speedy*Predkosc, speedz-0.00001/500*Predkosc)
outputDebugString ("Sila:"..F.." Predkosc:"..Predkosc.." WyskoscObiektu:"..WysokoscObiektu.." Wyskosc Gracza:"..Wysokosc.." Droga:"..droga.." Czas:"..Czas,3,255,255,0)
end
end
end
end
addEventHandler("onClientRender",getRootElement(),FizykaObiekty)
[ Dodano: 2013-07-07, 01:44 ]
Dodaje zdj?cie jako Pokazanie problem na dole w debugscript pokazuje wszystkie dane odnosnie obiektu
Z tego co pami?tam wi?kszo?? obiekt?w w GTA ma r??nie ustawiany ?rodek ci??ko?ci, a akurat getElementPosition pobiera ten ?rodek. Logiczne jest to, ?e ?rodek ci??ko?ci ka?dego "cia?a" znajduje si? na jego ?rodku. Cz?owiek ma go mniej wi?cej na wysoko?ci bioder. Pokombinuj z warto?ciami wysoko?ci - co? dodaj, co? odejmij i wyjdzie. Nic innego nie poradzisz.
Mam pewien pomys? my?l? ?e mo?e si? uda? pami?tam ?e map editor stosowa? vectory aby obiekty nie spada?y i mo?na by?o je ustawia? na innych obiektach my?l? jak takiego czego? dokona?
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach