-1

私のPCから実行されるC++プログラムを持っています。それは私の電話のAndroidアプリケーションに接続し、同時に私のPCのOpenGLで画像を開きます。現在、openGL の画像は、キーボード ボタンを使用して変換およびズームインされています。X 座標と Y 座標は、Android デバイスから端末にストリーミングされます。

これらの生の x 値と y 値を取り、それらを使用して OpenGL で画像を変換する方法はありますか? したがって、ユーザーは Android デバイスから PC 上の画像を制御します。何らかの方法で値をスケーリングして正規化する必要があると思いますか?

より明確になる場合は、コードまたはその一部を提供できます。

using namespace std;
#define USE_TOMS_OGL


class device_info {
    public:
    char            *name;

    vrpn_Analog_Remote  *ana;


};
const unsigned MAX_DEVICES = 2;

float translateX = 0.0;
float translateY = 0.0;
float translateZ = 1.0;
float imgScale = 0.8;
float panX = 0.125; 
float panY = 0.125; 
float zoomFactor = 0.01; 



using namespace std;

struct Image {                   // stores image data
   unsigned long sizeX;
   unsigned long sizeY;
   char *data;
};

void display(void)
{


    // Translation and Scaling
    glTranslatef(translateX, translateY, translateZ);
    glScalef(imgScale, imgScale, 0.0);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);


void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
      case 'x':
        imgScale += zoomFactor;
        glutPostRedisplay();
         break;
      case 'z':
            imgScale -= zoomFactor;
            glutPostRedisplay();
         break;
      case 'w':
         translateY += panY;
         glutPostRedisplay();
         break;
      case 's':
         translateY -= panY;
         glutPostRedisplay();
         break;
      case 'a':
         translateX -= panX;
         glutPostRedisplay();
         break;
      case 'd':
         translateX += panX;
         glutPostRedisplay();
         break;
      default:
         break;
   }
}

void IdleFunc(void) {
    if (accepted != 1)
    {

      unsigned i;

      // Let all the devices do their things
      for (i = 0; i < num_devices; i++) {

      device_list[i].ana->mainloop();
      //cerr << i;
      }

    //  printf("Idle function test ");

    } 
    glutPostRedisplay();
}


//Callback handlers

void    VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a)
{
    int i;
    const char *name = (const char *)userdata;


    printf("Input from %s:\n  \n        %5.0f", name, a.channel[0]);
    for (i = 1; i < a.num_channel; i++) {
    printf(" %5.0f \n", a.channel[1]);
    }

    printf(" \n");
}













 // main interactive loop

  printf("Press ^C to exit.\n");
  while ( ! done ) {
#ifdef USE_TOMS_OGL
      glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(400,300);
    glutInitWindowPosition(200,100);
    glutCreateWindow("ImageViewer");


    init();
    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);
    glutIdleFunc(IdleFunc);
    glutMainLoop();
#else
      unsigned i;

      // Let all the devices do their things
      for (i = 0; i < num_devices; i++) {

      device_list[i].ana->mainloop();
      //cerr << i;
      }
      //cerr << endl;
#endif

  }
 return 0;
}  


// a.channel[0] =  x
// a.channel[1] =  y
// a.channel[2] =  Zoom
4

1 に答える 1

1

解決しました。このコードを追加しました..

// Translate image on screen using data from device    

    yVal = a.channel[1];
    yVal = yVal/10000;
    translateY -= yVal;

    xVal = a.channel[0];

if (xVal >0 & xVal<250){

  xVal = xVal - 300;

}        

    xVal = xVal/15000;
    translateX += xVal;

xVal と Yval は、使用している画面に合わせて分割されています。

于 2012-04-19T20:21:14.150 に答える