Как нарисовать текстурированный тор в OpenGL без использования GLUT?
Мне нужно визуализировать тор в OpenGL, без использования GLUT. Я использую привязки C# и Tao Framework. У меня есть следующий код, который я получил отсюда.
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
Имея некоторые проблемы с пониманием этого кода, я был бы признателен за объяснение этого или, возможно, альтернативный, более интуитивный код с комментариями. Любая помощь будет высоко ценится.
1 ответ
Если мы сравним формулу
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.)