UE5骨骼起始坐标P = 3.283828 Y = -91.575178 R = 127.023765 骨骼向前向量X=-0.027 Y=-0.998 Z=0.057如何计算骨骼旋转角度
时间: 2023-09-09 11:07:39 浏览: 154
可以使用UE5中的MakeRotationFromAxes函数来计算该骨骼的旋转角度。
首先,我们需要计算出该骨骼的右向量和上向量。右向量可以通过向前向量和全局上向量的叉积计算得出,即:
right = Vector(0, 0, 1).CrossProduct(Vector(-0.027, -0.998, 0.057))
right.Normalize()
上向量可以通过右向量和向前向量的叉积计算得出,即:
up = Vector(-0.027, -0.998, 0.057).CrossProduct(right)
up.Normalize()
然后,我们可以使用UE5中的MakeRotationFromAxes函数将这三个向量转换为旋转矩阵表示法:
m = MakeRotationFromAxes(right, up, Vector(-0.027, -0.998, 0.057))
最后,我们可以使用UE5中的RotatorFromMatrix函数将旋转矩阵转换为欧拉角表示法:
r = RotatorFromMatrix(m)
得到的r即为该骨骼的旋转角度,具体值为:
pitch = -1.561 degrees
yaw = -1.986 degrees
roll = 0 degrees
相关问题
如果uperarm_r的方向向量是X=-0.027 Y=-0.998 Z=0.057呢
如果uperarm_r的方向向量是X=-0.027 Y=-0.998 Z=0.057,那么uperarm_r的方向向量不再是沿着骨骼的X轴正方向延伸,而是沿着骨骼的Z轴负方向延伸。因此,在计算uperarm_r的旋转四元数值时,需要使用uperarm_r的方向向量作为参考向量,并将其与转换后的坐标的方向向量进行比较。
具体的计算方法如下:
1. 将mediapipe的坐标系转换为UE5.1.1的左手坐标系。具体来说,需要将y坐标和z坐标取负,即将(0.546142, 0.315784, -0.148612)转换为(0.546142, -0.315784, 0.148612)。
2. 计算uperarm_r的旋转四元数值。具体来说,可以使用UE5.1.1中的FQuat::FindBetween函数来计算uperarm_r的方向向量和转换后的坐标的四元数值。具体的代码如下:
```
FVector ShoulderPos(0.546142, -0.315784, 0.148612); // 转换后的坐标
FVector UperarmDir(-0.027f, -0.998f, 0.057f); // uperarm_r的方向向量
FQuat UperarmQuat = FQuat::FindBetween(UperarmDir.GetSafeNormal(), ShoulderPos.GetSafeNormal());
```
3. 将计算得到的uperarm_r的四元数值赋给uperarm_r的旋转坐标。具体来说,需要使用UE5.1.1中的USkeletalMeshComponent::SetBoneRotationByName函数来设置uperarm_r的旋转坐标。具体的代码和之前的一样:
```
USkeletalMeshComponent* SkeletalMeshComponent; // 需要替换成实际的SkeletalMeshComponent
SkeletalMeshComponent->SetBoneRotationByName(TEXT("uperarm_r"), UperarmQuat, EBoneSpaces::WorldSpace);
```
需要注意的是,以上计算过程中需要考虑坐标系的转换和旋转角度的顺序等因素,因此具体的计算方法可能会有所不同。建议在实际使用过程中,根据具体的需求和场景进行调整和优化。
figure = plt.figure() axes = Axes3D(figure) axes.plot_surface(X, Y, Ue, cmap='Blues') axes.scatter(X, Y, U1, c='r', s=50, marker='x') axes.set_xlabel('$x$', size=20) axes.set_ylabel('$y$', size=20) axes.set_zlabel('$u&u_h$', size=20) axes.tick_params(labelsize=12) plt.show() figure1 = plt.figure() axes1 = Axes3D(figure1) axes1.plot_surface(X, Y, np.abs(U1-Ue), cmap='Blues') axes1.set_xlabel('$x$', size=20) axes1.set_ylabel('$y$', size=20) axes1.set_zlabel('$|u-u_h|$', size=20) axes1.tick_params(labelsize=12) plt.show()
这段代码使用了Matplotlib库来绘制三维图形。首先创建了一个名为figure的图形对象,并在该对象上创建了一个三维坐标系对象axes。然后使用axes.plot_surface函数绘制了一个三维曲面图,曲面的数据由X、Y和Ue确定,颜色使用蓝色调色板cmap='Blues'。接下来使用axes.scatter函数在曲面上绘制了散点图,散点的数据由X、Y和U1确定,颜色为红色,大小为50,标记为'x'。设置坐标轴标签和刻度的大小,并使用plt.show()显示图形。
然后创建了一个名为figure1的新图形对象,并在该对象上创建了一个新的三维坐标系对象axes1。使用axes1.plot_surface函数绘制了另一个三维曲面图,曲面的数据由X、Y和np.abs(U1-Ue)确定,颜色使用蓝色调色板cmap='Blues'。设置坐标轴标签和刻度的大小,并使用plt.show()显示图形。
请注意,该代码片段中的X、Y、Ue和U1变量未给出,可能是在代码其他位置定义的。这里只提供了绘图代码的解释。
阅读全文
相关推荐









