lua實現cocos多邊形碰撞檢測

2021-07-02 21:58:46 字數 2256 閱讀 4823

定義幾個資料型別和函式

function vec(x, y)

return

endv = vec -- shortcut

function dot(v1, v2)

return v1[1]*v2[1] + v1[2]*v2[2]

endfunction normalize(v)

local mag = math.sqrt(v[1]^2 + v[2]^2)

return vec(v[1]/mag, v[2]/mag)

endfunction perp(v)

return

endfunction segment(a, b)

local obj = }

obj[1] = obj.dir[1]; obj[2] = obj.dir[2]

return obj

endfunction polygon(vertices)

local obj = {}

obj.vertices = vertices

obj.edges = {}

for i=1,#vertices do

table.insert(obj.edges, segment(vertices[i], vertices[1+i%(#vertices)]))

endreturn obj

endvec為向量或者向量,也可表示點;dot為向量點投影運算;normalize為求模運算;perp計算法線向量;segment表示線段;polygon為多邊形,包括頂點vertices和邊edges,所有點的順序必須按順時針或者逆時針

演算法的判斷函式

-- we keep a running range (min and max) values of the projection, and then use that as our shadow

function project(a, axis)

axis = normalize(axis)

local min = dot(a.vertices[1],axis)

local max = min

for i,v in ipairs(a.vertices) do

local proj =  dot(v, axis) -- projection

if proj < min then min = proj end

if proj > max then max = proj end

endreturn

endfunction contains(n, range)

local a, b = range[1], range[2]

if b < a then a = b; b = range[1] end

return n >= a and n <= b

endfunction overlap(a_, b_)

if contains(a_[1], b_) then return true

elseif contains(a_[2], b_) then return true

elseif contains(b_[1], a_) then return true

elseif contains(b_[2], a_) then return true

endreturn false

endproject為計算投影函式,先計算所有邊長的投影,然後算出投影的最大和最小點即起始點;overlap函式判斷兩條線段是否重合

演算法實現函式,使用到上面的資料和函式

function sat(a, b)

for i,v in ipairs(a.edges) do

local axis = perp(v)

local a_, b_ = project(a, axis), project(b, axis)

if not overlap(a_, b_) then return false end

endfor i,v in ipairs(b.edges) do

local axis = perp(v)

local a_, b_ = project(a, axis), project(b, axis)

if not overlap(a_, b_) then return false end

endreturn true

end遍歷a和b兩個多邊形的所有邊長,判斷投影是否重合

a = polygon

b = polygon

print(sat(a,b)) -- true

判斷多邊形重疊 多邊形碰撞檢測

在討論多邊形碰撞檢測之前,我們可以先思考一下遊戲物件怎麼判斷2d圖形有碰撞,靠的是判斷2d圖形在遊戲世界中有接觸,或者有重疊區域,大到包含,小到重疊接觸乙個點。那麼我們就需要精確計算2d圖形在某一幀有重疊部分,或者預判到下一幀有重疊部分,那麼就是碰撞到了。先從簡單的模型來討論碰撞。判斷乙個點是否在多...

多邊形碰撞 SAT方法

檢測凸多邊形碰撞的一種簡單的方法是sat separating axis theorem 即分離軸定理。原理 將多邊形投影到一條向量上,看這兩個多邊形的投影是否重疊。如果不重疊,則認為這兩個多邊形是分離的,否則找下一條向量來繼續投影。我們不需要比較很多條向量,因為已經在數學上證明,多邊形每條邊的垂直...

cocos2dx多邊形裁剪

cocos2dx提供了clippingnode,用於處理裁剪。使用步驟是 建立,設定裁剪形狀,設定被裁剪物件。另外裁剪多邊形,目前測試只能使用drawpolygon函式繪製的形狀可以被正常裁剪,其他方式繪製的無法正常裁剪,具體原因懶地研究。例子 被裁剪的node drawnode drawnode ...