在地形绘制的时候,把地形中每一个顶点的纹理位置在[0,64]的区间内递增,使得场景的纹理有移动的效果。
想起以前看过的一点小技巧,利用%操作符可以让值在固定区间内:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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"内存错误
原图: