| Привет всем! нужна небольшая помощь! думаю для тех людей кто тут сидит, это будет дело плевое! У меня есть исходный год проги которая вырисовывает волос ( ну форму волоса, человека там не суть важно)! но есть одна проблема! В этом исходнике все данные там Радиус или высота и все такое расчитывается по формуле и следовательно волос ровный получается симметричный!
Я мне по заданию нужно сделать кроличий волос, а он в разрезе имеет разный радиус ( ну не ровный целиндор т.е. а такой целиндор с буграми и все такое). Теоретически я понимаю что достаточно загнать редомы на высоты между всеми радиусами из готорых строится данный волос. Но вот практически не получается! Уже который час читаю инфу и все такое и методом тыка пробую! Но все впустую!
Буду очень признателен, если кто поможет!
ИСХОДНИК я эту прогу делаю в VS.net 2005 С++
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <math.h>
int alpha=0, beta=0, gamma=0;
AUX_RGBImageRec* image;
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
GLfloat mas_z[100][100][3];
GLfloat p, q;
GLfloat x, y, z, r, fi;
int i,j;
void myinit(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotated(alpha, 0,1,0);
glRotated(beta, -1,0,0);
glRotated(gamma, 0,0,1);
glScalef(10, 10, 10);
p=0.1;
q=0.1;
r=3.1;
// первое волокно
glColor3d(1,0,0); // цвет волокна - красный =)
for (i=1; i<100; i++)
{
for (j=1; j<100; j++)
{
z = float(i)/10;
fi = float(j)*6.4/99; // делаем просчет по фи от 0 до 2 пи
r = (2+0.1*cos(fi))/4+sin(z)/10; // вычисляем радиус в зависимости от угла фи и высоты Зэт
x = float(r*cos(fi));
y = float(r*sin(fi));
mas_z[i][j][1] = x;
mas_z[i][j][2] = y;
mas_z[i][j][3] = z-5;
}
}
for (j = 1; j < 100; j++)
{
glBegin (GL_LINE_STRIP);
for (i = 1; i < 100; i++)
{
glVertex3f(mas_z[i][j][1],mas_z[i][j][2],mas_z[i][j][3]);
}
glEnd();
}
for (i = 1; i < 100; i++)
{
glBegin (GL_LINE_STRIP);
for (j = 1; j < 100; j++)
{
glVertex3f(mas_z[i][j][1],mas_z[i][j][2],mas_z[i][j][3]);
}
glEnd();
}
glPopMatrix();
glFlush();
auxSwapBuffers();
}
void CALLBACK mouse(AUX_EVENTREC *event)
{
static int x0,z0,y0=-12345;
if(y0!=-12345)
{
alpha += event->data[AUX_MOUSEX] - x0;
beta += event->data[AUX_MOUSEY] - y0;
gamma += event->data[AUX_MOUSEY] - z0;
}
x0 = event->data[AUX_MOUSEX];
y0 = event->data[AUX_MOUSEY];
z0 = event->data[AUX_MOUSEY];
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w,
50.0*(GLfloat)h/(GLfloat)w, -50.0, 50.0);
else
glOrtho(-50.0*(GLfloat)w/(GLfloat)h,
50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, -50.0, 50.0);
glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
}
int main(int argc, char** argv)
{
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
auxInitPosition (0, 0, 1000, 1000);
auxInitWindow ("Bezier Curves Using Evaluators");
auxReshapeFunc (myReshape);
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, mouse);
auxMainLoop(display);
return(0);
} | |