以欧拉角旋转3D模型

问题描述 投票:0回答:0

我正在使用传感器来模拟 Android 设备在 3D 模型中的移动。 目前,我计算欧拉角(偏航角、俯仰角、滚动角),然后用它们来旋转模型。 一切正常,但当我将设备垂直倾斜时,滚动角度突然改变,导致模型旋转错误。 这是模型的起始位置: enter image description here 当垂直倾斜时: enter image description here

所以,请让我知道:

  1. 我的代码好吗?
  2. 为什么当我垂直倾斜设备时,滚动角度突然改变,如何解决。 谢谢!

这是我获取偏航角、俯仰角、横滚角的代码:

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)
    }
android 3d opengl-es sensors euler-angles
© www.soinside.com 2019 - 2024. All rights reserved.