stop Posted April 18, 2011 Share Posted April 18, 2011 В общем я написал код с помощью которого будет даваться вид от первого лица когда игрок сядет в машину спецназа 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) Как сделать,чтобы камера двигалась в таком же положении вместе с игроком когда он едет в машине, а не оставалась на месте Link to comment
lil Toady Posted April 18, 2011 Share Posted April 18, 2011 Пересчитывать позицию в onClientRender Link to comment
stop Posted April 18, 2011 Author Share Posted April 18, 2011 Можно подробнее пожалуйста? Или лучше на этом коде покажи Link to comment
Antibird Posted April 18, 2011 Share Posted April 18, 2011 Все тело vehicleEnterCam() должно выполняться каждый кадр, чтобы камера всегда перемещалась вслед за машиной. Вот тут как раз подходящий пример описан. Вместо updateCamera() подставляешь свою функцию и в теории должно заработать. Link to comment
stop Posted April 19, 2011 Author Share Posted April 19, 2011 Может кто на этом коде показать как должно быть,а то никак не получается Link to comment
MX_Master Posted April 19, 2011 Share Posted April 19, 2011 addEventHandler( "onClientPlayerVehicleEnter", getLocalPlayer(), function() addEventHandler( "onClientPreRender", root, vehicleEnterCam ) end ) addEventHandler( "onClientPlayerVehicleExit", getLocalPlayer(), function() removeEventHandler( "onClientPreRender", root, vehicleEnterCam ) setCameraTarget( getLocalPlayer() ) end ) Link to comment
stop Posted April 19, 2011 Author Share Posted April 19, 2011 Не знаю что такое,добавил твой код и всё равно камера стоит на месте Link to comment
Kenix Posted April 19, 2011 Share Posted April 19, 2011 папробуй onClientRender хотя я не вижу разницы от onClientPreRender Link to comment
lil Toady Posted April 19, 2011 Share Posted April 19, 2011 потому что в функции vehicleEnterCam машину надо брать с помощью getPedOccupiedVehicle, а не через аргумент Link to comment
stop Posted April 19, 2011 Author Share Posted April 19, 2011 Я тоже не вижу разницы,но на WIKI в описании функции написано,что лучше "onClientPreRender" использовать для машин,да и к тому же я её уже пробовал Link to comment
stop Posted April 19, 2011 Author Share Posted April 19, 2011 Напиши пожалуйста код,а то я так не догоняю Link to comment
MX_Master Posted April 20, 2011 Share Posted April 20, 2011 local rot = getPedRotation (getLocalPlayer()) надо примерно так local rot if isPedInVehicle( getLocalPlayer() ) then _,_,rot = getElementRotation( getPedOccupiedVehicle( getLocalPlayer() ) ) else _,_,rot = getElementRotation( getLocalPlayer() ) end хотя твой код весьма отдален от точного рассчета позиции и направления камеры Link to comment
stop Posted April 20, 2011 Author Share Posted April 20, 2011 А в общем вместе с моим кодом как должно получиться? Напиши пожалуйста (уже вас достал наверно ) Link to comment
MX_Master Posted April 20, 2011 Share Posted April 20, 2011 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 ) Link to comment
stop Posted April 20, 2011 Author Share Posted April 20, 2011 Теперь когда я сажусь в машину вообще ничего не происходит Ну ладно,хотя бы и на этом спасибо Link to comment
lil Toady Posted April 20, 2011 Share Posted April 20, 2011 Да я ж говорю, нету переменной 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 через тангенс Link to comment
MX_Master Posted April 20, 2011 Share Posted April 20, 2011 Я не занимаюсь тестированием чужого кода, я просто даю отдельные изменения. Но я вижу, что автору темы это не поможет, т.к. думать над исправлением своего простого кода он и не собирался. Хотя бы спросил для чего та или иная строчка в коде. Копипастеры, одним словом.. Link to comment
MX_Master Posted April 20, 2011 Share Posted April 20, 2011 Вот более менее правильный вид от первого лица для тачек. Проверено. 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 ) 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