[从头学绘画] 第05节 计算函数


<span style="font-size:18px;">#
def person():

    def cos_(angle):
        return math.cos(angle / 180 * math.pi);

    def sin_(angle):
        return math.sin(angle / 180 * math.pi);
    
    res = [];

    height = 1700
    #upBody 上身长 -- 指脖底到大腿顶
    upBody = round((height*75/160)-300);

    #大腿
    bigLeg = round((height-300-upBody)*40/85);
    #小腿
    smallLeg = round(height-300-upBody-bigLeg);
    #大臂
    bigArm = round((upBody*55/45)*0.6);
    #小臂
    smallArm = round(bigArm*0.67);

    #手掌
    halm = 100;
    #脚掌
    foot = 150;

    #旋转,所有旋转都分XY平面角度/YZ平面角度
    halm_rot_1 = [0, 60];
    halm_rot_2 = [0, 150];

    smallArm_rot_1 = [0, 30];
    smallArm_rot_2 = [0, 160];
    smallArm_rot_3 = [0, 220];

    bigArm_rot_1 = [0, 120];
    bigArm_rot_2 = [0, 180];

    foot_rot_1 = [0, 60];
    root_rot_2 = [0, 30];

    smallLeg_rot_1 = [0, 160]

    bigLeg_rot_1 = [0, 180];
    bigLeg_rot_2 = [0, 150];
    bigLeg_rot_3 = [0, 90];


    #旋转, 左肢角度取正值,右肢脚度取负值
    neckRot = 90;
    
    lBigArm = 30; #取值范围 20 -> 160    
    rBigArm = -30; #取值范围 -20 -> -160

    lSmallArm = -10;
    rSmallArm = 10;


    lBigLeg = 130; #取值范围 -10 -> -120
    rBigLeg = -130; #取值范围 10 -> 120

    lSmallLeg = -60;
    rSmallLeg = 60;      

    lHalm = 160;
    rHalm = -160;

    lFoot = 30;
    rFoot = -30;

    upBodyCurveRate = 0;
    neckEndAngle = -90 / 180 * math.pi;
    midBodyAngle = -90 / 180 * math.pi;

    #长度投影系数
    proj_lBigArm = 1 * cos_(60);
    proj_lSmallArm = 1 * cos_(60);
    proj_lHalm = 1;

    proj_rBigArm = 1 * cos_(60);
    proj_rSmallArm = 1 * cos_(60);
    proj_rHalm = 1;

    proj_lBigLeg = 1 * cos_(5);
    proj_lSmallLeg = 1 * cos_(30);
    proj_lFoot = 1 * cos_(15);

    proj_rBigLeg = 1 * cos_(5);
    proj_rSmallLeg = 1 * cos_(30);
    proj_rFoot = 1 * cos_(15);
    
    #长度
    lBigArm_len = round(bigArm * proj_lBigArm);
    rBigArm_len = round(bigArm * proj_rBigArm);

    lSmallArm_len = round(smallArm * proj_lSmallArm);
    rSmallArm_len = round(smallArm * proj_rSmallArm);

    lHalm_len = round(halm * proj_lHalm);
    rHalm_len = round(halm * proj_rHalm);

    lBigLeg_len = round(bigLeg * proj_lBigLeg);
    rBigLeg_len = round(bigLeg * proj_rBigLeg);

    lSmallLeg_len = round(smallLeg * proj_lSmallLeg);
    rSmallLeg_len = round(smallLeg * proj_rSmallLeg);

    lFoot_len = round(foot * proj_lFoot);
    rFoot_len = round(foot * proj_rFoot);

    
    #四肢路径
    a = Sketch();
    a.curve(314, -1/100); #曲率半径10cm
    a.addAngle(neckRot);
    a.curve(100, 0);
    a.startAngle = neckEndAngle;
    a.addAngle(rBigArm);
    a.curve(rBigArm_len);
    a.addAngle(rSmallArm);
    a.curve(rSmallArm_len);
    a.addAngle(rHalm);
    a.curve(rHalm_len);

    res.append(a.linkPath());

    
    b = Sketch();
    b.addAngle(180);
    b.curve(314, 1/100); #逆时针半圆
    b.addAngle(-180);
    b.startAngle = neckEndAngle;
    b.curve(100, 0);
    b.addAngle(90-neckRot);
    b.addAngle(lBigArm);
    b.curve(lBigArm_len);
    b.addAngle(lSmallArm);
    b.curve(lSmallArm_len);
    b.addAngle(lHalm);
    b.curve(lHalm_len);

    res.append(b.linkPath());
    
    c = Sketch();
    c.curve(314, -1/100); #曲率半径10cm
    c.addAngle(neckRot);
    c.curve(100, 0);
    c.startAngle = neckEndAngle;
    c.curve(upBody, upBodyCurveRate);
    c.startAngle = midBodyAngle;
    c.addAngle(rBigLeg);
    c.curve(rBigLeg_len, 0);
    c.addAngle(rSmallLeg);
    c.curve(rSmallLeg_len, 0);
    c.addAngle(rFoot);
    c.curve(rFoot_len);

    res.append(c.linkPath());

    
    d = Sketch();
    d.curve(314, -1/100); #逆时针半圆
    d.addAngle(180); #先转半圈
    d.addAngle(neckRot);
    d.addAngle(-180); #再退回去
    d.curve(100, 0);
    d.startAngle = neckEndAngle;
    d.curve(upBody, upBodyCurveRate);
    d.startAngle = midBodyAngle;
    d.addAngle(lBigLeg);
    d.curve(lBigLeg_len, 0);
    d.addAngle(lSmallLeg);
    d.curve(lSmallLeg_len, 0);
    d.addAngle(lFoot);
    d.curve(lFoot_len);

    res.append(d.linkPath());  

    print(res);

if __name__ == '__main__':
    person();

#</span>

本节到此结束,欲知后事如何,请看下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值