से रोल मैं एक सेंसर प्रबंधक है कि एक rotationMatrix
रिटर्न उपकरणों मैग्नेटोमीटर और Accelerometer के आधार पर की है। मैं भी विचलन पिच और उपयोगकर्ता के उपकरण के रोल की गणना करने के प्रयास कर रहे हैं लेकिन यह है कि पिच और रोल दूसरे के साथ हस्तक्षेप और गलत परिणाम दे लग रहा है। rotationMatrix
से डिवाइस के वाई पिच और रोल को निकालने का कोई तरीका है?निकालने विचलन, पिच, और एक rotationMatrix
संपादित नीचे ब्लेंडर के जवाब की व्याख्या करने के, जो मैं के लिए आभारी हूँ लेकिन वहाँ नहीं अभी तक की कोशिश कर रहा, मैं इस तरह की एक rotaion मैट्रिक्स से कोण पाने के लिए कोशिश कर रहा हूँ:
float R[] = phoneOri.getMatrix();
double rmYaw = Math.atan2(R[4], R[0]);
double rmPitch = Math.acos(-R[8]);
double rmRoll = Math.atan2(R[9], R[10]);
मैं डॉन ' टी नहीं जानता कि मैं मैट्रिक्स के गलत हिस्सों का संदर्भ दे रहा हूं या नहीं, लेकिन मुझे नतीजे नहीं मिल रहे हैं।
मैं डिग्री में मूल्यों को प्राप्त करने की उम्मीद कर रहा था, लेकिन अजीब पूर्णांक हो रही है।
मेरी मैट्रिक्स मेरी sensorManager
से आ रही है इस तरह दिखता है जो:
public void onSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
if(type == Sensor.TYPE_ORIENTATION){
yaw = evt.values[0];
pitch = evt.values[1];
roll = evt.values[2];
}
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
} else if (type == Sensor.TYPE_ACCELEROMETER) {
acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
float newMat[]=new float[16];
SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
if(displayOri==0||displayOri==2){
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
}else{
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
}
matrix=newMat;
नमूना मैट्रिक्स जब डिवाइस मेज पर चेहरा रख रही है
0.9916188, -0.12448014, -0.03459576, 0.0
0.12525482, 0.9918981, 0.021199778, 0.0
0.031676512,-0.025355382, 0.9991765, 0.0
0.0, 0.0, 0.0, 1
उत्तर
double rmPitch = Math.toDegrees(Math.acos(R[10]));
धन्यवाद लेकिन ईमानदार है कि है, मेरे लिए ग्रीक किया जाना है। क्या आप मेरे लिए अनुवाद करने के लिए इतने किआस होंगे .. जावा की तरह? – erik
ठीक है, वे * यूनानी अक्षरों हैं;) 'ए_31' का अर्थ तीसरी पंक्ति और पहला स्तंभ में प्रविष्टि है। जावा में इन फ़ंक्शंस अंतर्निहित हैं ताकि आप इसका अनुवाद कर सकें। – Blender
कृपया ऊपर मेरा संपादन देखें .. मेरा रोटेशन मैट्रिक्स आकार में 16 मान है। अगर मैं यह सही कर रहा हूँ पता नहीं है .. – erik