我试图通过革命从图层中读取图形的轮廓来生成数字。我按照here和其他类似问题的步骤,但我的问题仍然存在。当我尝试用一个只有2个点36个踩踏板来旋转一个Ply时,如果我将camara放在顶部的cilinder上,我就会得到这个:
旋转方法修改后的代码是:
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);
}
}
}
我找不到我的错误。欢迎提供一些帮助。
答案 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);
}
}