手臂摆动与脊状人形

问题描述 投票:0回答:1

在一个操纵的人形上,我正在测试通过操纵肩关节的旋转来摆动右臂。在我的代码中,你看到有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;
    }
'''

c# unity3d rotation
1个回答
0
投票

根据你的代码,是为了能够让手臂做不同的事情。你现在的情况,你是硬编码在哪个方法使用在

int method = 4;

使得其他方法被淘汰。

如果你具体问的是为什么不同的方法会产生不同的终点位置,那是由于每个选项内的代码造成的。方法一一般使用角度来设置位置。它不理会角度的组成部分。

其他方法都是设置角度的每一个轴(也可能是设置角度的xyz位置。我只能根据名字来猜测),但它们使用不同的函数来确定这个值。你可以看到,每个方法都会吸附一个值来乘以上一个方法的值。(他们在方法2之后为每个方法添加*一些值)

this.ShoulderR.transform.localEulerAngles = angle;

然后利用给定的角度来移动手臂。

如果你还是不确定它为什么会这样做,那么查一下三维坐标系中的角度信息会很有帮助。特别是看看笛卡尔坐标系,因为据我所知,代码使用的就是笛卡尔坐标系。物理学导论课本上应该有一些有用的信息。如果没有,那就查中级的书。我不记得我们到底是什么时候开始的,因为我有一个应用心理学学位,但我不是教授。


0
投票

谢谢你布列塔尼,你的推理让我走上了正确的思维轨道。 我的猜测是由于减法中的 "角度翻转 "而出现偏差。 如:50°-170°可以是-120°或+240°。 我是用这个减法来计算角度的增加。我需要修改这个减法,才能使它不含糊。

© www.soinside.com 2019 - 2024. All rights reserved.