我正在使用传感器来模拟 Android 设备在 3D 模型中的移动。 目前,我计算欧拉角(偏航角、俯仰角、滚动角),然后用它们来旋转模型。 一切正常,但当我将设备垂直倾斜时,滚动角度突然改变,导致模型旋转错误。 这是模型的起始位置: 当垂直倾斜时:
所以,请让我知道:
这是我获取偏航角、俯仰角、横滚角的代码:
fun handleSensorEvent(event: SensorEvent) {
val eventValues = event.values
when (event.sensor.type) {
Sensor.TYPE_ACCELEROMETER -> {
accels = eventValues.clone()
}
Sensor.TYPE_MAGNETIC_FIELD -> {
mags = eventValues.clone()
}
}
}
private fun updateOrientationChange() {
SensorManager.getRotationMatrix(rotationMatrix, null, accels, mags)
SensorManager.remapCoordinateSystem(
rotationMatrix,
SensorManager.AXIS_X,
SensorManager.AXIS_Y,
outR
)
SensorManager.getOrientation(outR, orientationAngles)
_pitch = -Math.toDegrees(orientationAngles[1].toDouble()).toFloat()
_roll = Math.toDegrees(orientationAngles[2].toDouble()).toFloat()
_yaw = Math.toDegrees(atan2(outR[4].toDouble(), outR[0].toDouble())).toFloat()
}
这是我用来旋转模型的代码:
fun rotate(roll: Float, pitch: Float, yaw: Float) {
rotateAngleY = roll
rotateAngleX = pitch
rotateAngleZ = yaw
updateViewMatrix()
}
private fun updateViewMatrix() {
Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, translateZ, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
Matrix.rotateM(viewMatrix, 0, rotateAngleX, 1f, 0f, 0f)
Matrix.rotateM(viewMatrix, 0, rotateAngleY, 0f, 1f, 0f)
Matrix.rotateM(viewMatrix, 0, rotateAngleZ, 0f, 0f, 1f)
}