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);
//------------------------------------------------------------------------------
// 방향벡터 생성하고 단위벡터로 만들어서 리턴
// 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 |