在地形绘制的时候,把地形中每一个顶点的纹理位置在[0,64]的区间内递增,使得场景的纹理有移动的效果。
想起以前看过的一点小技巧,利用%操作符可以让值在固定区间内:
#include#include #include int main(){ int a = -3,b = 7; // [-3,7] int i =1; srand((unsigned)time(NULL)); while(i<=100){ printf("%d",rand()%(b-a + 1)+a); i%10==0?printf("\n"):printf(","); i++; } //printf("%d\n",(-2)%13); // (-2)%13 == -2 getchar(); return 0;}
上面的rand ()随机函数就是某个值的递变,例如 i++;
int k = _translation; int i = 0; for(int z = startZ; z >= endZ; z -= _cellSpacing) { int j = 0; for(int x = startX; x <= endX; x += _cellSpacing) { int index = i * _numVertsPerRow + j; v[index] = TerrainVertex( (float)x, (float)_heightmap[index], (float)z, (float)j * uCoordIncrementSize, (float)k * vCoordIncrementSize); not i but k j++; } i++; k = (k++)%64; }
上面的_translation是下面的rollingDecrease控制递增:
void Terrain::rollingDecr(){ computeVertices(); _translation = (_translation++)%64;}
纹理滚动:
还有一种确保某个值在固定区间的计数方法:
int i; //不需要在i输入的时候控制i值的范围i = max( 0, min( 100 , i ) ); //[0,100]
处理完键盘的消息后,加上下面的函数,
使得Camera的x与z值不超出 _lefttop,_rightdown两点位置的X和Z值
void Camera::postionAdjust(){ _pos.x = max(_lefttop.x, min(_rightdown.x,_pos.x)); //_pos.y = max(_lefttop.y, min(_rightdown.y,_pos.y)); _pos.z = max(_lefttop.z, min(_rightdown.z,_pos.z));}
然后接下来地形根据Camera的x和z值来获取高度数据,此时x,z值不会超出地形之外,
索引index = i * numVertexsPerRow + j;的计算不会是数组下表超出范围,产生例如:"vector subscript out of range"内存错误
原图: