没有获取到骨骼初始位置
时间: 2024-01-16 19:02:20 浏览: 85
kinect 骨骼位置信息输出
3星 · 编辑精心推荐
如果没有获取到骨骼的初始位置,可以选择使用骨骼自身的旋转来进行计算。
假设你已经获取到了Mediapipe输出的坐标和骨骼的当前位置,可以按照以下步骤计算需要旋转的角度:
1. 计算两个向量之间的夹角
```
float angle = FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(v1, v2)));
```
这里使用FVector的DotProduct()方法计算出两个向量的点积,然后使用FMath的Acos()方法计算出点积对应的夹角,最后使用FMath的RadiansToDegrees()方法将弧度转换为角度。
2. 计算旋转轴
```
FVector axis = FVector::CrossProduct(v1, v2).GetSafeNormal();
```
这里使用FVector的CrossProduct()方法计算出两个向量的叉积,得到旋转轴,然后使用GetSafeNormal()方法将旋转轴归一化,得到单位向量。
3. 获取骨骼的当前旋转
```
FQuat currentRotation = bone->GetComponentRotation().Quaternion();
```
这里使用骨骼的GetComponentRotation()方法获取当前的旋转角度,然后使用Quaternion()方法将旋转角度转换为旋转四元数。
4. 计算旋转四元数
```
FQuat rotation = FQuat(axis, FMath::DegreesToRadians(angle)) * currentRotation;
```
这里将步骤2中计算得到的旋转轴和夹角转换为旋转四元数,并与当前的旋转四元数相乘,得到最终的旋转四元数。
5. 通过旋转四元数旋转骨骼
```
FTransform transform = FTransform(rotation);
bone->SetRelativeTransform(transform);
```
这里使用FTransform的构造函数创建一个包含旋转变换的变换矩阵,并将其应用到骨骼上,实现旋转变换。
需要注意的是,这里假设bone是一个指向骨骼的指针,可以通过SetRelativeTransform()方法将旋转变换应用到骨骼上。如果bone不是指针,可以使用SetWorldTransform()方法或者其他适当的方法应用旋转变换。
阅读全文