gpt4 book ai didi

c++ - 在 OpenGL 中绘制斯坦纳罗马曲面

转载 作者:行者123 更新时间:2023-11-30 04:32:18 25 4
gpt4 key购买 nike

我试图在 OpenGL 中绘制 Steiner 的罗马曲面,但在获得正确的法线以使曲面正确亮起时遇到了一些问题。我使用了维基百科的参数方程:http://en.wikipedia.org/wiki/Roman_surface .对于法线,我先对 theta 进行偏微分,然后对 phi 进行偏微分,然后对偏微分求得法线。

这不允许表面正确点亮,因为罗马表面是不可定向的表面。因此,我想知道是否有办法得到正确的法线,以便表面可以正确点亮。我试过对整个表面和部分表面的法线取反(对 n 的第一个和最后一个四分之一取反),但它似乎不起作用。

我目前的代码如下:

double getRad(double deg, double n){
return deg * M_PI / n;
}

int n = 24;

for(int i = 0; i < n; i++){
for(int j = 0; j < 2*n; j++){

glBegin(GL_POLYGON);

double x = -pow(r,4) * cos(2*getRad(i+0.5,n)) * pow(cos(getRad(j+0.5,n)),2) * cos(2*getRad(j+0.5,n)) * sin(getRad(i+0.5,n)) - 2 * pow(r,4) * pow(cos(getRad(i+0.5,n)),2) * pow(cos(getRad(j+0.5,n)),2) * sin(getRad(i+0.5,n)) * pow(sin(getRad(j+0.5,n)),2);
double y = pow(r,4) * cos(getRad(i+0.5,n)) * cos(2*getRad(i+0.5,n)) * pow(cos(getRad(j+0.5,n)),2) * cos(2*getRad(j+0.5,n)) - 2 * pow(r,4) * cos(getRad(i+0.5,n)) * pow(cos(getRad(j+0.5,n)),2) * pow(sin(getRad(i+0.5,n)),2) * pow(sin(getRad(j+0.5,n)),2);
double z = -pow(r,4) * pow(cos(getRad(i+0.5,n)),2) * cos(getRad(j+0.5,n)) * cos(2*getRad(j+0.5,n)) * sin(getRad(j+0.5,n)) - pow(r,4) * cos(getRad(j+0.5,n)) * cos(2*getRad(j+0.5,n)) * pow(sin(getRad(i+0.5,n)),2) * sin(getRad(j+0.5,n));



glNormal3d(x, y, z);
glVertex3d(r*r*cos(getRad(i,n))*cos(getRad(j,n))*sin(getRad(j,n)),r*r*sin(getRad(i,n))*cos(getRad(j,n))*sin(getRad(j,n)),r*r*cos(getRad(i,n))*sin(getRad(i,n))*cos(getRad(j,n))*cos(getRad(j,n)));
glVertex3d(r*r*cos(getRad(i+1,n))*cos(getRad(j,n))*sin(getRad(j,n)),r*r*sin(getRad(i+1,n))*cos(getRad(j,n))*sin(getRad(j,n)),r*r*cos(getRad(i+1,n))*sin(getRad(i+1,n))*cos(getRad(j,n))*cos(getRad(j,n)));
glVertex3d(r*r*cos(getRad(i+1,n))*cos(getRad(j+1,n))*sin(getRad(j+1,n)),r*r*sin(getRad(i+1,n))*cos(getRad(j+1,n))*sin(getRad(j+1,n)),r*r*cos(getRad(i+1,n))*sin(getRad(i+1,n))*cos(getRad(j+1,n))*cos(getRad(j+1,n)));
glVertex3d(r*r*cos(getRad(i,n))*cos(getRad(j+1,n))*sin(getRad(j+1,n)),r*r*sin(getRad(i,n))*cos(getRad(j+1,n))*sin(getRad(j+1,n)),r*r*cos(getRad(i,n))*sin(getRad(i,n))*cos(getRad(j+1,n))*cos(getRad(j+1,n)));
glEnd();

glFlush();

}
}

最佳答案

如果您要处理不可定向的表面(如施泰纳的罗马人或著名的莫比乌斯带),您必须采取以下措施:启用双面照明

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

或者您启用面剔除并使用两个 channel (正面和背面)渲染表面 – 您必须取消背面 channel 的法线。

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); // backside faces are NOT rendered
draw_with_positive_normals();
glCullFace(GL_FRONT);
draw_with_negative_normals();

关于c++ - 在 OpenGL 中绘制斯坦纳罗马曲面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770543/

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