블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

'충돌'에 해당되는 글 2건

  1. 2012.11.05 오브젝트 간 충돌을 막고 싶을 때..
  2. 2011.09.08 [펌] 3D공간구조 기본충돌

1) Layer 단위로 충돌을 막을 때..


 Layer를 생성 & 셋팅 하고, 충돌을 안하고 싶은 레이어들을 셋팅해 준다.


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), true); 


위 소스는 MonsterBody끼리 충돌을 방지한다.

예를들어 플레이어가 박스등에 부딪히고 싶지 않다면..


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Character"), LayerMask.NameToLayer("Box"), true); 


이런 식으로 하면 된다.


[추가]

충돌을 안하게 했던 부분을 다시 충돌하게 하려면 3번째 매개변수 값을 false로 넣으면 된다.

Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), false); 



참조1 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=20010&sca=UNITY&sfl=wr_subject%7C%7Cwr_content&stx=%EC%B6%A9%EB%8F%8C&sop=and&page=2&currentId=44


참조2 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreLayerCollision.html




2) 각 개체(오브젝트)별로 충돌을 (실시간으로)막고 싶을 때..

  플레이어가 몬스터와 충돌되다가 몬스터를 죽이면 충돌이 안되게 하고 싶어서 이걸 사용했다.

  처음에 Collider 자체를 껐더니 바닥과도 충돌이 안돼서 빠지는 문제 때문에 이걸로 바꿨다.


Physice.IgnoreCollision() 함수를 쓴다.


static function IgnoreCollision (collider1 : Collider, collider2 : Collider, ignore : bool = true) : void


collider1과 collider2를 충돌하지 않게 해준다.


자세한 사항은 아래 참조로..


참조 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreCollision.html

반응형

'Unity3D > Physics' 카테고리의 다른 글

Raycast  (6) 2013.02.28
Posted by blueasa
, |

 

Plane to Plane
-> 한평면의 테두리인 4개의 직선과 평면 충돌로 검출

// 평면1과 평면2의 선분 4개와 충돌 검사를 한다.
for( int I = 0; I < LineNum; i++){
{intersect3D_SegmentPlane( Segment S2[i], Plane Pn1, Point* I ) }

//평면 2와 평면1의 선분 4개와 충돌검사를 한다. LineNum = 4
for( int I = 0; I < LineNum; i++)
{intersect3D_SegmentPlane( Segment S1[i], Plane Pn2, Point* I ) }

BOOL CheckPlane()
{
for( int I = 0; I < LineNum; i++){
if( intersect3D_SegmentPlane( Segment S2[i], Plane Pn1, Point* I ) )
return TRUE;
}
for( int I = 0; I < LineNum; i++)
{
if( ntersect3D_SegmentPlane( Segment S1[i], Plane Pn2, Point* I ) )
return TRUE;
}
}

Sphere to Sphere
-> 구의 반지름 길이로 충돌검출

float D;
|Vr| = D = sqrt(Vr.x*Vr*x + Vr.y*Vr.y + Vr.z*Vr.z)
(벡터크기는 DX에서는 D3DXVEC3Length 란 함수로 제공한다. 그 외에 벡터들간의 연산에 관련된 여러 가지 함수들이 제공되어 편하다 )
if( (r+R) > D )
{
// sphere 충돌
}


float d = (Vr.x*Vr*x + Vr.y*Vr.y + Vr.z*Vr.z)
(r+R)² > d

Sphere to Line
-> 직선의 방정식과 구의 방정식을 이용해 충돌 검출

// return 값이 -1 이 아니라면 교차한다.
float ray_sphereIntersection(sphere_t* sphere, ray_t* ray) {
//B = [xd (x0 - xc) + yd(y0 - yc) + zd(z0 - zc)]이므로
// b - 직선의 방향벡터 d 와 직선의 한점 o 에서 구의 중심 p
// 으 로 향하는 벡터의 dot product
// C = (x0 - xc)² + (y0 - yc) ² + (z0 - zc)² - rs²
// 2가아니라 제곱입니다. 제곱은 카피가 안되니 조심하세요. //…
//vsquaredist = (o.x-p.x)²+(o.y-p.y)²+(o.z-p.z)²
float b = vdot(ray->d, vsub(ray->o, sphere->p));
float c = vsquaredist(ray->o, sphere->p) - (sphere->r * sphere->r);
// d = b²-c
float d = b * b - c;

if (d < 0.0f) {
return -1.0f;
}
return -b - sqrt(d); //t 값 return
}

BOOL WINAPI D3DXSphereBoundProbe(
const D3DXVECTOR3 *pCenter, // 구의 중심점
FLOAT Radius, // 구의 반지름
const D3DXVECTOR3 *pRayPosition, //직선의 위치
const D3DXVECTOR3 *pRayDirection //직선의 방향 벡터
);

출처 : http://cafe.naver.com/opendori/17451

반응형

'Programming > Math' 카테고리의 다른 글

투영 벡터 ( Projection Vector )  (0) 2012.05.16
동차좌표 ( 同次座標, Homogeneous coordinate )  (0) 2012.05.16
좌표계  (0) 2010.07.01
역행렬(Inverse Matrix)  (0) 2010.03.17
행렬식(Determinant)  (0) 2010.03.17
Posted by blueasa
, |