FT - Update an Object in the Mujoco Scene at runtime
+ Target with a Body name + Update Location and Rotation
This commit is contained in:
parent
dd26c58e6b
commit
306d3016f6
@ -209,6 +209,46 @@ mjData_& AMujocoVolumeActor::GetMujocoData() const
|
||||
return *MujocoData.Get();
|
||||
}
|
||||
|
||||
void AMujocoVolumeActor::UpdateGeomPosition(const FString BodyName, const FVector& NewPosition, const FQuat& NewRotation)
|
||||
{
|
||||
// Step 1: Get body ID
|
||||
const int Body_ID = mj_name2id(MujocoModel.Get(), mjOBJ_BODY, TCHAR_TO_ANSI(*BodyName));
|
||||
if (Body_ID < 0) {
|
||||
UE_LOG(LogTemp, Error, TEXT("Body not found: %s"), *BodyName);
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 2: Get the joint ID (assuming one joint per body)
|
||||
const int Joint_Adr = MujocoModel->body_jntadr[Body_ID];
|
||||
if (MujocoModel->jnt_type[Joint_Adr] != mjJNT_FREE) {
|
||||
UE_LOG(LogTemp, Error, TEXT("Body '%s' does not have a free joint."), *BodyName);
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 3: Get qpos and qvel addresses
|
||||
const int Qpos_Adr = MujocoModel->jnt_qposadr[Joint_Adr];
|
||||
const int Qvel_Adr = MujocoModel->jnt_dofadr[Joint_Adr];
|
||||
|
||||
// Step 4: Convert position and rotation
|
||||
MujocoData->qpos[Qpos_Adr + 0] = NewPosition.X / 100.f; // X
|
||||
MujocoData->qpos[Qpos_Adr + 1] = -NewPosition.Y / 100.f; // Y (flip for Unreal Z-up)
|
||||
MujocoData->qpos[Qpos_Adr + 2] = NewPosition.Z / 100.f; // Z
|
||||
|
||||
// Unreal (X, Y, Z, W) → MuJoCo (W, X, Y, Z)
|
||||
MujocoData->qpos[Qpos_Adr + 3] = NewRotation.W;
|
||||
MujocoData->qpos[Qpos_Adr + 4] = NewRotation.X;
|
||||
MujocoData->qpos[Qpos_Adr + 5] = NewRotation.Y;
|
||||
MujocoData->qpos[Qpos_Adr + 6] = NewRotation.Z;
|
||||
|
||||
// Step 5: Zero velocity
|
||||
for (int i = 0; i < 6; i++) {
|
||||
MujocoData->qvel[Qvel_Adr + i] = 0.0;
|
||||
}
|
||||
|
||||
// Step 6: Update MuJoCo state
|
||||
mj_forward(MujocoModel.Get(), MujocoData.Get());
|
||||
}
|
||||
|
||||
void AMujocoVolumeActor::SetActuatorValue(const FString& ActuatorName, double Value)
|
||||
{
|
||||
if (MujocoModel)
|
||||
|
@ -110,6 +110,9 @@ public:
|
||||
*/
|
||||
mjData_& GetMujocoData() const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Mujoco")
|
||||
void UpdateGeomPosition(const FString BodyName, const FVector& NewPosition, const FQuat& NewRotation);
|
||||
|
||||
// ---------------------------
|
||||
// ------- POST UPDATE -------
|
||||
// ---------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user