c# - 如何在不使用 GLUT 的情况下在 OpenGL 中绘制带纹理的环面?

标签 c# opengl texture-mapping tao-framework

我需要在不使用 GLUT 的情况下在 OpenGL 中渲染环面。我正在使用 C# 和 Tao Framework 绑定(bind)。我有以下代码,是从 here 获得的.

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

此代码绘制了一个环面,但现在我需要在其上放置纹理。我正在尝试使用 these纹理坐标的公式,但我无法弄清楚 R 和 r(分别为内半径和外半径)使用什么。

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

在理解该代码时遇到了一些困难,我希望能对其进行解释,或者可能是带有注释的更直观的替代代码。任何帮助将不胜感激。

最佳答案

如果我们比较公式

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/numc and 2 pu = t * TWOPI/数。然后

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;

(你可能需要交换 u 和 v。)

关于c# - 如何在不使用 GLUT 的情况下在 OpenGL 中绘制带纹理的环面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7966362/

相关文章:

c# - Ninject 绑定(bind)不同的实现

c# - 将Web服务迁移到.NET Core 2.0并返回json

javascript - Three.js 使用 THREE.TextureLoader 重复纹理

c++ - 纹理不会出现 - GLUT OpenGL

c++ - 使用 SOIL 使用 OpenGL 映射纹理

javascript - 设置多个文件上传的验证

javascript - 如何使用 javascript 调用代码隐藏函数?

尝试在 Eclipse 中运行时 LWJGL 中出现 java.lang.NoClassDefFoundError

OpenGL:将鼠标点击投影到几何体上

c++ - GL_R32I TexImage2D 上传不正确