游戏开发

本类阅读TOP10

·初学者的福音:游戏开发新手入门指南
·《学VC、编游戏》重点算法解疑·快一点
·Windows的消息机制与消息重定向技术
·《学VC、编游戏》重点算法解疑·再快一点
·Rogue Guide
·《学VC、编游戏》重点算法解疑·狩猎谋生
·通向天才之路 : 把模块塞到动态连接库里去
·完成端口的深入理解及一种变态用法
·DirectX 9.0 SDK 开发包下载(April 2005)
·在OpenGL中实现多纹理混合(Multi-texture Blending)

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
[郑群 原创]我研究的地形碰撞检测方法

作者:未知 来源:月光软件站 加入时间:2005-5-13 月光软件站

首先我们要生成的地形顶点应该是n*m个顶点在X,Z平面上成矩形(推荐正方形)规则的排

列,就是X,Z坐标是有规律的(为简单期间X,Z均在正半轴),而Y值则是不同的,Y值表现

的就是地形的高低。(Y值可以算法算出来,比如随机取,也可以是用高度图得到,推荐后

者。)
然后用一个n*m的2维数组MapData[n][m]记录Y值。
关键的计算人物高度部分到了。首先根据人物坐标得到保存人物所在的三角形的三个点Y值

的数组索引,这个可以很简单的得到,如图。当然,得到人物所在矩形是很简单的,但是我

们要得到的是人物所在的三角形,这个时候就得判断了,这有个很简单的方法,那就是刚才

x%RECT_WIDTH+y%RECT_LONG<=(RECT_WIDTH+RECT_LONG)/2(前提是长宽都是整数才可以用%操作,否则就老实的p.x-p1.x,p.y-p1.y做吧)则在左边的这个三角形中,否则在

右边的三角形中。
得到了三个顶点的Y值,要得到人物的Y值,这有个公式p.y=p1.y+(p2.y-p1.y)*u+(p3.y-p1.

y)*v,其中u,v是重心坐标,因为我们这是直角三角形,所以可以很简单得到,u=z%RECT_LONG/RECT_LONG,v=x%RECT_WIDTH/RECT_WIDTH.怎么样?这个方法做人物于地形的碰撞检测很好吧,得到的高度很精确

。快去试试吧:)
float CTerrain::GetHeightWithXZ(float x,float z)//根据地图平面坐标得到地形高度信息
{
int iIndexX=x/MAP_RECT_WIDTH;
int iIndexZ=z/MAP_RECT_LONG;//这两个数据用来确定高度信息在数组中的位置,也就是数组下标
float u,v;
float t0,t1,t2;
float fOffsetZ=0.0f;
float fOffsetX=0.0f;
fOffsetX=x-(float)iIndexX*MAP_RECT_WIDTH;
fOffsetZ=z-(float)iIndexZ*MAP_RECT_LONG;//该坐标在此三角面中的偏移坐标

if(fOffsetX+fOffsetZ>(MAP_RECT_LONG+MAP_RECT_WIDTH)/2.0f)//判断该点在方格的那边三角面
{
u=1-(fOffsetX)/MAP_RECT_WIDTH;
v=1-(fOffsetZ)/MAP_RECT_LONG;//重心坐标
t0=MapData[iIndexZ+1][iIndexX+1],
t1=MapData[iIndexZ][iIndexX+1],
t2=MapData[iIndexZ+1][iIndexX];//确定坐标所在三角面三个顶点的高度
return t0+u*(t2-t0)+v*(t1-t0);//利用重心坐标求出高度插值
}
else
{
u=(fOffsetX)/MAP_RECT_WIDTH;
v=(fOffsetZ)/MAP_RECT_LONG;
t0=MapData[iIndexZ][iIndexX],
t1=MapData[iIndexZ][iIndexX+1],
t2=MapData[iIndexZ+1][iIndexX];
return t0+v*(t2-t0)+u*(t1-t0);

}
原文地质:http://bbs.gamedev.csdn.net/showthread.php?t=10294


相关文章

相关软件




月光软件源码下载编程文档电脑教程网站优化网址导航网络文学游戏天地生活休闲写作范文安妮宝贝站内搜索
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有