旋转点openGL

时间:2016-07-25 15:42:52

标签: c++ opengl

我试图通过革命从图层中读取图形的轮廓来生成数字。我按照here和其他类似问题的步骤,但我的问题仍然存在。当我尝试用一​​个只有2个点36个踩踏板来旋转一个Ply时,如果我将camara放在顶部的cilinder上,我就会得到这个:

cilinder ply

旋转方法修改后的代码是:

void Figura::rotateY(int ngiros){
//Variables de rotacion.
  //double alfa = 2*M_PI/ngiros;
  int long_perfil = vertices.size();

  vector<_vertex3f> new_vertices;

  cout << long_perfil << " vertices" << endl;

  _vertex3f aux1, aux2;
  for(int i=0; i < ngiros; i++){
     double alfa = (2*M_PI/ngiros)*i;
     for(int j=0;  j < long_perfil; j++){
         aux1 = vertices.at(j);
         aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2);
         aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0);

      vertices.push_back(aux1);
    }
  }

  //vertices.clear();
  //vertices = new_vertices;

  //caras
  for(int i=0; i < vertices.size(); i++){
     _vertex3i aux(i, i+1, i+long_perfil);
     _vertex3i aux2(i, i+long_perfil+1, i+1);
     caras.push_back(aux);
     caras.push_back(aux2);
     }
   }
}

我找不到我的错误。欢迎提供一些帮助。

1 个答案:

答案 0 :(得分:1)

您似乎不清楚原始曲线所处的坐标系,以及您如何对其应用旋转。使用当前代码,您只需将点旋转一个可变量,但将它们全部保存在同一平面内。您可以从表面上看代码来判断:您从不为任何点的y坐标设置值,因此整个结果不是3D形状,而是完全在y = 0平面中。像煎饼一样扁平......

您需要注意的另一件事是,在您仍在使用旧值时,您不会修改值:

     aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2);
     aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0);

在这里,您在第一个语句中修改aux1._0的值,而第二个语句实际上仍应使用旧值。

假设您的原始曲线位于x / y平面,并且您想围绕y轴旋转。为了获得漂亮的3D形状,曲线的所有x坐标都应为正:

     ^ y
     |
     |--
     |  \
     |   \_
     |     |   x
--------------->
     |     |
     |    /
     |   /
     | _/
     |/

将z轴指向屏幕外。

现在,要围绕y轴将此曲线旋转给定角度 alpha ,我们保持y坐标不变,并将点(x,0)旋转 alpha < / em>在xz平面内获取x和z的新值。然后,形状的输入点(x,y)的新坐标(x&#39;,y&#39;,z&#39;)为:

x' = x * cos(alpha)
y' = y
z' = x * sin(alpha)

作为代码的修改版本:

for(int i=0; i < ngiros; i++){
    double alfa = (2*M_PI/ngiros)*i;
    for(int j=0;  j < long_perfil; j++){
        aux1 = vertices.at(j);
        aux2._0 = cos(alfa) * aux1._0;
        aux2._1 = aux1._1;
        aux2._2 = sin(alfa) * aux1._0;

        vertices.push_back(aux2);
    }
}