定義幾個資料型別和函式
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 ...