【问题标题】:Opengl Translate/Rotate single Objects from same BufferOpengl 翻译/旋转来自同一缓冲区的单个对象
【发布时间】:2018-03-29 20:22:48
【问题描述】:

我尝试在 C + OpenGL 3.3 中编写一个简单的工业机器人手臂。我在单个缓冲区元素(顶点、索引和颜色缓冲区)中设置了 3 个简单模型,我可以旋转/平移整个东西。但是,我无法翻译/旋转单个部分。

顶点数据保存在 HEADER 文件中。红色段称为“base”,蓝色为“seg1”,绿色为“seg2”。我像这样将它们加载到缓冲区中。

size = sizeof(base_verticies) + sizeof(seg1_verticies) + sizeof(seg2_verticies);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(base_verticies), base_verticies);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(base_verticies), sizeof(seg1_verticies), seg1_verticies);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(base_verticies)+sizeof(seg1_verticies), sizeof(seg2_verticies), seg2_verticies);

size = sizeof(base_indices) + sizeof(seg1_indices) + sizeof(seg2_indices);
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, 0, GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(base_indices), base_indices);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, sizeof(base_indices), sizeof(seg1_indices), seg1_indices);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, sizeof(base_indices)+sizeof(seg1_indices), sizeof(seg2_indices), seg2_indices);

size = sizeof(base_colors) + sizeof(seg1_colors) + sizeof(seg2_colors);
glGenBuffers(1, &CBO);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_STATIC_DRAW);
glBufferSubData( ... ); ...; // same for colors

我现在可以像这样单独绘制这些部分

//base (red)
glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0); 
//seg1 (blue)
glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)sizeof(base_indices));
//seg2 (green)
glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)(sizeof(base_indices)+sizeof(seg1_indices)));

但我的问题是,我只能旋转和翻译整个内容,而不是单个部分。我确实像这样在onIdle() 函数中旋转整个模型:

float angle = 1;
float RotationMatrixAnim[16];
SetRotationY(angle, RotationMatrixAnim);

/* Apply model rotation */
MultiplyMatrix(RotationMatrixAnim, InitialTransform, ModelMatrix);
MultiplyMatrix(TranslateDown, ModelMatrix, ModelMatrix);
  1. 有没有办法修改单个句段的位置、翻译、...?我发现的唯一教程来自带有 glPushMatrix()glPopMatrix 的旧版 OpenGL,它们已被弃用。

  2. 将这些 Segment 存储在同一个缓冲区中是否是个好主意?

提前感谢您的帮助和宝贵的时间。

【问题讨论】:

    标签: c opengl-3


    【解决方案1】:

    感谢 @Rabbid76 的建议,我能够解决我的问题。

    1. 我制作了 3 个模型矩阵,每个部分一个

      float ModelMatrix[3][16]; /* Model matrix */
      
    2. 我像这样旋转/翻译我想要的部分

      float RotationMatrixSeg2[16];
      SetRotationY(angle, RotationMatrixSeg2);
      
      MultiplyMatrix(RotationMatrixSeg2, InitialTransform, ModelMatrix[2]);
      MultiplyMatrix(TranslateDown, ModelMatrix[2], ModelMatrix[2]);
      
    3. 我在绘制截面之前设置了对应的ModelMatrix

      /* Draw each section */
      glUniformMatrix4fv(RotationUniform, 1, GL_TRUE, ModelMatrix[0]);
      glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0); 
      
      glUniformMatrix4fv(RotationUniform, 1, GL_TRUE, ModelMatrix[1]);
      glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)sizeof(base_indices));
      
      glUniformMatrix4fv(RotationUniform, 1, GL_TRUE, ModelMatrix[2]);
      glDrawElements(GL_TRIANGLES, sizeof(base_indices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)(sizeof(base_indices)+sizeof(seg1_indices)));
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多