AvatoR Posted February 23, 2023 Share Posted February 23, 2023 sx, sy = guiGetScreenSize() movedClip = false testAngle = 0 function math.rotVecToEular(x, y, z, rot) -- Описано на вики Мта local rotx = math.deg( math.atan2 ( z, (x^2+y^2)^0.5 ) ) % 360 local rotz = math.deg( math.atan2( x, y ) ) % 360 return rotx, rot, rotz end addEventHandler("onClientRender", root, function () local relX, relY = getCursorPosition() local cursorX, cursorY = relX * sx, relY * sy local camX, camY, camZ = getCameraMatrix() local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20) hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true) if hit then testAngle = (testAngle + 1) % 360 angleVectorX, angleVectorY, angleVectorZ = math.rotVecToEular(normalX, normalY, normalZ, testAngle) angleVectorX = angleVectorX - 90 -- так конус смотрит "наверх" hitX = normalX*0.2 + hitX -- немного поднимаем объект относительно нормали hitY = normalY*0.2 + hitY -- немного поднимаем объект относительно нормали hitZ = normalZ*0.2 + hitZ -- немного поднимаем объект относительно нормали if isElement(movedClip) then destroyElement(movedClip) end movedClip = createObject(1238, hitX, hitY, hitZ, angleVectorX, angleVectorY, angleVectorZ, true) end end) Я немного не понимаю, как перевести нормаль, которая возвращается в processLineOfSight, в аргументы углов для createObject. Происходит то-что объект вращается не по правильным координатам: В итоге нужно получить вращение по нормали поверхности которое приходит от processLineOfSight. Link to comment
AvatoR Posted February 24, 2023 Author Share Posted February 24, 2023 Если кому не понятно чего я хочу добиться то вот что я получаю при createObject и вращении: А нужно получить вот такое вращение: Функция setElementRotation с 5-ым аргументом "ZXY" вообще никак не меняет ситуацию: local angX = 0 local angY = 0 local angZ = 0 local modelToRotate = false sx, sy = guiGetScreenSize() addEventHandler("onClientRender", root, function () if isCursorShowing() then local relX, relY = getCursorPosition() local cursorX, cursorY = relX * sx, relY * sy local camX, camY, camZ = getCameraMatrix() local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20) local hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true) if isElement(modelToRotate) then destroyElement(modelToRotate) end modelToRotate = createObject(1238, hitX, hitY, hitZ, 0, 0, 0, true) setElementRotation(modelToRotate, angX, angY, angZ, "ZXY") end end ) Link to comment
AngelAlpha Posted March 2, 2023 Share Posted March 2, 2023 On 24/02/2023 at 21:06, AvatoR said: local angX = 0 local angY = 0 local angZ = 0 local modelToRotate = false sx, sy = guiGetScreenSize() addEventHandler("onClientRender", root, function () if isCursorShowing() then local relX, relY = getCursorPosition() local cursorX, cursorY = relX * sx, relY * sy local camX, camY, camZ = getCameraMatrix() local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20) local hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true) if isElement(modelToRotate) then destroyElement(modelToRotate) end modelToRotate = createObject(1238, hitX, hitY, hitZ, 0, 0, 0, true) setElementRotation(modelToRotate, angX, angY, angZ, "ZXY") end end ) Ты же тут не меняешь ротацию, она у тебя постоянно 0 Link to comment
AvatoR Posted March 3, 2023 Author Share Posted March 3, 2023 20 hours ago, AngelAlpha said: Ты же тут не меняешь ротацию, она у тебя постоянно 0 Проблема решена здесь 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