首页 > 代码库 > 好代码(一)
好代码(一)
摘自《OpenGL游戏编程》中的一段代码,根据坐标系当前点的位置(高度必须由计算得来,不是通过获取坐标点就能做到的)获得插值高度,是一种比较好的一种思想:
/** 获得地面当前点的插值高度 */
float getAveHeight(float x,float z)
{
float CameraX, CameraZ;
CameraX = x / m_nCellWidth;
CameraZ = z / m_nCellWidth;
/** 计算高程坐标(Col0, Row0),(Col1, Row1) */
int col0 = int(CameraX);
int row0 = int(CameraZ);
unsigned int col1 = col0 + 1;
unsigned int row1 = row0 + 1;
/** 确保单元坐标不超过高程以外 */
if (col1 > m_nWidth) col1 = 0;
if (row1 > m_nWidth) row1 = 0;
/** 获取单元的四个角的高度 */
float h00 = (float)(m_pHeightMap[col0*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
float h01 = (float)(m_pHeightMap[col1*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
float h11 = (float)(m_pHeightMap[col1*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);
float h10 = (float)(m_pHeightMap[col0*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);
/** 计算机摄像机相对于单元格的位置 */
float tx = CameraX - int(CameraX);
float ty = CameraZ - int(CameraZ);
/** 进行双线性插值得到地面高度 */
float txty = tx * ty;
float final_height = h00 * (1.0f - ty - tx + txty)
+ h01 * (tx - txty)
+ h11 * txty
+ h10 * (ty - txty);
return final_height;
}
float getAveHeight(float x,float z)
{
float CameraX, CameraZ;
CameraX = x / m_nCellWidth;
CameraZ = z / m_nCellWidth;
/** 计算高程坐标(Col0, Row0),(Col1, Row1) */
int col0 = int(CameraX);
int row0 = int(CameraZ);
unsigned int col1 = col0 + 1;
unsigned int row1 = row0 + 1;
/** 确保单元坐标不超过高程以外 */
if (col1 > m_nWidth) col1 = 0;
if (row1 > m_nWidth) row1 = 0;
/** 获取单元的四个角的高度 */
float h00 = (float)(m_pHeightMap[col0*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
float h01 = (float)(m_pHeightMap[col1*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
float h11 = (float)(m_pHeightMap[col1*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);
float h10 = (float)(m_pHeightMap[col0*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);
/** 计算机摄像机相对于单元格的位置 */
float tx = CameraX - int(CameraX);
float ty = CameraZ - int(CameraZ);
/** 进行双线性插值得到地面高度 */
float txty = tx * ty;
float final_height = h00 * (1.0f - ty - tx + txty)
+ h01 * (tx - txty)
+ h11 * txty
+ h10 * (ty - txty);
return final_height;
}
=============
float tx = CameraX - int(CameraX);
float ty = CameraZ - int(CameraZ);
float ty = CameraZ - int(CameraZ);
实际上CameraX 和CameraZ 是两个浮点数,通过此种方式即可获得“计算机摄像机相对于单元格的位置”,之后通过“双线性插值”获得地面相对于坐标系原点的高度。
好代码(一)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。