gpt4 book ai didi

c++ - 旋转点openGL

转载 作者:行者123 更新时间:2023-11-28 05:34:44 24 4
gpt4 key购买 nike

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

cilinder ply

修改方法 rotate 后我的代码是:

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);
}
}
}

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

最佳答案

您似乎不清楚原始曲线所在的坐标系,以及如何对其应用旋转。使用您当前的代码,您只需将点旋转一个可变的量,但将它们全部保持在同一平面内。从表面上看代码就可以知道:您从未为任何点的 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 在 xz 平面内获取 x 和 z 的新值。形状的输入点 (x, y) 的新坐标 (x', y', z') 为:

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);
}
}

关于c++ - 旋转点openGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com