Arhn - архитектура программирования

Датчик вектора вращения реверсирует горизонтальное вращение

Я сделал небольшое тестовое приложение, которое имитирует движение вокруг объекта. Я использовал библиотеку JPCT-AE и датчик вектора вращения на своем мобильном устройстве.

Моя проблема в том, что текущее состояние вращения неправильно имитирует движение вокруг объекта. Вращение обратное.

Вот фото проблемы, чтобы было понятнее:

введите здесь описание изображения

На картинке в верхней части показано перемещение пользователя из точки А в точку Б. В нижней части показано, как приложение имитирует перемещение вокруг объекта. Экран «КАК ЭТО ЕСТЬ» показывает, как в данный момент вращается объект.

Код выглядит следующим образом:

public class HelloWorld extends Activity {

private GLSurfaceView mGLSurfaceView;
private SensorManager mSensorManager;
private MyRenderer mRenderer;
Object3D object = null;
private World world = null;
private Light sun = null;
Context context = this;
private FrameBuffer fb = null;
private RGBColor back = new RGBColor(175, 175, 175);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get an instance of the SensorManager
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    mRenderer = new MyRenderer(context);
    mGLSurfaceView = new GLSurfaceView(this);
    mGLSurfaceView.setRenderer(mRenderer);
    setContentView(mGLSurfaceView);
}

@Override
protected void onResume() {
    super.onResume();
    mRenderer.start();
    mGLSurfaceView.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    mRenderer.stop();
    mGLSurfaceView.onPause();
}

class MyRenderer implements GLSurfaceView.Renderer, SensorEventListener {
    private Sensor mRotationVectorSensor;
    private final float[] mRotationMatrix = new float[16];
    Context context;

    public MyRenderer(Context context) {
        // find the rotation-vector sensor
        this.context = context;
        mRotationVectorSensor = mSensorManager
                .getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

        // initialize the rotation matrix to identity
        mRotationMatrix[0] = 1;
        mRotationMatrix[4] = 1;
        mRotationMatrix[8] = 1;
        mRotationMatrix[12] = 1;
    }

    public void start() {
        mSensorManager.registerListener(this, mRotationVectorSensor, 10000);
    }

    public void stop() {
        // make sure to turn our sensor off when the activity is paused
        mSensorManager.unregisterListener(this);
    }

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
            SensorManager.getRotationMatrixFromVector(mRotationMatrix,
                    event.values);
            SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X,  SensorManager.AXIS_MINUS_Y, mRotationMatrix);


        }
    }

    public void onDrawFrame(GL10 gl) {

        Matrix m = new Matrix();
        m.setDump(mRotationMatrix);

        object.setRotationMatrix(m);

        fb.clear(back);
        world.renderScene(fb);
        world.draw(fb);
        fb.display();
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        if (fb != null) {
            fb.dispose();
        }
        fb = new FrameBuffer(gl, width, height);
        world = new World();
        world.setAmbientLight(250, 250, 250);

        // set view-port
        gl.glViewport(0, 0, width, height);
        // set projection matrix
        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        try {               
            object = loadModel("untitled.obj", "untitled.mtl", 0.1F);                   
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

        object.build();
        world.addObject(object);

        Camera cam = world.getCamera();
        cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
        cam.lookAt(object.getTransformedCenter());
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // dither is enabled by default, we don't need it
        gl.glDisable(GL10.GL_DITHER);
        // clear screen in white
        gl.glClearColor(1, 1, 1, 1);
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    private Object3D loadModel(String filename, String mtlFileName,
            float scale) throws UnsupportedEncodingException {

        InputStream stream = null;
        InputStream mtlStream = null;
        try {

            stream = context.getAssets().open(filename);
            mtlStream = context.getAssets().open(mtlFileName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        Object3D[] model = Loader.loadOBJ(stream, mtlStream, scale);

        return Object3D.mergeAll(model);

    }
}}

Кто-нибудь здесь имеет опыт с этим? Я хочу знать, есть ли для этого простое решение, прежде чем я начну заниматься полной математикой.

Спасибо за ваше время! Я очень ценю это!


Ответы:


1

Хорошо, я нашел решение самостоятельно. Мне пришлось повернуть предоставленную матрицу вращения, чтобы она была выражена в системе координат, подходящей для моей задачи.

Я отредактировал код в своем вопросе. Этот код теперь работает для меня.

В основном я добавил эту строку кода в метод onSensorChanged:

SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X,  SensorManager.AXIS_MINUS_Y, mRotationMatrix);

Я знаю, что это не лучшее решение для повышения производительности, потому что я использую mRotationMatrix как первый и последний параметр в упомянутом методе. Но пока меня не беспокоит проблема производительности.

Я надеюсь, что это поможет кому-то в будущем.

16.05.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..