Jump to content

детектирвание безколизийных объектов(processLineOfSight)


Recommended Posts

Испробовал различные настройки этой функции, но я так понял что она не детектирует такие объекты, если кто это уже делал, пожалуйста ответьте.

Link to comment

Вспомни мапедитор, как они там курсором безколизийные ловят, я думал этой функцией, пробовал всякие варианты, не получилось, однако обычные объекты детектирует нормально.

P.S. В мапедиторе кнопка "E" включает этот режим, и курсор сменивается на красный цвет.

Link to comment

Мде... Интересную задачку ты задал) Я про эту функцию эдитора вобще не знал, так как не пользовался им особо...

Просмотрел код эдитора, там вобще закопаешься...

Ну вобщем при беглом осмотре кода, ничего больше чем:

    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

Для элементов без коллизий, как например маркер, в мап эдиторе где-то должна быть специальная функция (точно подсказать где не смогу), processLineOfSight их не ловит.

Link to comment
Для элементов без коллизий, как например маркер, в мап эдиторе где-то должна быть специальная функция (точно подсказать где не смогу), 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

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