Фигура:rayCast
Доступно начиная с LÖVE 0.8.0
Эта функция не поддерживается в более ранних версиях.
Выполняет запрос луча по отношению к фигуре и возвращает вектор нормали к поверхности и позицию линии, где луч попал. Если луч не попал в фигуру, возвращается nil. Фигура может быть преобразована, чтобы получить её в нужном положении.
Луч начинается с первой точки входной линии и идёт в сторону второй точки линии. Четвёртый аргумент — максимальное расстояние, которое луч пройдёт как коэффициент масштаба длины входной линии.
Параметр childIndex используется для указания, какой дочерний элемент родительской фигуры, такой как ChainShape, будет задействован в запросе луча. Для ChainShape индекс 1 — это первый край в цепи. Запрос луча по родительской фигуре будет проверять только указанный дочерний элемент, поэтому, если вы хотите проверить каждую фигуру родителя, вы должны перебрать все его дочерние элементы.
Мировые координаты попадания можно вычислить, умножив вектор линии на третье возвращаемое значение и добавив его к начальной точке линии.
hitx, hity = x1 + (x2 - x1) * fraction, y1 + (y2 - y1) * fraction
В 0.8.0 существует ошибка, где вектор нормали, возвращаемый этой функцией, масштабируется с помощью love.physics.getMeter.
Функция
Синопсис
xn, yn, fraction = Shape:rayCast( x1, y1, x2, y2, maxFraction, tx, ty, tr, childIndex )
Аргументы
number x1- Позиция x начальной точки входной линии.
number y1- Позиция y начальной точки входной линии.
number x2- Позиция x конечной точки входной линии.
number y2- Позиция y конечной точки входной линии.
number maxFraction- Параметр длины луча.
number tx- Смещение фигуры по оси x.
number ty- Смещение фигуры по оси y.
number tr- Поворот фигуры.
number childIndex (1)- Индекс дочернего элемента, по которому будет запущен запрос луча.
Возвращаемые значения
number xn- Компонента x вектора нормали ребра, где луч попал в фигуру.
number yn- Компонента y вектора нормали ребра, где луч попал в фигуру.
number fraction- Позиция на входной линии, где произошло пересечение, как коэффициент длины линии.
Примеры
Выполнение 2 разных запросов луча по отношению к прямоугольнику.
function love.load()
-- Setting this to 1 to avoid all current scaling bugs.
love.physics.setMeter(1)
Box = {}
Box.x, Box.y, Box.r = 400, 300, 3.3
Box.Shape = love.physics.newRectangleShape(150, 150)
Ray1 = {
point1 = {},
point2 = {},
}
Ray1.point1.x, Ray1.point1.y = 50, 50
Ray1.point2.x, Ray1.point2.y = 400, 300
Ray1.scale = 1
Ray2 = {
point1 = {},
point2 = {},
}
Ray2.point1.x, Ray2.point1.y = 500, 400
Ray2.point2.x, Ray2.point2.y = Ray2.point1.x + math.cos(math.pi*1.45), Ray2.point1.y + math.sin(math.pi*1.45)
Ray2.scale = 150
end
function love.draw()
-- Drawing the box.
love.graphics.setColor(255, 255, 255)
love.graphics.push()
-- For great point rotation!
love.graphics.translate(Box.x, Box.y)
love.graphics.rotate(Box.r)
love.graphics.polygon("line", Box.Shape:getPoints())
love.graphics.pop()
-- Drawing the input lines of the rays and the reach of ray 2 in gray.
love.graphics.setLineWidth(3)
love.graphics.setColor(50, 50, 50)
love.graphics.line(Ray2.point1.x, Ray2.point1.y, Ray2.point1.x + (Ray2.point2.x - Ray2.point1.x) * Ray2.scale, Ray2.point1.y + (Ray2.point2.y - Ray2.point1.y) * Ray2.scale)
love.graphics.setColor(255, 255, 255)
love.graphics.line(Ray1.point1.x, Ray1.point1.y, Ray1.point2.x, Ray1.point2.y)
love.graphics.line(Ray2.point1.x, Ray2.point1.y, Ray2.point2.x, Ray2.point2.y)
love.graphics.setLineWidth(1)
-- Remember that the ray cast can return nil if it hits nothing.
local r1nx, r1ny, r1f = Box.Shape:rayCast(Ray1.point1.x, Ray1.point1.y, Ray1.point2.x, Ray1.point2.y, Ray1.scale, Box.x, Box.y, Box.r)
local r2nx, r2ny, r2f = Box.Shape:rayCast(Ray2.point1.x, Ray2.point1.y, Ray2.point2.x, Ray2.point2.y, Ray2.scale, Box.x, Box.y, Box.r)
if r1nx then
-- Calculating the world position where the ray hit.
local r1HitX = Ray1.point1.x + (Ray1.point2.x - Ray1.point1.x) * r1f
local r1HitY = Ray1.point1.y + (Ray1.point2.y - Ray1.point1.y) * r1f
-- Drawing the ray from the starting point to the position on the shape.
love.graphics.setColor(255, 0, 0)
love.graphics.line(Ray1.point1.x, Ray1.point1.y, r1HitX, r1HitY)
-- We also get the surface normal of the edge the ray hit. Here drawn in green
love.graphics.setColor(0, 255, 0)
love.graphics.line(r1HitX, r1HitY, r1HitX + r1nx * 25, r1HitY + r1ny * 25)
end
if r2nx then
-- Calculating the world position where the ray hit.
local r2HitX = Ray2.point1.x + (Ray2.point2.x - Ray2.point1.x) * r2f
local r2HitY = Ray2.point1.y + (Ray2.point2.y - Ray2.point1.y) * r2f
-- Drawing the ray from the starting point to the position on the shape.
love.graphics.setColor(255, 0, 0)
love.graphics.line(Ray2.point1.x, Ray2.point1.y, r2HitX, r2HitY)
-- We also get the surface normal of the edge the ray hit. Here drawn in green
love.graphics.setColor(0, 255, 0)
love.graphics.line(r2HitX, r2HitY, r2HitX + r2nx * 25, r2HitY + r2ny * 25)
end
end См. также
© 2006–2020 LÖVE Development Team
Licensed under the GNU Free Documentation License, Version 1.3.
https://love2d.org/wiki/Shape:rayCast