mediapipe骨骼旋转角度转换UE5骨骼旋转角度 c++
时间: 2023-07-31 22:11:06 浏览: 161
以下是将Mediapipe中的骨骼旋转角度转换为UE中的骨骼旋转角度的示例C++代码:
```c++
#include <cmath>
#include <iostream>
// 定义一个角度转弧度的函数
float deg2rad(float degrees) {
return degrees * M_PI / 180;
}
// 定义一个弧度转角度的函数
float rad2deg(float radians) {
return radians * 180 / M_PI;
}
// 定义一个将Mediapipe骨骼旋转角度转换为UE5骨骼旋转角度的函数
void mediapipe_rotation_to_ue_rotation(const mediapipe::NormalizedQuaternion& rotation, float& ue_yaw, float& ue_pitch, float& ue_roll) {
// 将弧度转换为欧拉角
float pitch = rad2deg(2 * (rotation.qx() * rotation.qy() + rotation.qz() * rotation.qw()));
float yaw = rad2deg(atan2(2 * (rotation.qy() * rotation.qw() - rotation.qx() * rotation.qz()), 1 - 2 * (rotation.qy() * rotation.qy() + rotation.qz() * rotation.qz())));
float roll = rad2deg(atan2(2 * (rotation.qx() * rotation.qw() - rotation.qy() * rotation.qz()), 1 - 2 * (rotation.qx() * rotation.qx() + rotation.qz() * rotation.qz())));
// 将欧拉角转换为UE5骨骼旋转角度
ue_pitch = -pitch;
ue_yaw = yaw - 90;
ue_roll = -roll;
}
// 使用示例
mediapipe::Hands hands;
hands.set_max_num_hands(1);
hands.set_min_detection_confidence(0.5);
hands.set_static_image_mode(true);
auto results = hands.Process(image);
if (results.has_pose_landmarks()) {
const auto& pose_landmarks = results.pose_landmarks();
float ue_yaw, ue_pitch, ue_roll;
mediapipe_rotation_to_ue_rotation(pose_landmarks.pose_rotation(), ue_yaw, ue_pitch, ue_roll);
}
```
在上述代码中,`deg2rad()`函数将角度转换为弧度,`rad2deg()`函数则将弧度转换为角度。`mediapipe_rotation_to_ue_rotation()`函数将Mediapipe中的骨骼旋转角度转换为UE5中的骨骼旋转角度,其中`rotation`是Mediapipe中的旋转角度,`ue_yaw`、`ue_pitch`和`ue_roll`是转换后的UE5骨骼旋转角度。将欧拉角中的pitch取负数是因为UE5的pitch方向与Mediapipe相反,将yaw减去90度是因为UE5的坐标系与Mediapipe不同。
需要注意的是,Mediapipe中的旋转角度是通过`NormalizedQuaternion`类型表示的,需要使用欧拉角的公式将其转换为角度。
阅读全文