Построение осей 3d(xyz) для сферы
читаю
И немного решил поиграться с
немного не понимаю как она крутиться. Запутался.
Скажите как грамотно модернизировать
чтобы ещё рисовались оси (xyz).
Спасибо
И немного решил поиграться с
|
немного не понимаю как она крутиться. Запутался.
Скажите как грамотно модернизировать
|
чтобы ещё рисовались оси (xyz).
Спасибо
5115
22.10.2010
21



.
Крутит сцену, а не шар.
45-на сколько градусов
1,1,0
говорит по каким осям вращать сцену. В нашем случае по оси X,Y
В итоге сцена поворачивается на 45 градусов по оси X,Y
Ось X-горизонтальная
Ось Y-вертикальная
Ось Z-глубина
Точно сказать не могу, но помню єто:
x1=xCenter+(radius*sin(45))
y1=yCenter+(radius*cos(45))
После рисования сферы пиши это.
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();
{
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);
Крутит сцену, а не шар.упс. сцену мне не надо.
неправильно
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);
и менять эти значения, тогда у тебя будет ворочатся и перемещатся сцена
если тебе надо ворочать объект то пиши после того как откроешь матрицу, если что пиши в ЛС отпишу подробнее
// обработчик кнопки "визуализировать"
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();
}
как я понимаю ось Х это горизонтальная, У — вертикальная. А z не нарисовалась как то. И ещё какой то странный эффект.
у меня
Gl.glRotated(45, antX, antY, antZ);
эти переменные изменяются в зависимости от значений trackBar.Value как видно на картинке. Когда запускаю программу. они все в нуле. Начинаю двигать Х и он как бы рывками перемешает туда сюда. Потом начинаю по У и он плавно начинает двигать…
пиши поворот так:
Gl.glRotated(rotX, 1, 0, 0);
Gl.glRotated(rotY, 0, 1, 0);
Gl.glRotated(rotZ, 0, 0, 1);
и меняй значения rotX,Y,Z
тогда все нормально должно быть
и еще тебе надо где рисовать оси, в центре координат или в центре объекта??
Я бы хотел чтобы такие оси появились ещё
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);
действительно намного понятней.
Gl.glColor3f(0,0,1);
Gl.glVertex3f(0,0,0);
Gl.glVertex3f(0,0,-100);//Z
ЗЫ. Может ось Z лежит в центре фигуры????????
И кстати, рисование осей, долно происходить после Rotated, но перед Translated!
Glu.gluLookAt(X,Y,Z,направлX,направлY,направлZ,0,1,0);
для изменения позиции камеры, потому, что в начале камера стоин на позиции 0,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();
во что у меня есть
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();
}
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();