Jump to content

прицепить камеру


Recommended Posts

Не получается прицепить камеру к объекту. С помощью функции игрок меняет положение камеры, после этого надо то камеру зафиксировать к авто. Проблема в том, что положение камеры сбивается при разных моих методах расчета ): .

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
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

Значит смотри:

        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

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

Представь, что камера находится на крыле авто / фаре ( ставит сам игрок ). Она должна вести себя как, например, стандартная камера с бампера. Все просто звучит: получение разницы позиций, получение угла, расчеты, установка камеры. Расчеты, блин, тут не правильные. Если все по центру было, то все значения находились бы элементарно. С десяток способов уже перепробовал, тут надо полный математический подход.

Link to comment

TheNormalnij,

я не правильно понял вопрос, и поэтому дал код, который закрепляет камеру над объектом (т.е. обзор вокруг объекта, как при виде от 3-го лица).

P.S. Я в коде забыл привязать функции к событиями

EDIT

Вам правильно сказали, рассчитывайте с помощью getPositionFromElementOffset, в offX,offY,offZ указывается смещение относительно автомобиля.

Link to comment

спасибо, попытаюсь, если получится, отпишусь.

P.S. Я в коде забыл привязать функции к событиями

Я понял и назначил их сам, но onCleintCursorMove работает правильно на gui элементах. И в общем то не приводило к результату.

PS может кто знает ссылку, где можно почитать о матрице?

Link to comment
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

всем спасибо

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...