地形碰撞检测方法(转)
2010-10-01 12:15
316 查看
首先我们要生成的地形顶点应该是n*m个顶点在X,Z平面上成矩形(推荐正方形)规则的排
列,就是X,Z坐标是有规律的(为简单期间X,Z均在正半轴),而Y值则是不同的,Y值表现
的就是地形的高低。(Y值可以算法算出来,比如随机取,也可以是用高度图得到,推荐后
者。)
然后用一个n*m的2维数组MapData
[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.怎么样?这个方法做人物于地形的碰撞检测很好吧,得到的高度很精确
。快去试试吧:)
转自:http://blog.csdn.net/csdn_gamedev/archive/2005/04/17/351417.aspx
列,就是X,Z坐标是有规律的(为简单期间X,Z均在正半轴),而Y值则是不同的,Y值表现
的就是地形的高低。(Y值可以算法算出来,比如随机取,也可以是用高度图得到,推荐后
者。)
然后用一个n*m的2维数组MapData
[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); } } |
相关文章推荐
- [郑群 原创]我研究的地形碰撞检测方法
- [郑群 原创]我研究的地形碰撞检测方法
- 在3D世界中创建不同的相机模式——检测相机与模型,墙或地形的碰撞
- Cocos2d-X 游戏之碰撞检测的方法
- Android 游戏检测碰撞方法
- 技术转载:游戏里实现碰撞检测方法
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- 游戏里实现碰撞检测方法
- cocos2d-js基础 本地数据存储 碰撞检测几种方法
- 简单碰撞检测方法
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- 游戏里实现碰撞检测方法
- unity中htc vive物理射线检测碰撞的方法—Phsics.Raycast()
- 任意多边形的碰撞检测——向量积判断方法
- 游戏里实现碰撞检测方法
- 碰撞检测方法
- 高级碰撞检测(二)——居于格子的大量单位的检测方法
- 凸多边形碰撞检测算法——分离坐标轴方法
- 游戏里实现碰撞检测方法
- 游戏里实现碰撞检测方法