【发布时间】:2015-09-13 19:36:45
【问题描述】:
我有一个类似手臂的物体,带有 2 个可配置的关节,依次连接到运动学底座。每个关节都配置为围绕单个轴的旋转关节。
用户可以移动每个关节,当涉及碰撞时会出现问题。每个关节的所需角度已设置,但如果有物体挡住,关节将继续尝试移动到该目标角度,无论碰撞如何,该角度都会继续增加。
如果现在移动关节 2 以使关节 1 现在能够移动到其目标角度,则会产生捕捉动作并且是不可取的。
在链接的统一包中是我解决这个问题的尝试。我正在将实际关节角度与所需角度进行比较,如果它们的差异超过某个阈值,则所需值会降低。这适用于joint1,但joint2存在问题,即使我尝试允许其父关节旋转。
我希望可能有不同的方法来解决这个问题。我尝试使用定向“目标角速度”而不是设置所需的“目标旋转”,但是我需要关节以恒定速度移动,并且当使用“目标角速度”时,这更难实现为重力(其中需要保持打开)和其他问题影响速度。
网页播放器:http://beinginsight.co.uk/questions/JointAngleProblem/
UnityPackage:http://beinginsight.co.uk/questions/JointAngleProblem/JointAngleProblem.unitypackage
键: 联合1:问/答 关节2:W/S
我认为这将是一个微不足道的问题,但似乎我花了很长时间试图让它正常工作。
提前感谢您的帮助。
PS:正如您将在包中看到的那样,我一直在尝试一些不同的方法,但均无济于事,这里有一些代码可以吸引您的帮助;
// Restrain pos by actual joint angle; in case of collision
// a is only the smallest/unsigned angle, need signed angle to calculate differnce
//TODO: Been trying different ways to calculate angle, none ideal so far, please help
float a = getAngularPositionQuat(Inputs[i].JointObject, Inputs[i].Quant); // Compensates for 'initial angle' too
//float a = Quaternion.Angle(getJointRotation(Inputs[i].JointObject), Inputs[i].Quant);
//float a = JointInput.DirectionalAngle( Inputs[i].JointObject.connectedBody.transform.up,
// Inputs[i].JointObject.transform.up, -Inputs[i].JointObject.connectedBody.transform.forward);
// Find direction of angle with consideration to parent/world rotations
Vector3 dirr = Inputs[i].JointObject.connectedBody.transform.InverseTransformDirection( Inputs[i].JointObject.gameObject.transform.up); //localPosition
【问题讨论】: