سؤال

أحتاج إلى حساب متجه الدوران من البيانات التي أحصل عليها من SENSOR.Type_orientation.

يتم تعريف بيانات المستشعر مثل هذا:

  • يجب إعادة حساب القيم لتصبح موضعًا ثلاثي الأبعاد صحيح: القيم [0]: السمت ، الزاوية بين اتجاه الشمال المغناطيسي والمحور Y ، حول محور Z (0 إلى 359). 0 = الشمال ، 90 = الشرق ، 180 = الجنوب ، 270 = الغرب
  • القيم1: الملعب ، الدوران حول محور X (-180 إلى 180) ، مع قيم موجبة عندما يتحرك المحور z نحو المحور ص.
  • القيم [2]: لفة ، الدوران حول محور Y (-90 إلى 90) ، مع قيم موجبة عندما ينتقل المحور X بعيدًا عن المحور z

أحتاج إلى جميع القيم الثلاث مثل قيمة محور Z (من 0 إلى 360 درجة). حاولت الكثير ولكن لا أستطيع معرفة كيفية القيام بذلك:/

(تحرير: لمعرفة الفكرة وراء كود العمل ، ألقِ نظرة على الإجراءات الجماعية مع معالجة إطار Droidar هناك يمكنك أن ترى كيف يمكن معالجة أنواع الأحداث المختلفة.)

حاولت أيضًا استخدام SESSOR.Type_accelerometer و SENSOR.Type_Magnetic_Field لحساب هذا المتجه ثلاثي الأبعاد بمفردي. هنا هو الرمز:

final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)

لكن هذا لم ينجح وأعتقد أنه من المعقد. لذلك أراهن أن هناك حلًا بسيطًا كيفية إعادة حساب قيم ensor.type_orientation لجعلها متجهًا ثلاثي الأبعاد ، لكنني لا أعرف كيف أفعل ذلك. إذا كنت تعرف الإجابة من فضلك قل لي.

تحرير: يجب أن أضيف أنني أريد تمرير قيم إلى OpenGL لمحاذاة المحور مثل هذا:

gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);

ولكن بسبب نطاقات القيمة الغريبة ، من الواضح أنني لا أستطيع القيام بذلك. نفس المشكلة مع القيم من sensormanager.getorialitation لأنها تقلب أيضًا عندما تمر خط الأفق ..

هناك حل آخر هو حساب الزوايا باستخدام مصفوفة INR ولكني أعتقد أنه يجب أن يكون هناك حل أسهل (؟)

هل كانت مفيدة؟

المحلول 2

حسنًا ، لقد حصلت الآن على حل ، عليك القيام بتناوب OpenGL بهذا الترتيب:

gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[0], 0, 0, 1);

استخدم هذا بالاشتراك مع sensormanager.getorientation وستعمل. إذا كان شخص ما يعرف كيفية القيام بذلك باستخدام بيانات Sensor.Type_orientation ، فيرجى إخبارنا بذلك.

نصائح أخرى

يجب أن يعمل هذا (باستخدام مستشعر.

switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        magnitude_values = event.values.clone();
        sensorReady = true;
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accelerometer_values = event.values.clone();
    }   

    if (magnitude_values != null && accelerometer_values != null && sensorReady) {
        sensorReady = false;

        float[] R = new float[16];
        float[] I = new float[16];

        SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values);

        float[] actual_orientation = new float[3];
        SensorManager.getOrientation(R, actual_orientation);
 }

ضع هذا كوندي في onSensorChanged. في again_orientation ، سيكون لديك المتجه الذي يشير إلى الشمال فيما يتعلق بموقفك الفعلي.

إذا كنت ترغب في اكتشاف الشمال من وجهة نظر الكاميرا ، فعليك تغيير السطر الأخير من التعليمات البرمجية مثل هذا

float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top