在项目探戈中动态更新坐标

时间:2016-03-14 14:14:28

标签: google-project-tango

private void setTangoListeners() {
        // Select coordinate frame pairs
        ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
        framePairs.add(new TangoCoordinateFramePair(
                TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
                TangoPoseData.COORDINATE_FRAME_DEVICE));

private void setTangoListeners() {
        // Select coordinate frame pairs
        ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
        framePairs.add(new TangoCoordinateFramePair(
                TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
                TangoPoseData.COORDINATE_FRAME_DEVICE));

        // Add a listener for Tango pose data
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

            @Override
            public void onPoseAvailable(TangoPoseData pose) {
                // Format Translation and Rotation data
                final String translationMsg = String.format(sTranslationFormat,
                        pose.translation[0], pose.translation[1],
                        pose.translation[2]);
                final String rotationMsg = String.format(sRotationFormat,
                        pose.rotation[0], pose.rotation[1], pose.rotation[2],
                        pose.rotation[3]);

                // Output to LogCat
                String logMsg = translationMsg + " | " + rotationMsg;
                Log.i(TAG, logMsg);

                final double deltaTime = (pose.timestamp - mPreviousTimeStamp)
                        * SECS_TO_MILLISECS;
                mPreviousTimeStamp = pose.timestamp;
                mTimeToNextUpdate -= deltaTime;

                // Throttle updates to the UI based on UPDATE_INTERVAL_MS.
                if (mTimeToNextUpdate < 0.0) {
                    mTimeToNextUpdate = UPDATE_INTERVAL_MS;

                    // Display data in TextViews. This must be done inside a
                    // runOnUiThread call because
                    // it affects the UI, which will cause an error if performed
                    // from the Tango
                    // service thread
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mRotationTextView.setText(rotationMsg);
                            mTranslationTextView.setText(translationMsg);
                        }
                    });
                }
            }

上面的代码为我们提供了3D中的平移和旋转坐标。随着我们移动或改变探戈平板电脑的方向mtango。调用setclicklistener并运行内部代码并更新坐标..

我无法理解的是,调用setclicklistener时坐标是如何更新的?任何人都可以向我解释onposeavailable()中的代码的工作原理吗?

1 个答案:

答案 0 :(得分:1)

好吧,setTangoListener()只被调用一次,但是这样做时你实例化一个监听器,你覆盖onPoseAvailable()函数,每当监听器检测到Tango更新了它时,它就会被调用使用TangoPoseData对象(pose)作为包含最新姿势数据的参数进行姿势。

因此,姿势信息的实际更改是在探戈核心中完成的,并且可以通过监听器中的pose参数进行访问。因此,当您访问翻译和轮换时,它将已更新。

因此,你在onPoseAvailable()函数中永远不会更新姿势这是正确的,因为它在调用时已经完成了。在onPoseAvailable()中发生的唯一事情是您读取旋转和转换值并将它们放在可以通过第一个LogCat显示的字符串中。此后,它会检查自上次更新以来已经过了多长时间,以及是否需要更新textViews(如果每次有新姿势时更新它都会很难阅读)。

我希望它有所帮助:)