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