TheNormalnij Posted April 12, 2013 Share Posted April 12, 2013 Не получается прицепить камеру к объекту. С помощью функции игрок меняет положение камеры, после этого надо то камеру зафиксировать к авто. Проблема в том, что положение камеры сбивается при разных моих методах расчета ): . function a_start() car = getPedOccupiedVehicle( localPlayer ) -- к этой машине надо прицепить if car then -- проверяем существование машины local x, y, z = getElementPosition( car ) -- получаем позицию авто x2, y2, z2, tx, ty, tz, roll, fov = getCameraMatrix() -- получаем первоначальные настройки камеры px, py, pz = x - x2, y - y2, z - z2 -- вычисляем отклонения distancexy = math.sqrt ( px^2 + py^2 ) -- вычисляем расстояние до элемента по одной оси null, null, rotalionxy = getElementRotation( car ) -- ( пока только по одной оси ) получаем угол поворота авто addEventHandler( "onClientPreRender", root, attachCam ) -- запускаем обработчик end end function attachCam() if car then -- проверяем существование авто local x, y, z = getElementPosition( car ) -- получаем координаты local rx, ry, rz = getElementRotation( car ) -- получаем углы наклона local px = math.cos( math.rad( rz - rotalionxy )) * distancexy -- вычисляем отклонения ERROR? local py= math.sin( math.rad( rz - rotalionxy ) ) * distancexy -- и тут setCameraMatrix( x + px, y + py, z - pz -- устанавливаем позиции ERROR? ,math.cos( math.rad( rz + 90 ) ) + x - px, math.sin( math.rad( rz + 90 ) ) + y - py, -- и точку просмотра ERROR? math.sin( math.rad( rx ) ) + z - pz, ry, 0 ) end end Link to comment
Kernell Posted April 12, 2013 Share Posted April 12, 2013 local fMouseX, fMouseY = 0.0, 0.0; local fCamDistance = 4.0; local pTargetElement = NULL; function OnPreRender() if not pTargetElement then return; end local fPX, fPY, fPZ = getElementPosition( pTargetElement ); local fX = fPX + fCamDistance * math.sin( fMouseX ); local fY = fPY + fCamDistance * math.cos( fMouseX ); local fZ = fPZ + fCamDistance * math.sin( fMouseY ); setCameraMatrix( fX, fY, fZ, fPX, fPY, fPZ ); end function OnClientCursorMove( _, _, _, fAbsoluteX, fAbsoluteY ) if isCursorShowing() or isMTAWindowActive() then return; end fAbsoluteX = fAbsoluteX - fScreenX / 2; fAbsoluteY = fAbsoluteY - fScreenY / 2; fMouseX = fMouseX + fAbsoluteX * 0.15 * 0.01745; fMouseY = fMouseY + fAbsoluteY * 0.15 * 0.01745; if fMouseX > math.pi then fMouseX = fMouseX - 2 * math.pi; elseif fMouseX < -math.pi then fMouseX = fMouseX + 2 * math.pi; end if fMouseY > math.pi then fMouseY = fMouseY - 2 * math.pi; elseif fMouseY < -math.pi then fMouseY = fMouseY + 2 * math.pi; end if fMouseY < -math.pi / 2.05 then fMouseY = -math.pi / 2.05; elseif fMouseY > math.pi / 2.05 then fMouseY = math.pi / 2.05; end end Link to comment
Flaker Posted April 12, 2013 Share Posted April 12, 2013 Значит смотри: local px = math.cos( math.rad( rz - rotalionxy )) * distancexy -- вычисляем отклонения ERROR? local py= math.sin( math.rad( rz - rotalionxy ) ) * distancexy Не правильно ищешь... Почему ты вобще решил вставить rotalionxy, тут нужно вставлять погрешность в 90 градусов, которая появляется из за того что GTA/MTA's ротация не начинается реально с нуля Твои вычисления с setCameraMatrix, заставляют очень сильно задуматься о смысле сотворения этого мира... Короче будь проще: Алгоритм такой же как ты и пытался реализовать: Камеру позади машины ставишь, а смотришь на саму машину... Я бы на твоем месте не мучился с градусами, а считал по матрице конкретно, так намного удобнее, имхо. Если хочешь градусами, то вот тебе пища для размышления: x = x + ( math.cos ( math.rad ( rotz-90 ) ) * DIST) y = y + ( math.sin ( math.rad ( rotz-90 ) ) * DIST) -- Это мы находим точку позаду чего-то на расстоянии DIST Нашел точку, воткнул камеру в эту точку, и пусть камера смотрит на саму машину... По поводу расчета по матрице: 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 Link to comment
TheNormalnij Posted April 12, 2013 Author Share Posted April 12, 2013 Kernell, код OnClientCursorMove не приводит к результату и нету зависимости от поворота авто. ( синтаксис крут, кое что подлвачу ) Flaker, да, я знаю об погрешностях и они компенсируют друг друга в коде rz - rotalionxy Игроку нужно смотреть не на авто, а в туже сторону относительно авто, что и было. math.cos( math.rad( rz - rotalionxy )) * distancexy тут бред. Бо рассчитывается все относительно не первой позиции авто. x - ( px * math.cos( math.rad( rz - rotalionxy )) ), y - ( py * math.sin( math.rad( rz - rotalionxy )) ) Но и так тоже не раотает Link to comment
Flaker Posted April 12, 2013 Share Posted April 12, 2013 Так, я не понял, что тебе конкретно надо? Что-бы камера фиксирована была (всегда позади авто) ? Link to comment
TheNormalnij Posted April 13, 2013 Author Share Posted April 13, 2013 Представь, что камера находится на крыле авто / фаре ( ставит сам игрок ). Она должна вести себя как, например, стандартная камера с бампера. Все просто звучит: получение разницы позиций, получение угла, расчеты, установка камеры. Расчеты, блин, тут не правильные. Если все по центру было, то все значения находились бы элементарно. С десяток способов уже перепробовал, тут надо полный математический подход. Link to comment
Kernell Posted April 13, 2013 Share Posted April 13, 2013 TheNormalnij, я не правильно понял вопрос, и поэтому дал код, который закрепляет камеру над объектом (т.е. обзор вокруг объекта, как при виде от 3-го лица). P.S. Я в коде забыл привязать функции к событиями EDIT Вам правильно сказали, рассчитывайте с помощью getPositionFromElementOffset, в offX,offY,offZ указывается смещение относительно автомобиля. Link to comment
TheNormalnij Posted April 13, 2013 Author Share Posted April 13, 2013 спасибо, попытаюсь, если получится, отпишусь. P.S. Я в коде забыл привязать функции к событиями Я понял и назначил их сам, но onCleintCursorMove работает правильно на gui элементах. И в общем то не приводило к результату. PS может кто знает ссылку, где можно почитать о матрице? Link to comment
Flaker Posted April 13, 2013 Share Posted April 13, 2013 PS может кто знает ссылку, где можно почитать о матрице? Да впринцепе для реализвации твоей идеии и читать не надо ничего... Но если очень надо, могу несколько интересных статей подкинуть: Различные манипуляции с матрицами: http://www.euclideanspace.com/maths/algebra/matrix/resources/code/index.htm#rotz ЧАВО по матрицам и квартернионам: http://web.archive.org/liveweb/http://web.archive.org/web/20041029003853/http://www.j3d.org/matrix_faq/matrfaq_latest.html http://www.gamedev.ru/code/articles/faq_matrix_quat?page=5#chto_takoe_kvaternioni_ Link to comment
Kernell Posted April 13, 2013 Share Posted April 13, 2013 http://habrahabr.ru/post/131931/ Link to comment
TheNormalnij Posted April 13, 2013 Author Share Posted April 13, 2013 всем спасибо function a_start() car = getPedOccupiedVehicle( localPlayer ) if car then local x, y, z = getElementPosition( car ) x2, y2, z2, tx, ty, tz, roll, fov = getCameraMatrix() offX, offY, offZ = -x + x2, -y + y2, -z + z2 tx, ty, tz = -x + tx, -y + ty, -z + tz addEventHandler( "onClientPreRender", root, attachCam ) end end function attachCam() if not car then return; end local m = getElementMatrix ( car ) -- 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] local x3 = tx * m[1][1] + ty * m[2][1] + tz * m[3][1] + m[4][1] -- Apply transform local y3 = tx * m[1][2] + ty * m[2][2] + tz * m[3][2] + m[4][2] local z3 = tx * m[1][3] + ty * m[2][3] + tz * m[3][3] + m[4][3] setCameraMatrix( x, y, z ,x3, y3, z3, 0, 0 ) end function fixCar() -- ленивое решение проблемы неправильных мест подключения камеры car = getPedOccupiedVehicle( localPlayer ) if car then setElementRotation( car, 0, 0, 0 ) end end Link to comment
Kernell Posted April 13, 2013 Share Posted April 13, 2013 -- ленивое решение проблемы неправильных мест подключения камеры http://lurkmore.to/Костыль P.S. Админы форума МТА - когда уже исправите косяк с кириллицей в ссылках? 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