Β· GJK-EPA μκ³ λ¦¬μ¦μΌλ‘ νλ μ΄μ΄λ₯Ό λ°μ΄λ΄λ μ€λΈμ νΈ λ§λ€κΈ°
Β· λΆλ¦¬μΆ(SAT)μΆ©λκ²μ¬λ₯Ό μ¬μ©ν΄μ λ°μ΄λ΄λ μ€λΈμ νΈ λ§λ€κΈ°
Β· OBBμΆ©λκ²μ¬λ₯Ό μ¬μ©ν΄μ λ°μ΄λ΄λ μ€λΈμ νΈ λ§λ€κΈ°
Β· μ μΆ©λμ²΄ν¬ & AABBμΆ©λ체ν¬
Β· 벑ν°μ μ°μ°κ³Ό νμ©
Β· κ·Ήμ’νκ³μ κΈ°λ³Έ μ°μ°λ€
νΉμ ν μ μ΄ λ€κ°ν μμ ν¬ν¨λλμ§λ₯Ό ꡬνλ λ°©λ²μ λν κΈμ΄μμ
κ·Έλ¦¬κ³ μ λ μνμ΄λ νλ‘κ·Έλλ°μ μ μλκ² μλλΌ, ν리거λ μλͺ»λ λ΄μ©μ΄ μμμλ μμ΄μ
γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘
1. μ μ΄ λ€κ°νμ ν¬ν¨λλμ§ κ΅¬νλ μκ³ λ¦¬μ¦μ μ΄μ©νλ λ°©λ²
첫λ²μ§Έλ νΉμ μ μ΄ νΉμ λ€κ°νμ ν¬ν¨λλμ§λ₯Ό ꡬνλ μκ³ λ¦¬μ¦μ μ΄μ©νλ λ°©λ²μ΄μμ
μμ μ¬λ €λμ κ·Έλ¦Όμ²λΌ, μ΄λ€ μ μ΄ νΉμ λ€κ°ν μμ ν¬ν¨λλ€λ©΄
μ΄λ ν΄λΉ μ μμ μ€λ₯Έμͺ½μΌλ‘ μ§μ μ κ·Έμμλ, κ·Έ μ§μ μ λ€κ°νμ λͺ¨μ리μ νμλ² κ΅μ°¨ν΄μ
μ¦, μ§μ μ΄ λ€κ°νκ³Ό μ§μλ² λ§λκ±°λ, μμ λ§λμ§ μμΌλ©΄, ν΄λΉ μ μ λ€κ°ν μμ ν¬ν¨λμ΄μμ§ μμκ±°μμ
κ·Έλ¦¬κ³ μ΄ μκ³ λ¦¬μ¦μ μμ κ·Έλ¦Όμ²λΌ λ³Όλ‘λ€κ°νμμλ§μ΄ μλλΌ μμ μ¬λ €λμ κ·Έλ¦Όμ²λΌ μ€λͺ©λ€κ°νμλ μ μ©λ μ μμ΄μ
μμ λ§μ°¬κ°μ§λ‘ μ μ΄ λ€κ°ν λ΄λΆμ ν¬ν¨λμ΄μλ€λ©΄ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄ νμλ² λ§λκ³
ν¬ν¨λμ΄μμ§ μμΌλ©΄ λ§λμ§ μκ±°λ μ§μλ² λ§λκ² λμ
κ·Έλ¦¬κ³ μ΄λ νΉμ μ μμ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄, λ€κ°νμ λͺ¨μ리μ κ΅μ°¨νλμ§λ₯Ό νλ³νκΈ° μν΄μλ
λκ°μ§ λ¨κ³λ₯Ό κ±°μΉκ² λμ
첫λ²μ§Έλ ν΄λΉ μ μ yμ’νκ°, ν΄λΉ λͺ¨μ리μ yμ’νμ μν λ²μ λ΄μ μλμ§λ₯Ό 체ν¬νλκ±°μμ,
μ¦ μμ κ·Έλ¦Όμμλ yκ°μ΄ y1κ³Ό y2μ¬μ΄μ μμ΄μΌ ν΄μ,
κ·Έλ¦¬κ³ λλ²μ§Έλ ν΄λΉ λͺ¨μ리μ λ μ λ μ μ μ§λλ μ§μ μ λ°©μ μμ ꡬν΄μ, ν΄λΉ λ°©μ μμΒ μ μ yμ’νλ₯Ό λμ νμλ λμ€λ xκ°μ΄
μλ μ μ xκ°λ³΄λ€ 컀μΌν΄μ, μ¦Β μ€λ₯Έμͺ½μ μμ΄μΌ ν΄μ
μ¦, μμ κ·Έλ¦Όμμ μ (x1,y1) (x2,y2) λ₯Ό μ§λλ μ§μ μ λ°©μ μμ ꡬνλ€μ
κ·Έλ κ·Έ λ°©μ μμ νλ μ μ yμ’νλ₯Ό λμ ν΄μ λμ€λ xκ°, μ¦ μ£Όν©μ μ μ xκ°μ΄ νλμ μ μ xκ°λ³΄λ€ 컀μΌν΄μ
2. κΌμ§μ μ μ’νλ₯Ό λͺ¨μλ¦¬λ‘ λ°κΏμ£Όλ ν¨μ
μ¬κΈ°μλΆν°λ μ€μ λ‘ μ¬μ©λλ μ½λμ λν μ€λͺ μ΄μμ
μ°μ , μμ μ¬λ €λμ κ·Έλ¦Όμ²λΌ λ€κ°νμ κ° κΌμ§μ μ μ’νκ° λ°°μ΄λ‘ μ£Όμ΄μ‘μλ
ν΄λΉ μ’νλ₯Ό λͺ¨μ리λ€λ‘ λ³νν΄μ λ°°μ΄λ‘ μΆλ ₯ν΄μ£Όλ ν¨μμμ
γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘
def sort(p)
line = Array.new
i = 0
until p[i] == nil
if p[i+1] == nil
line.push([p[i][0],p[i][1],p[0][0],p[0][1]])
else
line.push([p[i][0],p[i][1],p[i+1][0],p[i+1][1]])
end
i += 1
end
return line
end
γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘γ ‘
μμ μ¬λ €λμ μ½λκ° ν΄λΉ ν¨μμ μ½λμμ, rubyνλ‘κ·Έλλ° μΈμ΄λ‘ μμ±νκ±°μμ
[ [x1,y1],[x2,y2],[x3,y3] ] νμμ λ°°μ΄λ‘ λ€κ°νμ κΌμ§μ μ μ’νλ₯Ό μ λ ₯νλ©΄
[ [x1,y1,x2,y2],[x2,y2,x3,y3],[x3,y3,x1,y1] ] νμμ λ°°μ΄λ‘ λ€κ°νμ κ°κ°μ λͺ¨μ리λ€μ μΆλ ₯ν΄μ€μ
μ΄λ κΌμ§μ λ€μ μ’νλ μκ³λ°©ν₯, νΉμ λ°μκ³λ°©ν₯μΌλ‘ μμλλ‘ μ λ ₯ν΄μΌν΄μ
3. μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄ λͺ¨μ리μ κ΅μ°¨νλμ§ νλ³νλ ν¨μ
λ€μμ μ μμ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄, λ€κ°νμ νΉμ λͺ¨μ리μ κ΅μ°¨νλμ§λ₯Ό ꡬνλ ν¨μμμ
γ ‘γ ‘γ ‘γ ‘γ ‘
def line_x(x1,y1,x2,y2,y)
if x1 == x2
x1 += 0.001
end
if y1 == y2
y1 += 0.001
end
return (y-y1)*((x2-x1)/(y2-y1))+x1
end
γ ‘γ ‘γ ‘γ ‘γ ‘
첫λ²μ§Έλ μμ κ·Έλ¦Όμ²λΌ λ μ (x1,y1) (x2,y2)κ° μ£Όμ΄μ‘μλ
μ΄ λ μ μ μ§λλ λ°©μ μμ ꡬν΄μ, κ·Έ λ°©μ μμ νΉμ yκ°μ λμ νμλ λμ€λ xκ°μ ꡬν΄μ£Όλ ν¨μμμ
μμ κ·Έλ¦Όμμ 첫λ²μ§Έ μ€μ΄ λ μ (x1,y1) (x2,y2)μ μ§λλ μ§μ μ λ°©μ μμ΄κ³
λλ²μ§Έ μ€μ ν΄λΉ λ°©μ μμ x = μ ννλ‘ μ 리νκ±°μμ, ν¨μμμ μ€μ λ‘ μ΄μ©νλ건 λλ²μ§Έ μμ΄μμ
κ·Έλ¦¬κ³ μ΄λ x1=x2 κ±°λ y1=y2λ©΄ μ€λ₯κ° μκΈΈμλ μμ΄μ κ·Έλ΄λλ§ x1κ³Ό y1μ λ―ΈμΈν κ°μ λν΄μ μλ‘ κ°μ§ μκ² μ‘°μ νλλ‘ νμ΄μ
(x1,y1,x2,y2,y) ννλ‘ μ λ ₯νλ©΄, (x1,y1) (x2,y2)λ₯Ό μ§λλ μ§μ μ yμμμ xκ°μ μΆλ ₯ν΄μ€μ
γ ‘γ ‘γ ‘γ ‘γ ‘
def right_cross(x1,y1,x2,y2,x,y)
if y < [y1,y2].min || y > [y1,y2].max
return 0
end
if line_x(x1,y1,x2,y2,y) < x
return 0
end
return 1
end
γ ‘γ ‘γ ‘γ ‘γ ‘
κ·Έλ¦¬κ³ μμ μ¬λ €λμ ν¨μκ° μ²«λ²μ§Έ ν¨μλ₯Ό μ΄μ©ν΄μ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄ λ€κ°νμ λͺ¨μ리μ κ΅μ°¨νλμ§λ₯Ό νλ³νλ ν¨μμμ
μ°μ μ μ yκ°μ΄ λͺ¨μ리μ yκ° μ¬μ΄ λ²μμ μλμ§ μ²΄ν¬νλ€μ
μμ ν¨μλ₯Ό μ΄μ©ν΄μ, λͺ¨μ리μ μ λ μ μ μ§λλ μ§μ μΒ λ°©μ μμΒ μ μΒ yκ°μ λμ ν΄μ λμ¨Β xκ°μ΄
μλ μ μ xκ°λ³΄λ€ μ€λ₯Έμͺ½μ μλμ§λ₯Ό 체ν¬ν΄μ
κ·Έλ¦¬κ³ λ λ€ ν΄λΉλλ©΄, μ μμ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄ λͺ¨μ리μ λ§λλ€κ³ νλ³νλκ±°μμ
(x1,y1,x2,y2,x,y) νμμΌλ‘ λͺ¨μ리μ μ λ μ μ μ’ν(x1,y1,x2,y2)κ³Ό μ μ μ’ν(x,y)λ₯Ό μ
λ ₯νλ©΄ λμ
4. μ μ΄ λ€κ°νμ ν¬ν¨λλμ§ κ΅¬νλ ν¨μ
γ ‘γ ‘γ ‘γ ‘γ ‘
def point_polygon(x,y,p)
line = sort(p)
i = 0
j = 0
until line[i] == nil
x1,y1,x2,y2 = line[i][0],line[i][1],line[i][2],line[i][3]
if right_cross(x1,y1,x2,y2,x,y) == 1
j += 1
end
i +=1
end
if j%2 == 0
return 0
else
return 1
end
end
γ ‘γ ‘γ ‘γ ‘γ ‘
κ·Έλ¦¬κ³ μ΄κ² μμ ν¨μλ€μ μ΄μ©ν΄μ μ΅μ’ μ μΌλ‘ μ μ΄ νΉμ λ€κ°νμ ν¬ν¨λλμ§λ₯Ό ꡬνλ ν¨μμ μ½λμμ
(x,y)μ ꡬνκ³ μ νλ μ μ μ’νλ₯Ό μ λ ₯νκ³ , pμ Β [ [x1,y1],[x2,y2],[x3,y3] ]Β νμμΌλ‘ ꡬνκ³ μ νλ λ€κ°νλ€μ μ’νλ₯Ό μ λ ₯νλ©΄
ν΄λΉ μ μ΄ ν΄λΉ λ€κ°νμ ν¬ν¨λμ΄μλ€λ©΄ 1μ, ν¬ν¨λμ΄μμ§ μλ€λ©΄ 0μ μΆλ ₯ν΄μ€μ
μ΄λ μμ κΌμ§μ λ€μ μ’νλ μκ³λ°©ν₯ νΉμ λ°μκ³λ°©ν₯μΌλ‘ μμλλ‘ μ λ ₯ν΄μΌν΄μ
μ°μ 2μμ μ΄μΌκΈ°ν ν¨μλ‘Β λ€κ°νμ κΌμ§μ μ μ’νλ€μ λͺ¨μλ¦¬λ‘ λ°κΎΈκ³
κ·Έ λ€μμ 3μμ μ΄μΌκΈ°νΒ ν¨μλ‘ λ€κ°νμ κ°κ°μ λͺ¨μ리λ€λ§λ€ μ£Όμ΄μ§ μ μμ μ€λ₯Έμͺ½μΌλ‘ κ·Έμ μ§μ μ΄ κ΅μ°¨νλμ§λ₯Ό 체ν¬ν΄μ
κ·Έλ κ²ν΄μ μ΅μ’ μ μΌλ‘ κ΅μ°¨ν νμκ° μ§μλ²(2λ‘ λλ΄μλ λλ¨Έμ§κ° 0)μ΄λ©΄ ν¬ν¨λμ΄μμ§ μλ€κ³ νλ¨νκ³
νμλ²(2λ‘ λλ΄μλ λλ¨Έμ§κ° 0μ΄ μλκ²½μ°)μ΄λ©΄ ν¬ν¨λμ΄ μλ€κ³ νλ¨νλκ±°μμ
5. CCWμκ³ λ¦¬μ¦μ μ΄μ©νλ λ°©λ²
λλ²μ§Έλ‘ μ΄μΌκΈ°ν λ°©λ²μΒ CCWμκ³ λ¦¬μ¦μ μ΄μ©ν΄μ νΉμ μ μ΄ νΉμ λ€κ°ν λ΄λΆμ ν¬ν¨λμ΄ μλμ§λ₯Ό ꡬνλ λ°©λ²μ΄μμ
https://gall.dcinside.com/m/game_dev/162026
[μ리μ¦] κ²μμ μ Β· GJKμκ³ λ¦¬μ¦μ μ¬μ©ν λ€μν λνμ μΆ©λνμ ꡬνκΈ° Β· GJK-EPA μκ³ λ¦¬μ¦μΌλ‘ νλ μ΄μ΄λ₯Ό λ°μ΄λ΄λ μ€λΈμ νΈ λ§λ€κΈ° Β· λΆλ¦¬μΆ(SAT)μΆ©λκ²μ¬λ₯Ό μ¬μ©ν΄μ λ°μ΄λ΄λ μ€λΈμ νΈ λ§λ€κΈ° Β· OBB
gall.dcinside.com
CCWμκ³ λ¦¬μ¦μ λν μ€λͺ μ μμ μ¬λ €λμ κΈμ 22λ² λΆλΆμ λμμμ΄μ,Β
μ¬κΈ°μ μ€λͺ νλ λ°©λ²μ μμ κΈμ 24λ²μ λμμλ μΌκ°νμ λ΄λΆ νλ³μ λ€κ°νμ κ²½μ°λ‘ νμ₯νκ±°μμ
μ¦, μμ μ¬λ €λμ κ·Έλ¦Όμ²λΌ
μ΄λ€ μ μ΄ νΉμ λ€κ°νμ λ΄λΆμ μμΌλ©΄
λ€κ°νμ κΌμ§μ λ€μμ μμλλ‘ ν΄λΉ μ μ CCWμκ³ λ¦¬μ¦μ μ€ννμλ,
μ¦ 1λ²-2λ²-νλμ , 2λ²-3λ²-νλμ , μ΄λ°μμΌλ‘ 5λ²-1λ²-νλμ κΉμ§ μ λΆ μ€ννμλ
λͺ¨λ κ°λ€μ΄ 0λ³΄λ€ μ»€μΌν΄μ,Β
κ·Έλ¦¬κ³ μ΄λΒ xμ’νκ° μ€λ₯Έμͺ½μ΄ +κ³ , yμ’νκ° μμͺ½μ΄ +μΌλ κΈ°μ€μΌλ‘
λ€κ°νμ κΌμ§μ λ€μ μ’νλ λ°μκ³λ°©ν₯μΌλ‘ μμλλ‘ μ£Όμ΄μ Έμμ΄μΌν΄μ
λ, μμμ μ€λͺ ν 첫λ²μ§Έ λ°©λ²κ³Όλ λ€λ₯΄κ², μ΄ λ°©λ²μ λ³Όλ‘λ€κ°νμΌλλ§ μ¬μ©ν μ μμ΄μ, 첫λ²μ§Έ λ°©λ²μ²λΌ μ€λͺ©λ€κ°νμλ μ¬μ©ν μ μμ΄μ
γ ‘γ ‘γ ‘γ ‘γ ‘
def ccw(x1,y1,x2,y2,x3,y3)
return (x1*y2+x2*y3+x3*y1)-(y1*x2+y2*x3+y3*x1)
end
γ ‘γ ‘γ ‘γ ‘γ ‘
γ ‘γ ‘γ ‘γ ‘γ ‘
def point_polygon2(x,y,p)
i = 0
until p[i] == nil
if p[i+1] == nil
x1,y1,x2,y2,x3,y3 = p[i][0],p[i][1],p[0][0],p[0][1],x,y
else
x1,y1,x2,y2,x3,y3 = p[i][0],p[i][1],p[i+1][0],p[i+1][1],x,y
end
if ccw(x1,y1,x2,y2,x3,y3) <= 0
return 0
end
i += 1
end
return 1
end
γ ‘γ ‘γ ‘γ ‘γ ‘
κ·Έλ¦¬κ³ μμ μ¬λ €λμ μ½λκ° μ΄λ κ² CCWμκ³ λ¦¬μ¦μ μ΄μ©νλ λ°©λ²μ μ½λμμ
첫λ²μ§Έλ CCWμκ³ λ¦¬μ¦μ μ½λκ³ , λλ²μ§Έκ° μ€μ λ‘ μ μ΄ λ€κ°νμ λ΄λΆμ μλμ§λ₯Ό νλ³νλ μ½λμμ
x,yλ‘ κ΅¬νλ €λ μ μ μ’νλ₯Ό μ λ ₯νκ³
pμΒ [ [x1,y1],[x2,y2],[x3,y3] ]Β ννλ‘ λ€κ°νμ κΌμ§μ μ κ°κ°μ μ’νλ₯Ό μ
λ ₯νλ©΄(λ¨ μ΄λ λ°μκ³λ°©ν₯μΌλ‘ μμλλ‘ μ
λ ₯ν΄μΌν΄μ)
λ€κ°νμ λͺ¨λ κΌμ§μ λ€μμ μμλλ‘ ν΄λΉ μ κ³Ό CCWμκ³ λ¦¬μ¦μ μ€νν΄μ λ§μ½ κ·Έ κ°μ΄ λͺ¨λ 0λ³΄λ€ ν¬λ©΄ ν¬ν¨λλ€κ³ 1μ μΆλ ₯νκ³
λ§μ½ κ°μ΄ 0λ³΄λ€ κ°κ±°λ μμ κ²½μ°κ° μλ€λ©΄ ν¬ν¨λμ§ μλλ€κ³ νλ³νκ³ 0μ μΆλ ₯ν΄μ
κ·Έλ¦¬κ³ μμ μ¬λ €λμ μμμ΄ ν΄λΉ μ½λλ€μ μ΄μ©ν΄μ μ€μ λ‘ μΈκ²μμμ μ μ΄ λ€κ°νμ ν¬ν¨λλμ§λ₯Ό ꡬνλ μμμ΄μμ
첫λ²μ§Έκ° μ μ΄ λ€κ°νμ ν¬ν¨λλμ§λ₯Ό ꡬνλ μκ³ λ¦¬μ¦μ μ¬μ©ν λΆλΆμ΄κ³
λλ²μ§Έκ°Β CCWμκ³ λ¦¬μ¦μ μ¬μ©ν λΆλΆμ΄μμ
λΉ¨κ°μ μ μ΄ νλ μ΄μ΄κ° μμ§μ΄λ μ μ΄μμ, ν΄λΉ μ μ΄ λ€κ°νμ λ΄λΆμ ν¬ν¨λλ€λ©΄ λ€κ°νκ³Ό μ λλ€ λ°ν¬λͺ νκ² νμλμ
κ·Έλ¦¬κ³ μ΄λ°μμΌλ‘ νλ©΄ μ μ΄ λ€κ°νμ ν¬ν¨λλμ§λ₯Ό ꡬν μ μμ΄μ
κ³ μγ·γ·..
컨벑μ€ν λ¬Έμ μλκ°
κ³ μ....
μ‘΄λ μ κΈ°νλ€