2013-05-26 31 views
6

Tôi muốn biết cách sử dụng đúng đầu ra từ "Cảm biến Vector Xoay". Hiện nay tôi đã đưa ra những điều sau đây và muốn tính toán yaw và pitch từ result[], để biết nơi thiết bị đang trỏ (nằm trong chế độ ngang). Nhưng tôi gặp rắc rối với kết quả. Tính toán yaw là khá chính xác nhưng sân là hành xử kỳ lạ. Có lẽ ai cũng có thể chỉ cho tôi đúng hướng về cách sử dụng dữ liệu. Một điều tôi cũng muốn biết là liệu các định hướng thiết bị (phong cảnh hoặc chân dung) có bất kỳ ảnh hưởng ở đầu ra của cảm biến này. Cảm ơn trước.Sử dụng Cảm biến Vector Xoay

private double max = Math.PI/2 - 0.01; 
private double min = -max; 

private float[] rotationVectorAction(float[] values) { 
    float[] result = new float[3]; 
    float vec[] = values; 
    float quat[] = new float[4]; 
    float[] orientation = new float[3]; 
    SensorManager.getQuaternionFromVector(quat, vec); 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, quat); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; 
    result[1] = (float) orientation[1]; 
    result[2] = (float) orientation[2];  
    return result; 
} 

private void main() { 
    float[] result = rotationVectorAction(sensorInput); 
    yaw = result[0]; 
    pitch = result[1]; 
    pitch = (float) Math.max(min, pitch); 
    pitch = (float) Math.min(max, pitch); 
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch))); 
    float dy = (float) Math.sin(pitch); 
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch)); 
} 

Và trong OpenGL ES 2.0 Tôi thiết lập này để di chuyển máy ảnh của tôi xung quanh:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0); 

Trả lời

4

Cuối cùng tôi đã tự giải quyết. Lý do cho quảng cáo chiêu hàng không hoạt động chính xác là sự khác biệt giữa việc nhúng INPUT và OUTPUT từ SensorManager.getQuaternionFromVector(quat, vec);. Phương pháp này đang chờ một vector vec(x|y|z|w) và đầu ra quat để trông giống như thế này (w|x|y|z). Trong trường hợp của tôi, tôi đã phải di chuyển giá trị đầu tiên của quat mảng đến cùng và nó hoạt động như một sự quyến rũ.

+2

Bạn có thể thêm một số mã không? Xin vui lòng. –

0

tôi có thể trả lời một phần của câu hỏi này.

Hướng thiết bị không ảnh hưởng đến đầu ra cảm biến, bởi vì các cảm biến luôn liên quan đến hướng mặc định của thiết bị. Tuy nhiên, để vẽ các nội dung trên màn hình như mũi tên la bàn hướng về phía bắc, bạn cần tính đến hướng thiết bị, bởi vì hệ thống phối hợp của canvas bạn vẽ trên đã được xoay nếu thiết bị không có trong định hướng mặc định.

+0

Cảm ơn bạn đã trợ giúp, bây giờ tôi chắc chắn rằng tôi đã lo phần này. – dima

2

Linh hồn ở trên không giúp ích gì cho tôi. Đã đến lúc xóa SensorManager.getQuaternionFromVector(quat, vec); làm docs tuyên bố rằng SensorManager.getRotationMatrixFromVector() yêu cầu vectơ quay được trả lại bằng cảm biến ROTATION_VECTOR.

private float[] rotationVectorAction(float[] values) 
{ 
    float[] result = new float[3]; 
    float vec[] = values; 
    float[] orientation = new float[3]; 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, vec); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; //Yaw 
    result[1] = (float) orientation[1]; //Pitch 
    result[2] = (float) orientation[2]; //Roll 
    return result; 
} 
+0

Cảm ơn! Làm tốt lắm! –