Построение осей 3d(xyz) для сферы

читаю http://www.esate.ru/page/initsializatsiya-opengl-v-c-sharp

И немного решил поиграться с
/*http://esate.ru, rembo*/

        Gl.glRotated(antX, antY, antZ, 0);


немного не понимаю как она крутиться. Запутался.

Скажите как грамотно модернизировать
/*http://esate.ru, rembo*/

// обработчик кнопки "визуализировать" 
private void button1_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);

Gl.glPushMatrix();
Gl.glTranslated(0,0,-6);
Gl.glRotated(45, 1, 1, 0);

// рисуем сферу с помощью библиотеки FreeGLUT 
Glut.glutWireSphere(2, 32, 32);

Gl.glPopMatrix();
Gl.glFlush();
AnT.Invalidate();
}


чтобы ещё рисовались оси (xyz).
Спасибо
0       2262        22.10.2010        21

0  
23.10.2010 00:00:00
Gl.glRotated(45, 1, 1, 0);
Крутит сцену, а не шар.
45-на сколько градусов
1,1,0
говорит по каким осям вращать сцену. В нашем случае по оси X,Y
В итоге сцена поворачивается на 45 градусов по оси X,Y
Ось X-горизонтальная
Ось Y-вертикальная
Ось Z-глубина
0  
23.10.2010 00:00:00
Для того, чтобы нарисовать оси XYZ, нужно знать математику.
Точно сказать не могу, но помню єто:
x1=xCenter+(radius*sin(45))
y1=yCenter+(radius*cos(45))
0  
23.10.2010 00:00:00
Я тут подумал…
После рисования сферы пиши это.

Gl.glBegin(Gl.GL_LINES);
Gl.glColorf(1,0,0);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(1,0,0);//X
Gl.glColorf(0,1,0);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,1,0);//Y
Gl.glColorf(0,0,1);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,0,1);//Z
Gl.glEnd();
0  
23.10.2010 00:00:00
int Draw(int antX, int antY, int antZ)
{

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);

Gl.glPushMatrix();
Gl.glTranslated(0, 0, -6);
Gl.glRotated(antX, antY, antZ, 0);
Gl.glScaled(1, 2, 1);

// рисуем сферу с помощью библиотеки FreeGLUT
Glut.glutSolidSphere(1, 32, 32);

Gl.glPopMatrix();
Gl.glFlush();
AnT.Invalidate();

Gl.glBegin(Gl.GL_LINES);
Gl.glColor3f(1, 0, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(1, 0, 0);//X
Gl.glColor3f(0, 1, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, 1, 0);//Y
Gl.glColor3f(0, 0, 1);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, 0, 1);//Z
Gl.glEnd();

return 0;
}

так не рисует. Перед инвалидейтом код ставлю тоже прорисовывает оси.
Gl.glRotated(45, 1, 1, 0);
Крутит сцену, а не шар.упс. сцену мне не надо.
0  
23.10.2010 00:00:00
так не рисует. Перед инвалидейтом код ставлю тоже прорисовывает оси.не прорисовывает*
0  
23.10.2010 00:00:00
Gl.glRotated(antX, antY, antZ, 0);
неправильно

Gl.glRotated(angle ,antX, antY, antZ);
вот так вот должно быть

и сфура у тебя кстати поворачивается по своей оси!!! если понимаеш что такое матрицы
x1=xCenter+(radius*sin(45))
y1=yCenter+(radius*cos(45))
это полный бред

если тебе надо что бы у тебя ворочалась сцена то надо после
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);//это сдесь писать не надо, пиши лучше в инициализацию
писать
Gl.glRotated(angle, x, y, z);
Gl.glTranslated(x, y, z);
и менять эти значения, тогда у тебя будет ворочатся и перемещатся сцена

если тебе надо ворочать объект то пиши после того как откроешь матрицу, если что пиши в ЛС отпишу подробнее
0  
23.10.2010 00:00:00
Ему нужно нарисовать оси, а не перемещать и поворачивать сцену.

// обработчик кнопки "визуализировать"
private void button1_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);
Gl.glPushMatrix();
Gl.glRotated(45, 1, 1, 0);
Gl.glBegin(Gl.GL_LINES);
Gl.glColorf(1,0,0);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(100,0,0);//X
Gl.glColorf(0,1,0);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,100,0);//Y
Gl.glColorf(0,0,1);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,0,100);//Z
Gl.glEnd();
Gl.glTranslated(0,0,-6);
Glut.glutWireSphere(2, 32, 32);
Gl.glPopMatrix();
Gl.glFlush();
AnT.Invalidate();
}
0  
23.10.2010 00:00:00
извените за ошибку, glColorf должно быть glColor3f
0  
23.10.2010 00:00:00
спасибо, что помогаете разобраться. Лучше был бы форум конечно. Удобней было бы писать.Вот что получилось(сферу изменил на цилиндр, не суть важно)



как я понимаю ось Х это горизонтальная, У — вертикальная. А z не нарисовалась как то. И ещё какой то странный эффект.
у меня
Gl.glRotated(45, antX, antY, antZ);
эти переменные изменяются в зависимости от значений trackBar.Value как видно на картинке. Когда запускаю программу. они все в нуле. Начинаю двигать Х и он как бы рывками перемешает туда сюда. Потом начинаю по У и он плавно начинает двигать…
0  
23.10.2010 00:00:00
ты делай лучше не так
пиши поворот так:

Gl.glRotated(rotX, 1, 0, 0);
Gl.glRotated(rotY, 0, 1, 0);
Gl.glRotated(rotZ, 0, 0, 1);

