opengles1 사용중.

3D공간에서, 우리편 타워가 적을 바라보도록 하는법

이거 구현하는데 한달은 걸림, 어려웠다

중고등학교때 배웠던 (기억은 안나는) 벡터 공부 다시 했다. ㅠ.ㅠ

역시 3D 는 힘들구나...

 

 

* 우선 타워가 위를 바라보도록 렌더링한다

   (총구가 위를 향하도록)

 

* 타워가 적을 바라보는 방향벡터를 만들고, 이 벡터를 단위벡터로 만든다. (벡터1)

 

* 위를 바로보는 벡터를 생성한다. (벡터2)

 

* 방향벡터(벡터1)와 up벡터(벡터2)의 내적을 구한다.

  (이값이 회전할 각도다)

 

방향벡터(벡터1)와 up벡터(벡터2)의 외적을 구한다.

  (이값이 회전축이다)

 

* glRotatef() 함수로 타워를 회전시킨다.

 

 

 

//------------------------------------------------------------------------------

* 아래는 내 소스

 

 

// 타워가 적을 바라보는 방향벡터 생성. 방향벡터를 단위벡터로 만든다

T3D t3d_face = doGetFaceVector(&t3d_enemy, &t3d);

 

// up벡터 생성, 미리 단위벡터로 생성한다

T3D t3d_up = {0.0, 1.0, 0.0};

 

// 방향벡터와 up벡터의 내적 구한다

iRotateDegree = doGetDegreeVector(&t3d_face, &t3d_up);

  

// 방향벡터와 up벡터의 외적 구한다

t3d_cross = doGetCrossProductVector(&t3d_face, &t3d_up);

 

// 회전  

glRotatef(iRotateDegree, -t3d_cross.x, -t3d_cross.y, -t3d_cross.z);


// 구조체
typedef struct
{
  float x;
  float y;
  float z;
  float speed;
} T3D;

//------------------------------------------------------------------------------

// 방향벡터 생성하고 단위벡터로 만들어서 리턴

// t1 : (destination) 적

// t2 : (source) 타워

//------------------------------------------------------------------------------

static inline T3D doGetFaceVector(T3D* t1, T3D* t2)

{

  T3D t3d_face = {t1->x-t2->x, t1->y-t2->y, t1->z-t2->z};

  

  // 방향벡터를 단위벡터로 만든다

  float v = sqrtf(t3d_face.x*t3d_face.x + t3d_face.y*t3d_face.y + t3d_face.z*t3d_face.z);

  t3d_face.x /= v;

  t3d_face.y /= v;

  t3d_face.z /= v;

  

  return t3d_face;

}

 

//------------------------------------------------------------------------------

// 두벡터의 내적을 구해서, 각도 단위로 바꿔서 리턴

// t1 : 방향벡터

// t2 : up벡터

//------------------------------------------------------------------------------

static inline float doGetDegreeVector(T3D* t1, T3D* t2)

{

  float theta = t1->x*t2->x + t1->y*t2->y + t1->z* t2->z;

  theta = acosf(theta);

  float iDegree = theta * 180.0 / M_PI;

  

  return iDegree;

}

 

//------------------------------------------------------------------------------

// 두벡터의 외적을 구해서 리턴

//------------------------------------------------------------------------------

static inline T3D doGetCrossProductVector(T3D* t1, T3D* t2)

{

  T3D t3d_cross;

  t3d_cross.x = t1->y*t2->z - t1->z*t2->y;

  t3d_cross.y = t1->z*t2->x - t1->x*t2->z;

  t3d_cross.z = t1->x*t2->y - t1->y*t2->x;

  

  return t3d_cross;

}

반응형

'OpenGLES 초보' 카테고리의 다른 글

OpenGL Shader Builder. mac  (0) 2014.10.28
blender, Smart UV Project  (0) 2014.07.04
blender, wavefront obj export 옵션  (0) 2014.07.04
object picking, color picking  (1) 2014.07.04
opengles 에서 gluPerspective 함수 구현  (0) 2014.07.04
Posted by 돌비
,