static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const double mval[2], float output[3]) { struct InputAngle_Data *data = mi->data; float dir_prev[2], dir_curr[2], mi_center[2]; copy_v2_v2(mi_center, mi->center); sub_v2_v2v2(dir_prev, (const float[2]){UNPACK2(data->mval_prev)}, mi_center); sub_v2_v2v2(dir_curr, (const float[2]){UNPACK2(mval)}, mi_center); if (normalize_v2(dir_prev) && normalize_v2(dir_curr)) { float dphi = angle_normalized_v2v2(dir_prev, dir_curr); if (cross_v2v2(dir_prev, dir_curr) > 0.0f) { dphi = -dphi; } data->angle += ((double)dphi) * (mi->precision ? (double)mi->precision_factor : 1.0); data->mval_prev[0] = mval[0]; data->mval_prev[1] = mval[1]; } output[0] = data->angle; } data->angle如何转为欧拉角
时间: 2024-03-09 11:50:22 浏览: 80
将 `data->angle` 转换为欧拉角需要先确定旋转顺序。在 Blender 中,旋转顺序为 Z 轴、X 轴、Y 轴,即先绕 Z 轴旋转,再绕 X 轴旋转,最后绕 Y 轴旋转。因此,我们需要先将 `data->angle` 转换为旋转矩阵,再将旋转矩阵转换为欧拉角。具体的转换方法如下:
1. 根据旋转顺序计算出绕 Z 轴、X 轴、Y 轴旋转的角度,这里将 `data->angle` 分别赋值给变量 `rz`、`rx` 和 `ry`。
2. 根据绕 Z 轴的角度计算旋转矩阵 `Rz`:
```
Rz = | cos(rz) -sin(rz) 0 |
| sin(rz) cos(rz) 0 |
| 0 0 1 |
```
3. 根据绕 X 轴的角度计算旋转矩阵 `Rx`:
```
Rx = | 1 0 0 |
| 0 cos(rx) -sin(rx) |
| 0 sin(rx) cos(rx) |
```
4. 根据绕 Y 轴的角度计算旋转矩阵 `Ry`:
```
Ry = | cos(ry) 0 sin(ry) |
| 0 1 0 |
|-sin(ry) 0 cos(ry) |
```
5. 将三个旋转矩阵相乘得到总的旋转矩阵 `R`:
```
R = Rz * Rx * Ry
```
6. 将 `R` 转换为欧拉角即可,可以使用 `euler_from_matrix` 函数实现:
```
euler_from_matrix(R, output);
```
其中 `output` 是一个长度为 3 的数组,分别表示 `RotationX`、`RotationY` 和 `RotationZ`。
阅读全文