Подскажите как нарисовать при помощи OpenGL поверхность вращения, есть параметрические уравнения для координат x(t),y(t)? Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить и вращать получившуюся картинку(по нажатию клавиш).(пишу на С++,простое приложение без использования WinAPI и MFC)
Здравствуйте, GunVan, Вы писали:
GV>Подскажите как нарисовать при помощи OpenGL поверхность вращения, есть параметрические уравнения для координат x(t),y(t)? Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить и вращать получившуюся картинку(по нажатию клавиш).(пишу на С++,простое приложение без использования WinAPI и MFC)
Вот мз моей старой ДОСовской проги. Я думаю, что ты поймешь.
Здравствуйте, GunVan, Вы писали:
GV>Подскажите как нарисовать при помощи OpenGL поверхность вращения, есть параметрические уравнения для координат x(t),y(t)? Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить и вращать получившуюся картинку(по нажатию клавиш).(пишу на С++,простое приложение без использования WinAPI и MFC)
Пусть N — количество точек на каждой окружности в поперечном сечении (XOZ).
По идее, нам нужно каждый раз поворачиваясь на угол delta=2*pi/N (вокруг оси OY) рисовать кривую, соединяя новые точки в полигоны с уже нарисованными (для предыдоцего угла).
Но каждый раз поворачивать всю кривую дабы найти координаты новых точек — слишком дорого (синусы, косинусы там всякие...).
В таком случае, я бы сначала вычислил координаты точек для одного _сегмента_ (изначальная кривая + кривая повёрнутая на угол delta), и загнал их куда-нибудь — например в дисплейный список (или vertex array). Потом стоит только поворачивать матрицу (glRotatef(delta,0,1,0) и рисовать имеюшийся сегмент! имхо так будет дешевле, тем более что результат не будет зависеть от количества точек вдоль OY (в случае же если мы поворачиваем всю кривую каждый раз — нам потребуется вызывать по 2 синуса и 2 косинуса на каждую такую точку)
Да, вычислений будет меньше, но GunVan'у ведь "Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить".
А как вы предлагаете закрашивать\текстурить фигуру полученную вашим способом ?
ИМХО лучше будет создать полноценную модель, и делать с ней что угодно. Вот здесь строится сфера и текстурится. Аналогия для случая GunVan вроде не должна быть чересчур сложной.
Re[2]: Поверхность вращения и OpenGL
От:
Аноним
Дата:
12.12.04 16:28
Оценка:
Здравствуйте, Konstantin S., Вы писали:
KS>Вот мз моей старой ДОСовской проги. Я думаю, что ты поймешь.
KS>#include <graphics.h>
...
Честно признаться мне было интересно откомпиллировать ваш пример, но вот такой библиотеки я не нашел. Увы! Может ссылочку дадите? Жаль,что без OpenGL!
C уважением и признательностью GunVan
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Konstantin S., Вы писали:
KS>>Вот мз моей старой ДОСовской проги. Я думаю, что ты поймешь.
KS>>#include <graphics.h> А> ... А>Честно признаться мне было интересно откомпиллировать ваш пример, но вот такой библиотеки я не нашел. Увы! Может ссылочку дадите? Жаль,что без OpenGL! А> C уважением и признательностью GunVan
Это ДОС-овский Borland C++, в его состав входит библиотека BGI. Если ее у Вас нет, то могу выслать.
>> Чем шире угол зрения, тем он тупее... >> RSDN@Home 1.1.4 beta 3 rev. 185 >>
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Konstantin S., Вы писали:
KS>>Вот мз моей старой ДОСовской проги. Я думаю, что ты поймешь.
KS>>#include <graphics.h> А> ... А>Честно признаться мне было интересно откомпиллировать ваш пример, но вот такой библиотеки я не нашел. Увы! Может ссылочку дадите? Жаль,что без OpenGL! А> C уважением и признательностью GunVan
А вообще, советую книжку "OPENGL для профессионалов" там все подробно расписано.
Даже как строить поверхности вращения по сплайнам. К сожалению примеров кода там нет,
так что послать исходняк не смог.
Здравствуйте, Konstantin S., Вы писали:
KS>А вообще, советую книжку "OPENGL для профессионалов" там все подробно расписано. KS>Даже как строить поверхности вращения по сплайнам. К сожалению примеров кода там нет, KS>так что послать исходняк не смог.
Прошу прощения прошлый раз забыл войти под своим именем — получился Аноним!
А вот эта книга только в бумажном варианте существует или есть возможность скачать?(можно и на английском, я уже на все готов )
Здравствуйте, GunVan, Вы писали:
GV>Здравствуйте, Konstantin S., Вы писали:
KS>>А вообще, советую книжку "OPENGL для профессионалов" там все подробно расписано. KS>>Даже как строить поверхности вращения по сплайнам. К сожалению примеров кода там нет, KS>>так что послать исходняк не смог. GV>Прошу прощения прошлый раз забыл войти под своим именем — получился Аноним! GV>А вот эта книга только в бумажном варианте существует или есть возможность скачать?(можно и на английском, я уже на все готов )
Насчет электронного варианта я не уверен. Надо в Гугле поискать. Книга называется "OPENGL для профессионалов", автор Френсис Хилл.
По-английски она называется так: "Computer Graphics Using OpenGL" (second edititon), Francis S.Hill.
Вот нашел одно задание в книге. А для этого задания приводится пример:
----------------------------------------------------------------------
6.4. Скелет подпрограммы создания каркасной модели для гладкой поверхности
void Mesh:: makeSurfaceMesh()
{
int i, j, numValsU = numValsV = 40;// set thesedouble u, v, uMin = vMin = -10.0, uMax = vMax = 10.0;
double delU = (uMax - uMin)/(numValsU - 1);
double delV = (vMax - vMin)/(numValsV - 1);
numVerts = numValsU * numValsV + 1; // total # of vertices
numFaces = (numValsU -1) * (numValsV - 1) ; // # of faces
numNorms = numVerts; // for smooth shading - one normal per vertex
pt = new Point3[numVerts]; assert(pt != NULL); // make space
face = new Face[numFaces]; assert(face != NULL);
norm = new Vector3[numNorms]; assert(norm != NULL);
for(i = 0, u = uMin; i < numValsU; i++, u += delU)
for(j = 0, v = vMin; j < numValsV; j++, v += delV)
{
int whichVert = i * numValsV + j; //index of the vertex and normal
// set this vertex: use functions X, Y, and Z
pt[whichVert].set(X(u, v),Y(u, v),Z(u, v));
// set the normal at this vertex: use functions nx, ny, nz
norm[whichVert].set(nx(u, v), ny(u, v), nz(u, v));
normalize(norm[whichVert]);
// make quadrilateralif(i > 0 && j > 0) // when to compute next face
{
int whichFace =(i - 1) * (numValsV - 1) + (j - 1);
face[whichFace].vert = new VertexID[4];
assert(face[whichFace].vert != NULL);
face[whichFace].nVerts = 4;
face[whichFace].vert[0].vertIndex = // same as norm index
face[whichFace].vert[0].normIndex = whichVert;
face[whichFace].vert[1].vertIndex =
face[whichFace].vert[1].normIndex = whichVert - 1;
face[whichFace].vert[2].vertIndex =
face[whichFace].vert[2].normIndex = whichVert - numValsV - 1;
face[whichFace].vert[3].vertIndex =
face[whichFace].vert[3].normIndex = whichVert - numValsV;
}
}
}
А вот пример из моей еще одной проги. Тут создается цилиндр.
Здравствуйте Все! Вот что получилось насчет сабжа:
GV>Подскажите как нарисовать при помощи OpenGL поверхность вращения, есть параметрические уравнения для координат x(t),y(t)? Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить и вращать получившуюся картинку(по нажатию клавиш).(пишу на С++,простое приложение без использования WinAPI и MFC)
Еще раз повторюсь человек я начинающий! принимаются замечания и предложения по улучшению и оптимизации, если такие возникнут буду рад!
#include <GL/glut.h>
#include <math.h>
#include <iostream.h>
#define PI (3.1415926)
//const GLfloat Pi=PI;//=acos(-1);
GLfloat T=2;//параметр сферы
double delta_t=0.1,delta_r=0.1;//шаги изменения
double ANGLE0=0.0,ANGLE1=2*PI;//отрезок изменения угла поворота
double T0=-2*PI,T1=2*PI;//отрезок изменения параметра t для сл1
double route_y=0;
double route_z=0;
double route_delta=0.5;
//----------------------------------------------------------------
//сл1
double xx(double t)
{
glBegin(GL_TRIANGLE_STRIP);//полоса из треугольников
for(t=T0;t<=T1;t+=delta_t)
{
curx=xx(t);//значение xx(t) в текущей точке t
cury=yy(t);//значение yy(t) в текущей точке t
curderx=xn(t);//значение xn(t) в текущей точке t
curdery=yn(t);//значение yn(t) в текущей точке t
if(t+delta_t<=T1)
{
curxst=xx(t+delta_t);//значение xx(t+delta_t) в текущей точке t
curyst=yy(t+delta_t);//значение yy(t+delta_t) в текущей точке t
curderxst=xn(t+delta_t);//значение xn(t+delta_t) в текущей точке t
curderyst=yn(t+delta_t);//значение yn(t+delta_t) в текущей точке t
}
else
{
curxst=xx(T1);
curyst=yy(T1);
curderxst=xn(T1);
curderyst=yn(T1);
}
void keys(unsigned char key, int x, int y)
{
switch (key)
{
case 'u':route_y=route_delta;break;
case 'd':route_y=-route_delta;break;
case 'l':route_z=route_delta;break;
case 'r':route_z=-route_delta;break;
case 'o':route_y=0; route_z=0;break;
}
}
//----------------------------------------------------------------
— Сильнее любви, богатства и власти —
время. Праздник жизни прекрасен. Но наступает час, и с самой лучшей
компанией приходится расставаться...
Простите что-то скрипты не сработали, поэтом текст не раскрашен, как можно было при помощи [ccode]