nickita startcev (nicka_startcev) wrote,
nickita startcev
nicka_startcev

Дыбр, программирование

сделал хитрую навигацию мышью для разглядывания объекта в точке фокуса.
сдвиг не нужен, нужно приближение/удаление и вращение по осям.
тулкит - glut.


реакция на нажатие кнопок мыши:
void processMouse(int button, int state, int x, int y)
{
  if ((button == 3) || (button == 4))
  {
    //wheel
    if (state != GLUT_UP)
    {
      //printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
      if(button==3)
      {
        eyeR=eyeR*xR;
      }
      if(button==4)
      {
        eyeR=eyeR/xR;
      }
    }
    return;
  }
  printf("Button '%i' %s At %d %d\n", button, (state == GLUT_DOWN) ? "Down" : "Up", x, y);
  if( (button==0) && (state==GLUT_DOWN))
  {
    old_mousex=x;
    old_mousey=y;
  }

  if( (button==2) && (state==GLUT_DOWN))
  {
    old_mousex=x;
    old_mousey=y;
  }
  if((button==0) && (state==GLUT_DOWN))
    leftPressed=true;
  if((button==0) && (state==GLUT_UP))
    leftPressed=false;
  if((button==2) && (state==GLUT_DOWN))
    rightPressed=true;
  if((button==2) && (state==GLUT_UP))
    rightPressed=false;
}


реакция на движение при зажатой кнопке:
void processMotion(int x, int y)
{
  int dx = x-old_mousex;
  int dy = y-old_mousey;
  int center_x = window_w/2;
  int center_y = window_h/2;

  if(leftPressed)
  {
    float old_angle = atan2( old_mousey - center_y, old_mousex - center_x );
    float new_angle = atan2(          y - center_y,          x - center_x );
    float delta_fi  = new_angle-old_angle;
    old_mousex=x;
    old_mousey=y;
    eyeFi += delta_fi;
    printf("motion( %i, %i ) dx=%i, dy=%i, dfi= %g  \n",x ,y, dx, dy, delta_fi);
  }

  if(rightPressed)
  {
    float old_angle = atan2( old_mousey, 2*center_x );
    float new_angle = atan2(          y, 2*center_x );
    float delta_fi  = new_angle-old_angle;
    old_mousex=x;
    old_mousey=y;
    eyePsi += delta_fi;
    printf("motion( %i, %i ) dx=%i, dy=%i, dfi= %g  \n",x ,y, dx, dy, delta_fi);
  }
}


точка обзора:
void recalcEye()
{
  eyeX=eyeR*sin(eyeFi)*cos(eyePsi);
  eyeZ=eyeR*cos(eyeFi)*cos(eyePsi);
  eyeY=eyeR*sin(eyePsi);
}

void renderScene_loc(void)
{
  recalcEye();

 // очистка буфера цвета и глубины
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 // обнуление трансформации
 glLoadIdentity();
 
 // установка камеры
 gluLookAt( eyeX, eyeY, eyeZ,
     0.0f, 0.0f,  0.0f,
     0.0f, 1.0f,  0.0f);

  renderScene();

  glutSwapBuffers();
}


да, функция renderScene() собственно рисует сцену вокруг начала координат.
мышой задаются фи, пси (при зажатой левой/правой) и расстояние до центра (зум колесом).
xR множитель, близкий к единице (изменение масштаба на 1 клик).
пересчет глаза - пересчитывает углы обзора в координату глаза.
сдвиг центра кадра потом, может быть, тоже сделаю.
Subscribe

  • (no subject)

    если подумать, если с нуля при современных возможностях спроектировать а не по мелочи подпатчить, то очень многое в жизни станет резко дешевле и…

  • а вот я бы, если бы был вчера таким умным как ?? сегодня..

    а вот любопытно. допустим, вы попали в на 20-30-40-50 лет назад. помните-знаете про пейсбук, ютуб, жж и прочие блоги. как бы вы описали тенденции и…

  • электрофобийное

    внезапно, я боюсь стандартного напряжения 220/240в. осмысленно боюсь. оно неприятно бьёт и рикошетит дергающимися мышцами. итого, при любом…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments