PxJointAngularLimitPair limitPair(min, max, tolerance));
limitPair.spring = ....弹力...;
limitPair.damping = ....摩擦力;
revolute->setLimit(limitPair);
revolute->setRevoluteJointFlag(PxRevoluteJointFlag::eLIMIT_ENABLED, true);
PxJointAngularLimitPair limit(min, max, tolerance)
limit.bounceThreshold = minBounce;
limit.restitution= maxBounce;
revolute->setLimit(limit); // upper, lower, tolerance
revolute->setRevoluteJointFlag(PxRevoluteJointFlag::eLIMIT_ENABLED, true);
这个功能的作用就是给Joint设置一个旋转速度,像发动机一样。
用Revolute Joint实现Motor:
joint->setDriveVelocity(目标速度);
joint->setDriveForceLimit(force);
joint->setConstraintFlag(PxConstraintFlag::eDRIVE_LIMITS_ARE_FORCES, true);
revolute->setRevoluteJointFlag(PxRevoluteJointFlag::eDRIVE_ENABLED, true);
if(需要平滑)
{
revolute->setRevoluteJointFlag(PxRevoluteJointFlag::eDRIVE_FREESPIN, true);
}
最后,如果要设置Joint的轴,也就是U3D里面的axis,需要算一下Joint每个锚点的。
设置joint的轴的朝向,就是设置Joint的两个锚点的旋转。
physx 3.3.4中Joint轴的默认朝向是x轴,也就是(1,0,0).
假设旋转后的轴为(A,B,C),我们需要算出旋转矩阵是多少。
设旋转矩阵为
x1,x2,x3
R=[ y1,y2,y3 ]
z1,z2,z3
那么(1,0,0)叉乘R的结果为
(x1,x2,x3)
且我们得知旋转后的轴为(A,B,C).
所以旋转矩阵为
A , 0, 0
R=[ B , 0,0]
C ,0,0
最后我们通过旋转矩阵初始化一个四元素 ,
PxQua qua(R);
调用
revolute->setLocalPose(PxTransform(pos,qua));
这样轴的旋转就完成了。