1.顶点依次移动

定义边长和顶点数据

  1. //blockSize 边长
  2. GLfloat blockSize = 0.1f;
  3. //正方形的4个点坐标
  4. GLfloat vVerts[] = {//x,y,z
  5. -blockSize,-blockSize,0.0f, //A
  6. blockSize,-blockSize,0.0f, //B
  7. blockSize,blockSize,0.0f, //C
  8. -blockSize,blockSize,0.0f //D
  9. };

以顶点D为例,依次移动每个顶点

image.png

  1. void SpecialKeys(int key, int x, int y){
  2. GLfloat stepSize = 0.025f;
  3. //最后一个顶点D
  4. GLfloat blockX = vVerts[0];//vVerts[0]和vVerts[9]相同
  5. GLfloat blockY = vVerts[10];
  6. if (key == GLUT_KEY_UP) {
  7. blockY += stepSize;
  8. }
  9. if (key == GLUT_KEY_DOWN) {
  10. blockY -= stepSize;
  11. }
  12. if (key == GLUT_KEY_LEFT) {
  13. blockX -= stepSize;
  14. }
  15. if (key == GLUT_KEY_RIGHT) {
  16. blockX += stepSize;
  17. }
  18. //触碰到边界(4个边界)的处理
  19. //当正方形移动超过最左边的时候
  20. if (blockX < -1.0f) {
  21. blockX = -1.0f;
  22. }
  23. //当正方形移动到最右边时
  24. //1.0 - blockSize * 2 = 总边长 - 正方形的边长 = 最左边点的位置
  25. if (blockX > (1.0 - blockSize * 2)) {
  26. blockX = 1.0f - blockSize * 2;
  27. }
  28. //当正方形移动到最下面时
  29. //-1.0 - blockSize * 2 = Y(负轴边界) - 正方形边长 = 最下面点的位置
  30. if (blockY < -1.0f + blockSize * 2 ) {
  31. blockY = -1.0f + blockSize * 2;
  32. }
  33. //当正方形移动到最上面时
  34. if (blockY > 1.0f) {
  35. blockY = 1.0f;
  36. }
  37. // 计算每个顶点的位置
  38. vVerts[0] = blockX;
  39. vVerts[1] = blockY - blockSize*2;
  40. vVerts[3] = blockX + blockSize*2;
  41. vVerts[4] = blockY - blockSize*2;
  42. vVerts[6] = blockX + blockSize*2;
  43. vVerts[7] = blockY;
  44. vVerts[9] = blockX;
  45. vVerts[10] = blockY;
  46. triangleBatch.CopyVertexData3f(vVerts);
  47. glutPostRedisplay();
  48. }

顶点比较少的话,还能接受,如果是个复杂图形,顶点贼多,这种方法显然不好,我们用矩阵方式来移动

2.矩阵方式移动

定义移动移动距离(可看作中心点)

  1. // 在x轴上平移的距离
  2. GLfloat xPos = 0.0f;
  3. // 在y轴上平移的距离
  4. GLfloat yPos = 0.0f;

绘制的代码

  1. void RenderScene(void) {
  2. /*
  3. 清除一个或者一组特定的缓存区
  4. 缓冲区是一块存在图像信息的储存空间,红色、绿色、蓝色和alpha分量通常一起分量通常一起作为颜色缓存区或像素缓存区引用。
  5. OpenGL 中不止一种缓冲区(颜色缓存区、深度缓存区和模板缓存区)
  6. GL_COLOR_BUFFER_BIT :指示当前激活的用来进行颜色写入缓冲区
  7. GL_DEPTH_BUFFER_BIT :指示深度缓存区
  8. GL_STENCIL_BUFFER_BIT:指示模板缓冲区
  9. */
  10. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  11. //2.设置一组浮点数来表示颜色(RGBA)
  12. GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};
  13. //定义矩阵
  14. M3DMatrix44f mFinalTransform,mTransfromMatrix,mRotationMartix;
  15. //平移矩阵
  16. m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);
  17. //每次平移时,旋转5度
  18. static float yRot = 0.0f;
  19. yRot += 5.0f;
  20. //旋转矩阵
  21. m3dRotationMatrix44(mRotationMartix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f);
  22. //将旋转和移动的矩阵结果 合并到mFinalTransform (矩阵相乘)
  23. m3dMatrixMultiply44(mFinalTransform, mTransfromMatrix, mRotationMartix);
  24. //将矩阵结果 提交给固定着色器(平面着色器)中绘制
  25. shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed);
  26. triangleBatch.Draw();
  27. //执行交换缓存区
  28. glutSwapBuffers();
  29. }

移动的代码

  1. void SpecialKeys(int key, int x, int y){
  2. // 移动的步长
  3. GLfloat stepSize = 0.025f;
  4. if (key == GLUT_KEY_UP) {
  5. yPos += stepSize;
  6. }
  7. if (key == GLUT_KEY_DOWN) {
  8. yPos -= stepSize;
  9. }
  10. if (key == GLUT_KEY_LEFT) {
  11. xPos -= stepSize;
  12. }
  13. if (key == GLUT_KEY_RIGHT) {
  14. xPos += stepSize;
  15. }
  16. //碰撞检测
  17. if (xPos < (-1.0f + blockSize)) {
  18. xPos = -1.0f + blockSize;
  19. }
  20. if (xPos > (1.0f - blockSize)) {
  21. xPos = 1.0f - blockSize;
  22. }
  23. if (yPos < (-1.0f + blockSize)) {
  24. yPos = -1.0f + blockSize;
  25. }
  26. if (yPos > (1.0f - blockSize)) {
  27. yPos = 1.0f - blockSize;
  28. }
  29. // 提交重绘
  30. glutPostRedisplay();
  31. }