feat(physics): motor joint

This commit is contained in:
maelstrom 2025-09-01 20:47:22 +02:00
parent 219ca94ded
commit 3a6fb2ada2

View file

@ -36,7 +36,7 @@
#include <Jolt/Physics/Body/BodyLockInterface.h> #include <Jolt/Physics/Body/BodyLockInterface.h>
#include <Jolt/Physics/Collision/NarrowPhaseQuery.h> #include <Jolt/Physics/Collision/NarrowPhaseQuery.h>
#include <Jolt/Physics/Constraints/FixedConstraint.h> #include <Jolt/Physics/Constraints/FixedConstraint.h>
#include <Jolt/Physics/Constraints/SixDOFConstraint.h> #include <Jolt/Physics/Constraints/HingeConstraint.h>
#include <memory> #include <memory>
static JPH::TempAllocator* allocator; static JPH::TempAllocator* allocator;
@ -218,22 +218,21 @@ PhysJoint PhysWorld::createJoint(PhysJointInfo& type, std::shared_ptr<BasePart>
settings.mAxisY2 = convert<JPH::Vec3>(info->c1.UpVector()); settings.mAxisY2 = convert<JPH::Vec3>(info->c1.UpVector());
constraint = settings.Create(*part0->rigidBody.bodyImpl, *part1->rigidBody.bodyImpl); constraint = settings.Create(*part0->rigidBody.bodyImpl, *part1->rigidBody.bodyImpl);
} else if (PhysRotatingJointInfo* info = dynamic_cast<PhysRotatingJointInfo*>(&type)) { } else if (PhysRotatingJointInfo* info = dynamic_cast<PhysRotatingJointInfo*>(&type)) {
JPH::SixDOFConstraintSettings settings; JPH::HingeConstraintSettings settings;
settings.mSpace = JPH::EConstraintSpace::LocalToBodyCOM; settings.mSpace = JPH::EConstraintSpace::LocalToBodyCOM;
settings.mPosition1 = convert<JPH::Vec3>(info->c0.Position()); settings.mPoint1 = convert<JPH::Vec3>(info->c0.Position());
settings.mAxisX1 = convert<JPH::Vec3>(info->c0.RightVector()); settings.mNormalAxis1 = convert<JPH::Vec3>(info->c0.RightVector());
settings.mAxisY1 = convert<JPH::Vec3>(info->c0.UpVector()); settings.mHingeAxis1 = convert<JPH::Vec3>(info->c0.LookVector());
settings.mPosition2 = convert<JPH::Vec3>(info->c1.Position()); settings.mPoint2 = convert<JPH::Vec3>(info->c1.Position());
settings.mAxisX2 = convert<JPH::Vec3>(info->c1.RightVector()); settings.mNormalAxis2 = convert<JPH::Vec3>(info->c1.RightVector());
settings.mAxisY2 = convert<JPH::Vec3>(info->c1.UpVector()); settings.mHingeAxis2 = convert<JPH::Vec3>(info->c1.LookVector());
settings.MakeFixedAxis(JPH::SixDOFConstraintSettings::RotationX); // settings.mMotorSettings = JPH::MotorSettings(1.0f, 1.0f);
settings.MakeFixedAxis(JPH::SixDOFConstraintSettings::RotationY);
settings.MakeFixedAxis(JPH::SixDOFConstraintSettings::TranslationX);
settings.MakeFixedAxis(JPH::SixDOFConstraintSettings::TranslationY);
settings.MakeFixedAxis(JPH::SixDOFConstraintSettings::TranslationZ);
settings.mMotorSettings[JPH::SixDOFConstraintSettings::EAxis::RotationZ] = JPH::MotorSettings(5.f, 0.f);
constraint = settings.Create(*part0->rigidBody.bodyImpl, *part1->rigidBody.bodyImpl); constraint = settings.Create(*part0->rigidBody.bodyImpl, *part1->rigidBody.bodyImpl);
// static_cast<JPH::SixDOFConstraint*>(constraint)->SetMotorState(JPH::SixDOFConstraintSettings::EAxis::RotationZ, JPH::EMotorState::Velocity); if (info->motorized) {
float vel = part0->GetSurfaceParamB(-info->c0.LookVector().Unit()) * 6.28;
static_cast<JPH::HingeConstraint*>(constraint)->SetMotorState(JPH::EMotorState::Velocity);
static_cast<JPH::HingeConstraint*>(constraint)->SetTargetAngularVelocity(-vel);
}
} else { } else {
panic(); panic();
} }