在一个操纵的人形上,我正在测试通过操纵肩关节的旋转来摆动右臂。在我的代码中,你看到有4个方法给出了手臂的不同末端位置。谁能解释一下为什么?
当我选择method=1时:手臂从正确的末端位置快速地一步步走到最终位置。然而最终位置是完全错误的。方法=2:同样是一步到最终位置。最终位置现在是正确的 方法=3:手臂缓慢地摆动到最终位置,误差较小(约1度) 方法=4:手臂快速摆动到最终位置,误差较大(几度)。
void Start()
{
shoulderR_AngleBegin = new Vector3(37.418f, 7.976f, -17.495f);
shoulderR_AngleEnd = new Vector3(-6.643f, -30.957f, -80.09f);
angle = shoulderR_AngleBegin;
}
// Update is called once per frame
void Update()
{
int method = 4;
float x, y, z;
x = this.shoulderR_AngleBegin.x;
y = this.shoulderR_AngleBegin.y;
z = this.shoulderR_AngleBegin.z;
if(angle.x > this.shoulderR_AngleEnd.x || angle.y > this.shoulderR_AngleEnd.y || angle.z > this.shoulderR_AngleEnd.z)
{
if(method==1)
{
this.angle = this.angle + (this.shoulderR_AngleEnd - this.shoulderR_AngleBegin);
}
else if(method==2)
{
this.angle.x = this.angle.x + (this.shoulderR_AngleEnd.x - this.shoulderR_AngleBegin.x);
this.angle.y = this.angle.y + (this.shoulderR_AngleEnd.y - this.shoulderR_AngleBegin.y);
this.angle.z = this.angle.z + (this.shoulderR_AngleEnd.z - this.shoulderR_AngleBegin.z);
}
else if(method==3)
{
this.angle.x = this.angle.x + (this.shoulderR_AngleEnd.x - this.shoulderR_AngleBegin.x) * Time.deltaTime;
this.angle.y = this.angle.y + (this.shoulderR_AngleEnd.y - this.shoulderR_AngleBegin.y) * Time.deltaTime;
this.angle.z = this.angle.z + (this.shoulderR_AngleEnd.z - this.shoulderR_AngleBegin.z) * Time.deltaTime;
}
else if (method==4)
{
this.angle.x = this.angle.x + (this.shoulderR_AngleEnd.x - this.shoulderR_AngleBegin.x) * Time.deltaTime * 8.0f;
this.angle.y = this.angle.y + (this.shoulderR_AngleEnd.y - this.shoulderR_AngleBegin.y) * Time.deltaTime * 8.0f;
this.angle.z = this.angle.z + (this.shoulderR_AngleEnd.z - this.shoulderR_AngleBegin.z) * Time.deltaTime * 8.0f;
}
}
this.ShoulderR.transform.localEulerAngles = angle;
}
'''
根据你的代码,是为了能够让手臂做不同的事情。你现在的情况,你是硬编码在哪个方法使用在
int method = 4;
使得其他方法被淘汰。
如果你具体问的是为什么不同的方法会产生不同的终点位置,那是由于每个选项内的代码造成的。方法一一般使用角度来设置位置。它不理会角度的组成部分。
其他方法都是设置角度的每一个轴(也可能是设置角度的xyz位置。我只能根据名字来猜测),但它们使用不同的函数来确定这个值。你可以看到,每个方法都会吸附一个值来乘以上一个方法的值。(他们在方法2之后为每个方法添加*一些值)
this.ShoulderR.transform.localEulerAngles = angle;
然后利用给定的角度来移动手臂。
如果你还是不确定它为什么会这样做,那么查一下三维坐标系中的角度信息会很有帮助。特别是看看笛卡尔坐标系,因为据我所知,代码使用的就是笛卡尔坐标系。物理学导论课本上应该有一些有用的信息。如果没有,那就查中级的书。我不记得我们到底是什么时候开始的,因为我有一个应用心理学学位,但我不是教授。
谢谢你布列塔尼,你的推理让我走上了正确的思维轨道。 我的猜测是由于减法中的 "角度翻转 "而出现偏差。 如:50°-170°可以是-120°或+240°。 我是用这个减法来计算角度的增加。我需要修改这个减法,才能使它不含糊。