Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Событийное вращение детали


Автор: russians 3.12.2006, 02:20
Подкиньте пожалуйста универсальный алгоритм вращения детали (любой) в трёхмере вокруг оси координат с использованием glutMouseFunc и GlutMotionFunc, чтобы можно было вставить в любой код с трёхмерной деталькой. Заранее спасибо.
PS Прошу извинить за идиотский вопрос, я пересмотрел некоторые исходники с применением этих функций, но там среди ненужных менюшных наворотов трудно разглядеть нужный алгоритм...

Автор: FIaR 3.12.2006, 14:01
Думаю ты хотел увидеть это:

Код


#include <windows.h>
#include <GL/glut.h>

GLUquadricObj *qobj;
int angleX = 0, angleY = 0;
int mouseChangeX, mouseChangeY;

void displayFunc(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(0.0, 0.0, -10.0);
  glRotatef(angleY, 0, 1, 0);
  glRotatef(angleX,-1, 0, 0);

  /* вот здесь твой любой объект */ gluSphere(qobj, 1, 12, 12);


  glutSwapBuffers();
  glutPostRedisplay();
}

void mouseFunc(char key, int x, int y)
{
         // Нажатие правой кнопки мыши
    if(key==2) angleX = angleY = 0;
}

void motionFunc(int x, int y)
{
    angleX -= (mouseChangeY-y);
    mouseChangeY = y;
    angleY -= (mouseChangeX-x);
    mouseChangeX = x;
}

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
  glutCreateWindow("");

  glutDisplayFunc(displayFunc);
  glutMouseFunc(mouseFunc);
  glutMotionFunc(motionFunc);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, 1.0, 1.0, 100.0);

  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_DEPTH_TEST);

  qobj = gluNewQuadric();

  glutMainLoop();
  return 0; 
}


Автор: Rickert 4.12.2006, 08:00
russians, а зачем тебе glutMouseFunc и GlutMotionFunc? Выбираешь ось, например X, и перед выводом детали делаешь так:
Код

...
glPushMatrix();
glTranslatef(0, sin(angle*PI/180), cos(angle*PI/180));
...//вывод детали на экран
if (angle < 360)
    angle++;
else
    angle = 0;
glPopMatrix();
...

Автор: russians 4.12.2006, 17:35
Мммм, нет, тут нужно именно событийное вращение, а не постоянное... Но всё равно спасибо, помог smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)