Jump to content

Камера


Recommended Posts

Posted

В общем я написал код с помощью которого будет даваться вид от первого лица когда игрок сядет в машину спецназа

function vehicleEnterCam (theVehicle) 
    local vehCamX,vehCamY,vehCamZ = getPedBonePosition (getLocalPlayer(), 8) 
    local rot = getPedRotation (getLocalPlayer()) 
    radRot = math.rad ( rot ) 
    local radius = .1 
    local vehCamX1 = vehCamX + radius * math.sin(radRot) 
    local vehCamY2 = vehCamY + -(radius) * math.cos(radRot) 
    local vehCamZ3 = vehCamZ 
    local vModel = getElementModel(theVehicle) 
    if (vModel == 427) then 
        setCameraMatrix(vehCamX1,vehCamY2,vehCamZ3,vehCamX,vehCamY,vehCamZ)  
    end  
end 
addEventHandler("onClientPlayerVehicleEnter", getLocalPlayer(), vehicleEnterCam) 

Как сделать,чтобы камера двигалась в таком же положении вместе с игроком когда он едет в машине, а не оставалась на месте

Posted

Можно подробнее пожалуйста? Или лучше на этом коде покажи

Posted

Все тело vehicleEnterCam() должно выполняться каждый кадр, чтобы камера всегда перемещалась вслед за машиной.

Вот тут как раз подходящий пример описан. Вместо updateCamera() подставляешь свою функцию и в теории должно заработать.

Posted

Может кто на этом коде показать как должно быть,а то никак не получается

Posted
addEventHandler( "onClientPlayerVehicleEnter", getLocalPlayer(), 
    function() 
        addEventHandler( "onClientPreRender", root, vehicleEnterCam ) 
    end 
) 
  
addEventHandler( "onClientPlayerVehicleExit", getLocalPlayer(), 
    function() 
        removeEventHandler( "onClientPreRender", root, vehicleEnterCam ) 
        setCameraTarget( getLocalPlayer() ) 
    end 
) 

Posted

Не знаю что такое,добавил твой код и всё равно камера стоит на месте

Posted

потому что в функции vehicleEnterCam машину надо брать с помощью getPedOccupiedVehicle, а не через аргумент

Posted

Я тоже не вижу разницы,но на WIKI в описании функции написано,что лучше "onClientPreRender" использовать для машин,да и к тому же я её уже пробовал

Posted
local rot = getPedRotation (getLocalPlayer()) 

 

надо примерно так

local rot 
  
if isPedInVehicle( getLocalPlayer() ) then 
    _,_,rot = getElementRotation( getPedOccupiedVehicle( getLocalPlayer() ) ) 
else 
    _,_,rot = getElementRotation( getLocalPlayer() ) 
end 

хотя твой код весьма отдален от точного рассчета позиции и направления камеры

Posted

А в общем вместе с моим кодом как должно получиться? Напиши пожалуйста (уже вас достал наверно :oops: )

Posted
function vehicleEnterCam (theVehicle) 
    local vehCamX,vehCamY,vehCamZ = getPedBonePosition ( getLocalPlayer(), 8 ) 
  
    --local rot = getPedRotation (getLocalPlayer()) 
    local rot 
      
    if isPedInVehicle( getLocalPlayer() ) then 
        _,_,rot = getElementRotation( getPedOccupiedVehicle( getLocalPlayer() ) ) 
    else 
        _,_,rot = getElementRotation( getLocalPlayer() ) 
    end 
  
    local radRot = math.rad ( rot ) 
    local radius = .1 
    local vehCamX1 = vehCamX + radius * math.sin(radRot) 
    local vehCamY2 = vehCamY + -(radius) * math.cos(radRot) 
    local vehCamZ3 = vehCamZ 
    local vModel = getElementModel(theVehicle) 
    if (vModel == 427) then 
        setCameraMatrix(vehCamX1,vehCamY2,vehCamZ3,vehCamX,vehCamY,vehCamZ)  
    end  
end 
  
  
  
  
--addEventHandler("onClientPlayerVehicleEnter", getLocalPlayer(), vehicleEnterCam) 
  
addEventHandler( "onClientPlayerVehicleEnter", getLocalPlayer(), 
    function() 
        addEventHandler( "onClientPreRender", root, vehicleEnterCam ) 
    end 
) 
  
