如何在OpenGL中不使用GLUT绘制纹理环面

本文关键字:绘制 GLUT 纹理 OpenGL | 更新日期: 2023-09-27 18:13:03

我需要在OpenGL中渲染一个环面,而不使用GLUT。我使用c#和Tao框架绑定。我有下面的代码,我从这里得到的。

 private void DrawTorus() {
        int numc = 100, numt = 100;
        double TWOPI = 2 * Math.PI;
        for (int i = 0; i < numc; i++) {
            Gl.glBegin(Gl.GL_QUAD_STRIP);
            for (int j = 0; j <= numt; j++) {
                for (int k = 1; k >= 0; k--) {
                    double s = (i + k) % numc + 0.5;
                    double t = j % numt;
                    double x = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Cos(t * TWOPI / numt);
                    double y = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Sin(t * TWOPI / numt);
                    double z = 0.1 * Math.Sin(s * TWOPI / numc);
                    Gl.glVertex3d(2 * x, 2 * y, 2 * z);
                }
            }
            Gl.glEnd();
        }
    }

这段代码绘制了一个环面,但现在我需要在其上添加纹理。我试图使用这些公式的纹理坐标,但我不知道如何使用R和R(内半径和外半径分别)。

v = arccos (Y/R)/2pi
u = [arccos ((X/(R + r*cos(2pi * v))] * 2pi

在理解这段代码时遇到了一些困难,我希望能对它进行解释,或者是一个带注释的更直观的代码。

如何在OpenGL中不使用GLUT绘制纹理环面

如果我们比较公式

X = (R + r cos (2 pv)) cos (2 pu)
Y = r sin (2 pv)
Z = (R + r cos (2 pv)) sin (2 pu)
代码为 的

double x = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Cos(t * TWOPI / numt);
double y = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Sin(t * TWOPI / numt);
double z = 0.1 * Math.Sin(s * TWOPI / numc);

显然,X = X, Y = z, z = Y, R = 1, R = 0.1, 2 pv = s * TWOPI / numc2 pu = t * TWOPI / numt

v = arccos (Y/R)/2p
u = [arccos ((X/(R + r*cos(2 pv))]2p

v = arcos (z/1)/TWOPI
u = [arcos ((x/(1 + 0.1*cos(s * TWOPI / numc)]/TWOPI
编辑:老实说,我并没有努力去理解这个公式……阅读你的代码,我认为这应该是一个技巧:
u = (i + k) / (float)numc;
v = t / (float)numt;