原文: https://paroj.github.io/gltut/
第三章 opengl移动三角形这章会讲述如何移动对象。会引入新的着色器相关的技术。
移动点也许能够想到的移动三角形或其他对象最简单的方法是直接改变顶点的数据。从前面的章节中,我们学习了顶点数据是存储在缓存对象中的。于是,更改数据,就是更改缓存区中的数据。cpu_position_offset.cpp就是这么实现的。
整个更改通过了两个过程完成的。首先,针对每个点生成x,y的偏移量,然后将偏移量赋值到每一个点的位置。偏移量的生成ComputePositionOffset。
Example 3.1 Computation of Position Offsets
1 2 3 4 5 6 7 8 9101112void ComputePositionOffsets(float &fXOffset, float &fYOffset){const float fLoopDuration = 5.0f;const float fScale = 3.14159f * 2.0f / fLoopDuration;float fElapsedTime = glutGet(GLUT_ELAPSED_TIME)/1000.0f;float fCurrTimeThroughLoop = fmodf(fElapsedTime, fLoopDuration);fXOffset = cosf(fCurrTimeThroughLoop*fScale)*0.5f;fYOffset = sinf(fCurrTimeThroughLoop*fscale)*0.5f;}上述计算得到的偏移量可以产生环状运动,而且在每隔5s,偏移量会回到原来的值(通过fLoopDuration控制)。函数glutGet(GLUT_ELAPSED_TIME)用来获取程序开始时,以毫秒为单位的整数时间。fmodf用来计算时间的浮点型模。因此,该函数返回值的范围为[0,fLoopDuration)。
一旦求得偏移量,偏移量将会被加到顶点坐标中。
Example 3.2 Adjusting the Vertex Data
1 2 3 4 5 6 7 8 9101112131415void AdjustVertexData(float fXOffset, float fYOffset){std::vector fNewData(ARRAY_COUNT(vertexdPositions));memcpy(&fNewData[0], vertexPositions, sizeof(vertexPositions));for (int iVertex=0; iVertex