addEventHandler( "onClientPlayerVehicleExit", getLocalPlayer(), 
    function() 
        removeEventHandler( "onClientPreRender", root, vehicleEnterCam ) 
        setCameraTarget( getLocalPlayer() ) 
    end 
) 

Posted

Теперь когда я сажусь в машину вообще ничего не происходит :| Ну ладно,хотя бы и на этом спасибо

Posted

Да я ж говорю, нету переменной theVehicle в функции vehicleEnterCam!

function vehicleEnterCam () 
    local vehCamX,vehCamY,vehCamZ = getPedBonePosition (getLocalPlayer(), 8) 
    local rot = getPedRotation (getLocalPlayer()) 
    radRot = math.rad ( rot ) 
    local radius = .1 
    local vehCamX1 = vehCamX + radius * math.sin(radRot) 
    local vehCamY2 = vehCamY + -(radius) * math.cos(radRot) 
    local vehCamZ3 = vehCamZ 
    setCameraMatrix(vehCamX1,vehCamY2,vehCamZ3,vehCamX,vehCamY,vehCamZ)  
end 
  
addEventHandler( "onClientPlayerVehicleEnter", getLocalPlayer(), 
    function ( vehicle ) 
        if ( getElementModel ( vehicle ) == 427) then 
            addEventHandler( "onClientPreRender", getRootElement(), vehicleEnterCam ) 
        end 
    end 
) 
  
addEventHandler( "onClientPlayerVehicleExit", getLocalPlayer(), 
    function() 
        removeEventHandler( "onClientPreRender", getRootElement(), vehicleEnterCam ) 
        setCameraTarget( getLocalPlayer() ) 
    end 
) 
  

В добавок надо бы еще посчитать поворот по оси Z через тангенс

Posted

Я не занимаюсь тестированием чужого кода, я просто даю отдельные изменения. Но я вижу, что автору темы это не поможет, т.к. думать над исправлением своего простого кода он и не собирался.

Хотя бы спросил для чего та или иная строчка в коде. Копипастеры, одним словом..

Posted

Вот более менее правильный вид от первого лица для тачек. Проверено.

local me = getLocalPlayer() 
local view1stPersonEnabled = false 
  
  
  
  
local function getPositionFromElementAtOffset ( element, x,y,z ) 
    if not x or not y or not z then  return false  end 
  
    local matrix = getElementMatrix(element) 
  
    local offX = x * matrix[1][1] + y * matrix[2][1] + z * matrix[3][1] + matrix[4][1] 
    local offY = x * matrix[1][2] + y * matrix[2][2] + z * matrix[3][2] + matrix[4][2] 
    local offZ = x * matrix[1][3] + y * matrix[2][3] + z * matrix[3][3] + matrix[4][3] 
  
    return offX, offY, offZ 
end 
  
function set1stPersonCameraView() 
    local _,_,myHeadZpos =      getPedBonePosition( me, 8 ) 
    local _,_,myCenterZpos =    getElementPosition(me) 
  
    local zOffset = myHeadZpos - myCenterZpos 
    local pos =     { getPositionFromElementAtOffset( me, 0, 0.1, zOffset ) } 
    local target =  { getPositionFromElementAtOffset( me, 0, 1, zOffset ) } 
  
    local _,myYRotation = getElementRotation(me) 
  
    setCameraMatrix( pos[1], pos[2], pos[3], target[1], target[2], target[3], myYRotation ) 
end 
  
  
  
  
addEventHandler( "onClientPlayerVehicleEnter", me, 
    function ( vehicle ) 
        if getVehicleType" class="kw2">getVehicleType" class="kw2">getVehicleType" class="kw2">getVehicleType" class="kw2">getVehicleType" class="kw2">getVehicleType(vehicle) == 'Automobile' and not view1stPersonEnabled then 
            addEventHandler( "onClientPreRender", root, set1stPersonCameraView ) 
            view1stPersonEnabled = true 
        end 
    end 
) 
  
addEventHandler( "onClientPlayerVehicleExit", me, 
    function() 
        if view1stPersonEnabled then 
            removeEventHandler( "onClientPreRender", root, set1stPersonCameraView ) 
            setCameraTarget(me) 
            view1stPersonEnabled = false 
        end 
    end 
) 
  
  
  

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