我需要在OpenGL中渲染一个圆环,而不使用GLUT。我正在使用C#和Tao Framework绑定。我有以下代码,我从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
在理解代码时遇到一些麻烦,我会很感激它的解释,或者可能是一个替代的,更直观的代码和注释。任何帮助将不胜感激。
答案 0 :(得分:3)
如果我们比较公式
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
和2 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;
(你可能需要交换你和v。)