作者barroslee (很久没写Hspice 我早忘了)
看板GameDesign
标题Re: [程式] 请问怎麽让单位具有可视范围?
时间Sat Aug 19 18:48:42 2006
※ 引述《l314 (红虫)》之铭言:
: 我希望我的单位(actor),都具有可视范围,当其它单位进入视线时,会作出反应..
: 我的每个单位都是一个Object,可以拥有自己的属性..
: 目前只知道需要视角和可视半径,
: 像下面这张图一样,单位具有可视范围.
: http://www.cs.nccu.edu.tw/~t9148/perception.JPG
: 请先进们提示小弟一些实作的技巧..
: 谢谢..
对每个 actor 算他们的 view frustum
算是基本功
Y
|
|
|-------X
/
/
/
Z
enum FrustumSide
{
RIGHT = 0,
LEFT,
BOTTOM,
TOP,
BACK,
FRONT
};
void CalculateFrustum()
{
vec4 frustum[6];
float proj[16]; // projection matrix of an actor
float modl[16]; // modelview matrix of an actor
float clip[16]; // clipping planes of an actor
// find projection matrix and modelview matrix
// .....
//
// opengl:
// glGetFloatv( GL_PROJECTION_MATRIX, proj );
// glGetFloatv( GL_MODELVIEW_MATRIX, modl );
// find clipping planes and view frustum
clip[ 0] = modl[ 0] * proj[ 0] +
modl[ 1] * proj[ 4] +
modl[ 2] * proj[ 8] +
modl[ 3] * proj[12];
clip[ 1] = modl[ 0] * proj[ 1] +
modl[ 1] * proj[ 5] +
modl[ 2] * proj[ 9] +
modl[ 3] * proj[13];
clip[ 2] = modl[ 0] * proj[ 2] +
modl[ 1] * proj[ 6] +
modl[ 2] * proj[10] +
modl[ 3] * proj[14];
clip[ 3] = modl[ 0] * proj[ 3] +
modl[ 1] * proj[ 7] +
modl[ 2] * proj[11] +
modl[ 3] * proj[15];
clip[ 4] = modl[ 4] * proj[ 0] +
modl[ 5] * proj[ 4] +
modl[ 6] * proj[ 8] +
modl[ 7] * proj[12];
clip[ 5] = modl[ 4] * proj[ 1] +
modl[ 5] * proj[ 5] +
modl[ 6] * proj[ 9] +
modl[ 7] * proj[13];
clip[ 6] = modl[ 4] * proj[ 2] +
modl[ 5] * proj[ 6] +
modl[ 6] * proj[10] +
modl[ 7] * proj[14];
clip[ 7] = modl[ 4] * proj[ 3] +
modl[ 5] * proj[ 7] +
modl[ 6] * proj[11] +
modl[ 7] * proj[15];
clip[ 8] = modl[ 8] * proj[ 0] +
modl[ 9] * proj[ 4] +
modl[10] * proj[ 8] +
modl[11] * proj[12];
clip[ 9] = modl[ 8] * proj[ 1] +
modl[ 9] * proj[ 5] +
modl[10] * proj[ 9] +
modl[11] * proj[13];
clip[10] = modl[ 8] * proj[ 2] +
modl[ 9] * proj[ 6] +
modl[10] * proj[10] +
modl[11] * proj[14];
clip[11] = modl[ 8] * proj[ 3] +
modl[ 9] * proj[ 7] +
modl[10] * proj[11] +
modl[11] * proj[15];
clip[12] = modl[12] * proj[ 0] +
modl[13] * proj[ 4] +
modl[14] * proj[ 8] +
modl[15] * proj[12];
clip[13] = modl[12] * proj[ 1] +
modl[13] * proj[ 5] +
modl[14] * proj[ 9] +
modl[15] * proj[13];
clip[14] = modl[12] * proj[ 2] +
modl[13] * proj[ 6] +
modl[14] * proj[10] +
modl[15] * proj[14];
clip[15] = modl[12] * proj[ 3] +
modl[13] * proj[ 7] +
modl[14] * proj[11] +
modl[15] * proj[15];
frustum[RIGHT].x = clip[ 3] - clip[ 0];
frustum[RIGHT].y = clip[ 7] - clip[ 4];
frustum[RIGHT].z = clip[11] - clip[ 8];
frustum[RIGHT].w = clip[15] - clip[12];
NormalizePlane(frustum, RIGHT);
frustum[LEFT].x = clip[ 3] + clip[ 0];
frustum[LEFT].y = clip[ 7] + clip[ 4];
frustum[LEFT].z = clip[11] + clip[ 8];
frustum[LEFT].w = clip[15] + clip[12];
NormalizePlane(m_Frustum, LEFT);
frustum[BOTTOM].x = clip[ 3] + clip[ 1];
frustum[BOTTOM].y = clip[ 7] + clip[ 5];
frustum[BOTTOM].z = clip[11] + clip[ 9];
frustum[BOTTOM].w = clip[15] + clip[13];
NormalizePlane(frustum, BOTTOM);
frustum[TOP].x = clip[ 3] - clip[ 1];
frustum[TOP].y = clip[ 7] - clip[ 5];
frustum[TOP].z = clip[11] - clip[ 9];
frustum[TOP].w = clip[15] - clip[13];
NormalizePlane(frustum, TOP);
frustum[BACK].x = clip[ 3] - clip[ 2];
frustum[BACK].y = clip[ 7] - clip[ 6];
frustum[BACK].z = clip[11] - clip[10];
frustum[BACK].w = clip[15] - clip[14];
NormalizePlane(frustum, BACK);
frustum[FRONT].x = clip[ 3] + clip[ 2];
frustum[FRONT].y = clip[ 7] + clip[ 6];
frustum[FRONT].z = clip[11] + clip[10];
frustum[FRONT].w = clip[15] + clip[14];
NormalizePlane(frustum, FRONT);
}
--
我的游戏引擎图
http://www.wretch.cc/album/album.php?id=barroslee&book=1
我的 blog
http://barroslee.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.20.103
1F:→ l314:谢谢你呀~~~ 08/19 23:17