sir135 Posted March 3, 2013 Share Posted March 3, 2013 Испробовал различные настройки этой функции, но я так понял что она не детектирует такие объекты, если кто это уже делал, пожалуйста ответьте. Link to comment
Flaker Posted March 3, 2013 Share Posted March 3, 2013 https://wiki.multitheftauto.com/wiki/GetPedTargetCollision - На заметку) Если делаешь что то типо лазера и тд... https://wiki.multitheftauto.com/wiki/ProcessLineOfSight смотри аргументы. Там можно настроить на что она будет реагировать. А что ты конкретно сделать пытаешься? Link to comment
sir135 Posted March 3, 2013 Author Share Posted March 3, 2013 Вспомни мапедитор, как они там курсором безколизийные ловят, я думал этой функцией, пробовал всякие варианты, не получилось, однако обычные объекты детектирует нормально. P.S. В мапедиторе кнопка "E" включает этот режим, и курсор сменивается на красный цвет. Link to comment
Flaker Posted March 3, 2013 Share Posted March 3, 2013 Мде... Интересную задачку ты задал) Я про эту функцию эдитора вобще не знал, так как не пользовался им особо... Просмотрел код эдитора, там вобще закопаешься... Ну вобщем при беглом осмотре кода, ничего больше чем: local surfaceFound, surfaceX, surfaceY, surfaceZ, element = processLineOfSight(camX, camY, camZ, worldX, worldY, worldZ, true, true, true, true, true, true, false, true, selectedElement) local waterFound, waterX, waterY, waterZ = testLineAgainstWater(camX, camY, camZ, worldX, worldY, worldZ) В функции processCursorMove таким образом отлавливаются объекты, вроде бы... Дальше есть такой код: if (not collisionless) then centerToBaseDistance = exports.edf:edfGetElementDistanceToBase(selectedElement) local finalX, finalY, finalZ = getCoordsWithBoundingBox(waterX, waterY, waterZ) setElementPosition(selectedElement, finalX, finalY, finalZ) else setElementPosition(selectedElement, waterX, waterY, waterZ) end Я попробовал прошерстить функции edfGetElementDistanceToBase и getCoordsWithBoundingBox... Но там ничего не нашел... (Осматривал бегло) Дальше лезть не стал, если есть желание, сам глянь... P.S. Ты точно уверен что processLineOfSight не может отследить такие объекты? Для чего тебе вобще это понадбилось? Link to comment
lil Toady Posted March 3, 2013 Share Posted March 3, 2013 Для элементов без коллизий, как например маркер, в мап эдиторе где-то должна быть специальная функция (точно подсказать где не смогу), processLineOfSight их не ловит. Link to comment
Flaker Posted March 3, 2013 Share Posted March 3, 2013 Для элементов без коллизий, как например маркер, в мап эдиторе где-то должна быть специальная функция (точно подсказать где не смогу), processLineOfSight их не ловит. Нашел, я эту функцию: function processLineForElements(startX, startY, startZ, endX, endY, endZ) local foundElement = false local hitX, hitY, hitZ = nil, nil, nil --limit foundElementDistance to distance to endpoint because the collision check goes past the endpoint for some reason local foundElementDistance = math.sqrt((endX-startX)^2 + (endY-startY)^2 + (endZ-startZ)^2) for v in pairs(g_colless) do while true do --forget elements that have been destroyed if not isElement(v) then g_colless[v] = nil break end --ignore if it's in a different dimension if getElementDimension(v) ~= getWorkingDimension() then break end --ignore if its not a valid type local strType = getElementType(v) if not isColless[strType] and strType ~= "object" then g_colless[v] = nil break end --ignore if it's in a different interior if not noInteriors[strType] and getElementInterior(v) ~= g_workingInterior then break end --ignore selection arrow marker if v == g_arrowMarker then break end local centerX, centerY, centerZ = getElementPosition(v) local distance = math.sqrt((centerX-startX)^2 + (centerY-startY)^2 + (centerZ-startZ)^2) if (distance <= foundElementDistance) then local intersection = specialIntersections[getElementType(v)] or commonIntersection local _hitX, _hitY, _hitZ = intersection(startX, startY, startZ, endX, endY, endZ, centerX, centerY, centerZ, v) if _hitX then foundElement = v foundElementDistance = distance hitX = _hitX hitY = _hitY hitZ = _hitZ end end break end end return foundElement, hitX, hitY, hitZ end Логика примерно такая: 1) в эвенте onClientElementStreamIn: если тип source не подходит не под один из стандартных, то source добавляется в g_colless. В эвенте onClientElementStreamOut, соответственно, вытаскивается из таблицы. 2) В функции processLineForElements проход по таблице g_colless с последующией проверкой на наличие объекта. 3) Наличие объекта на заданом пути проверяется функцией: collisionTest.Sphere = function(lineStart, lineEnd, sphereCenter, sphereRadius) -- check if line intersects sphere around element local vec = Vector3D:new(lineEnd.x - lineStart.x, lineEnd.y - lineStart.y, lineEnd.z - lineStart.z) local A = vec.x^2 + vec.y^2 + vec.z^2 local B = ( (lineStart.x - sphereCenter.x) * vec.x + (lineStart.y - sphereCenter.y) * vec.y + (lineStart.z - sphereCenter.z) * vec.z ) * 2 local C = ( (lineStart.x - sphereCenter.x)^2 + (lineStart.y - sphereCenter.y)^2 + (lineStart.z - sphereCenter.z)^2 ) - sphereRadius^2 local delta = B^2 - 4*A*C if (delta >= 0) then delta = math.sqrt(delta) local t = (-B - delta) / (2*A) if (t > 0) then return Vector3D:new(lineStart.x + vec.x * t, lineStart.y + vec.y * t, lineStart.z + vec.z * t) end end end Lil, вопрос такой, функция TestLineSphere будет в скриптинг выведена? Или это просто набросок? http://code.google.com/searchframe#KdIewVX4zdg/trunk/MTA10/game_sa/CWorldSA.cpp&q=TestLineSphere%20package:mtasa-blue%5C.googlecode%5C.com&ct=rc&cd=2&sq=&l=126 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