и меняй значения rotX,Y,Z
тогда все нормально должно быть

и еще тебе надо где рисовать оси, в центре координат или в центре объекта??
0  
23.10.2010 00:00:00
в paint немного дорисовал.
Я бы хотел чтобы такие оси появились ещё


Gl.glColorf(0,0,1);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,0,100);//Z
ось Z почему то не нарисовалась(в программе), на картинке(в пеинте дорисовал её). Ну это как бы я хотел.

Кстати спасибо за
Gl.glRotated(rotX, 1, 0, 0);
Gl.glRotated(rotY, 0, 1, 0);
Gl.glRotated(rotZ, 0, 0, 1);
действительно намного понятней.
0  
23.10.2010 00:00:00
У вас получилось или еще нужна помощь?
0  
24.10.2010 00:00:00
Попробуй сделать ось Z так:

Gl.glColor3f(0,0,1);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,0,-100);//Z

ЗЫ. Может ось Z лежит в центре фигуры????????
И кстати, рисование осей, долно происходить после Rotated, но перед Translated!
0  
24.10.2010 00:00:00
тогда, оси будут рисоваться в начале координат. Но советую тогда ещё воспользоваться

Glu.gluLookAt(X,Y,Z,направлX,направлY,направлZ,0,1,0);

для изменения позиции камеры, потому, что в начале камера стоин на позиции 0,0,0 — это в том же месте, где начинаются лучи отрезки лучей
0  
21.02.2011 00:00:00
основываясь на выше написанном, попробовал реализовать оси, но при запуске ничего абсолютно не происходит. помогите, мне нужно чтобы при загрузке формы появлялись три оси.
0  
21.02.2011 00:00:00
glRotatef(angleX,1,0,0);
glRotatef(angleY,0,1,0);
glRotatef(angleZ,0,0,1);
glBegin(GL_LINES);
glColor3f(0,0,1);
glVertex3f(0,0,0);
glVertex3f(-100,0,0);
glColor3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(0,-100,0);
glColor3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(0,0,-100);
glEnd();
0  
21.02.2011 00:00:00
прописал, но все равно ничего не происходит.
во что у меня есть
private void Form1_Load(object sender, EventArgs e)
{
//иницализация библиотеки Glut
Glut.glutInit();
//установка порта вывода с соответствиb размерам элемента ant
Gl.glViewport(0, 0, ant.Width, ant.Height);

/*Функция glMatrixMode предназначена для того, чтобы задавать
матричный режим: будет определена матрица, над которой мы в дальнейшем будем производить операции.
В нашем случае это GL_PROJECTION – матрица проекций.**/
Gl.glMatrixMode(Gl.GL_PROJECTION);
//функция заменяет текущую матрицу на единичную
Gl.glLoadIdentity();
//устанавливаем тип текущей проекции
/*строит пирамиду охвата видимости, основываясь на угле визуального охвата,
отношении сторон порта просмотра и установке ближней и дальней плоскости просмотра*/
Glu.gluPerspective(45, (float)ant.Width/(float)ant.Height, 0.1, 200);

//станавливаем в качестве текущей матрицы - объектно-видовую матрицу и очищаем ее.
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();

// начальные настройки OpenGL
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);

// инициализация библиотеки openIL
Il.ilInit();
Il.ilEnable(Il.IL_ORIGIN_SET);
//Gl.glLineWidth(2.0f);

Gl.glRotatef(0, 1, 0, 0);
Gl.glRotatef(0, 0, 1, 0);
Gl.glRotatef(180, 0, 0, 1);
Gl.glBegin(Gl.GL_LINE);
Gl.glColor3f(0, 0, 1);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(-100, 0, 0);
Gl.glColor3f(0, 1, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, -100, 0);
Gl.glColor3f(1, 0, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, 0, -100);
Gl.glEnd();
Gl.glTranslated(0, 0, -6);


ant.Invalidate();
Gl.glEnd();
}
0  
22.02.2011 00:00:00
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

// очитка окна
Gl.glClearColor(255, 255, 255, 1);

// установка порта вывода в соотвествии с размерами элемента anT
Gl.glViewport(0, 0, Render.Width, Render.Height);

// настройка проекции
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(45, (float)Render.Width / (float)Render.Height, 0.1, 200);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();

// настройка параметров OpenGL для визуализации
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();

Glu.gluLookAt(-20, -20, -20, 0, 0, 0, 0, 1, 0);

Gl.glPushMatrix();
Gl.glRotatef(0, 1, 0, 0);
Gl.glRotatef(0, 0, 1, 0);
Gl.glRotatef(30, 0, 0, 1);
Gl.glLineWidth(1.0f);
Gl.glBegin(Gl.GL_LINES);
Gl.glColor3f(0, 0, 1);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(-10, 0, 0);
Gl.glColor3f(0, 1, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, -10, 0);
Gl.glColor3f(1, 0, 0);
Gl.glVertex3f(0, 0, 0);
Gl.glVertex3f(0, 0, -10);
Gl.glEnd();

Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);

Glut.glutSolidTeapot(2);

Gl.glPopMatrix();
Gl.glFlush();
Render.Invalidate();
0  
29.10.2011 00:00:00
У меня не рисует ось Z. Можно конечно нарисовать просто линию в ту сторону используя х и у координати, но… Наверное программа не реагирует на координату z вообще ни в одной линии. Что это может быть? заранее спасибо.
0  
30.10.2011 00:00:00
в коде выше всё рисовало. Может не правильно инициализирован огл
0  
12.05.2012 00:00:00
Да, будет!.. Счас учёба закончиться, то напишу парочку
^