我的Project Tango AR App对象运动与彩色摄像机运动无法正常工作

时间:2015-10-13 07:58:02

标签: android opengl-es google-project-tango

我想在房间的某处放置一个立方体。立方体在房间内是静态的,并且始终处于同一点。目前我可以在房间里放置一个立方体,但如果我移动Tango平板电脑,它与立方体的运动不同步,我不知道如何同步我的Tango平板电脑运动和物体运动。

我的想法是,如果我将Tango平板电脑向右移动,我的Cube向左移动的速度与我的Tango平板电脑向右移动的速度相同。我尝试了所有方向,但正如之前说的那样,并没有非常同步。

我遇到的另一个问题是,如果我将相机指向另一个方向且设备处于相同位置,立方体怎么能保持静止?

说实话,我上周开始使用OpenGL,我不知道它的所有功能,或者我是否以正确的方式进行操作。

我希望你理解我的问题,并能给我一些提示。

以下是我认为对我要做的事情很重要的代码:

GLSurfaceView渲染器类:

@Override
public void onDrawFrame(GL10 gl) {
    //gl.glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
    gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

    gl.glMatrixMode(GL11.GL_MODELVIEW);
    gl.glLoadIdentity();

    Quaternion q = new Quaternion(xr,yr,zr,wr);
    Vector3f vr = q.getEulerAngles();



    gl.glTranslatef(x, y, z);
    //gl.glTranslatef(0.0f, 0.0f, 0.0f);
    gl.glRotatef(vr.x, 1.0f, 0.0f, 0.0f);
    gl.glRotatef(vr.y, 0.0f, 1.0f, 0.0f);
    gl.glRotatef(vr.z, 0.0f, 0.0f, z);
    gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL11.GL_COLOR_ARRAY);

    mSquare.draw(gl);
}

以下是MainActivity的代码:

 private void startCameraPreview() {
    // Connect to color camera
    tangoCameraPreview.connectToTangoCamera(mTango,
            TangoCameraIntrinsics.TANGO_CAMERA_COLOR);
    final ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();

    framePairs.add(new TangoCoordinateFramePair(
            TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
            TangoPoseData.COORDINATE_FRAME_DEVICE));
    mTango.connectListener(framePairs, new Tango.OnTangoUpdateListener() {

@Override
        public void onPoseAvailable(TangoPoseData pose) {
            // We are not using OnPoseAvailable for this app
            tangoRenderer.getModelMatCalculator().updateModelMatrix(pose.getTranslationAsFloats(),pose.getRotationAsFloats());
            transolationData = pose.getTranslationAsFloats();
            data =  tangoRenderer.getModelMatCalculator().getTranslation();
            //transolationData = tangoRenderer.getModelMatCalculator().getTranslation();

            Quaternion q = new Quaternion((float)pose.rotation[0],(float)pose.rotation[1],(float)pose.rotation[2],(float)pose.rotation[3]);
            final Vector3f vr = q.getEulerAngles();


            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (transolationData != null) {
                        pose_text_view.setText("BU X: " + Math.round(transolationData[0] * 100f) / 100f + " Z: " + Math.round(transolationData[1] * 100f) / 100f + " Y: " + Math.round(transolationData[2] * 100f) / 100f + " length from transolationData: " + transolationData.length + "\n");
                        pose_text_winkel.setText("Winkel X: " + decimalFormat.format((vr.x*100)/100) + " Y: " + decimalFormat.format((vr.y*100)/100) + " Z: " +  decimalFormat.format((vr.z*100)/100) + "\n"
                        + "Device Daten X: " + decimalFormat.format(data[0]) + " Y: " + decimalFormat.format(data[1]) + " Z: " + decimalFormat.format(data[2]));

                        // + " CameraView X: " + tangoCameraPreview.getTranslationX() + " Y: " + tangoCameraPreview.getTranslationY()  + " Z: " + tangoCameraPreview.getTranslationZ());
                    }
                }
            });


            if(isCubeSet){



              /*  neuX = (data[0]+x);
                neuY = (data[1]+y);
                neuZ = -(data[2]+z);*/

                neuX = (transolationData[0]+x);
                neuY = (transolationData[2]+y);
                neuZ = -(data[2]+z);

                rendererCube.setX(neuX);
                rendererCube.setY(neuY);
                rendererCube.setZ(neuZ);

                rendererCube.setXr((float) pose.rotation[0]);
                rendererCube.setYr((float) pose.rotation[1]);
                rendererCube.setZr((float) pose.rotation[2]);
                rendererCube.setWr((float) pose.rotation[3]);

            }
        }

这里我用起点设置我的立方体:

 @Override
public boolean onTouch(View v, MotionEvent event) {
    if(!isCubeSet){
        if(event.getAction() == MotionEvent.ACTION_UP) {
            x = data[0];
            y = data[1];
            z  = -data[2];

            neuX = x;
            neuY = y;
            neuZ = z;

            rendererCube.setX(x);
            rendererCube.setY(y);
            rendererCube.setZ(z);
            isCubeSet = true;
            return true;
        }
    }else{
        if(event.getAction() == MotionEvent.ACTION_UP) {
            isCubeSet = false;
        }
    }
    return true;
}

0 个答案:

没有答案