Spec-Zone.ru › LÖVE

Фигура: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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API