2D画人



#import <UIKit/UIKit.h>


@interface HumanView : UIView


@end





#import "HumanView.h"


#define TopX rect.size.width * 0.5

#define TopY 150

#define TopRadius 80



@implementation NJHumanView


- (void)drawRect:(CGRect)rect

{

    // 1.获取上下文

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    // 画身体

    [self drawBody:rect context:ctx];

    

    // 画眼镜

    [self drawEyes:rect context:ctx];

    

    // 画嘴

    [self drawMouth:rect context:ctx];

    

}


- (void)drawMouth:(CGRect)rect context:(CGContextRef)ctx

{

    

    // 控制点

    CGFloat controllerX = TopX;

    CGFloat controllerY = rect.size.height * 0.5 + 50;

    // 当前点

    CGFloat maginX = 20;

    CGFloat maginY = 10;

    CGFloat currentX =  controllerX - maginX;

    CGFloat currentY =  controllerY - maginY;

    CGContextMoveToPoint(ctx, currentX, currentY);


    // 结束点

    CGFloat endX = controllerX + maginX;

    CGFloat endY = currentY;

    

    // cpx/cpy 是控制点的位置

    // x/y 是结束点的位置

    CGContextAddQuadCurveToPoint(ctx, controllerX, controllerY, endX, endY);

    

    // 重新设置嘴的宽度

    CGContextSetLineWidth(ctx, 1);

    // 重新设置颜色

    [[UIColor blackColor] set];

    

    CGContextStrokePath(ctx);

}


- (void)drawEyes:(CGRect)rect context:(CGContextRef)ctx

{

    // 画眼镜

    CGFloat startX = TopX - TopRadius;

    CGFloat startY = TopY;

    // 设置起点

    CGContextMoveToPoint(ctx, startX, startY);

    

    // 设置终点

    CGFloat endX = TopX + NJTopRadius;

    CGFloat endY = startY;

    CGContextAddLineToPoint(ctx, endX, endY);

    

    // 设置线条宽度

    CGContextSetLineWidth(ctx, 18);

    

    

    // 重新设置颜色

    [[UIColor blackColor] set];

    CGContextStrokePath(ctx);

    

    // 画眼睛

    //    CGContextAddEllipseInRect(ctx, CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>))

    // 画大眼睛

    CGFloat leftRadius = 30;

    CGFloat leftX = TopX - leftRadius;

    CGFloat leftY = TopY;

    CGContextAddArc(ctx, leftX, leftY, leftRadius, 0, 2 * M_PI, 0);

    CGContextFillPath(ctx);

    

    // 画二眼睛

    CGFloat leftSmallRadius = 20;

    CGFloat leftSmallX = leftX;

    CGFloat leftSmallY = leftY;

    CGContextAddArc(ctx, leftSmallX, leftSmallY, leftSmallRadius, 0, 2 * M_PI, 0);

    [[UIColor whiteColor] set];

    CGContextFillPath(ctx);

}


- (void)drawBody:(CGRect)rect context:(CGContextRef)ctx

{


    // 2.绘制图形

    // 画上半圆弧

    CGFloat topX = TopX;

    CGFloat topY = TopY;

    CGFloat topRadius = TopRadius;

    CGContextAddArc(ctx, topX, topY, topRadius, -M_PI, 0, 0);

    

    // 画身体直线

    CGFloat middX = topX + topRadius;

    CGFloat middY = topY + 150;

    CGContextAddLineToPoint(ctx, middX, middY);

    

    

    // 画下半圆弧

    CGFloat bottomRadius = topRadius;

    CGFloat bottomX = topX;

    CGFloat bottomY = middY;

    CGContextAddArc(ctx, bottomX, bottomY, bottomRadius, 0, M_PI, 0);

    

    // 关闭路径

    CGContextClosePath(ctx);

    

    

    // 3.渲染图形

    [[UIColor colorWithRed:252/255.0 green:218/255.0 blue:0 alpha:1.0] set];

    CGContextFillPath(ctx);

}



@end







源码地址: https://pan.quark.cn/s/a4b39357ea24 欧姆龙触摸屏编程软件MPTST 5.02是专门为欧姆龙品牌的工业触摸屏而研发的编程解决方案,它赋予用户在直观界面上构建、修改以及排错触摸屏应用程序的能力。 该软件在工业自动化领域具有不可替代的地位,特别是在生产线监视、设备操控以及人机互动系统中发挥着核心作用。 欧姆龙MPTST(Machine Process Terminal Software Touch)5.02版本配备了多样化的功能,旨在应对不同种类的触摸屏项目要求。 以下列举了若干核心特性:1. **图形化编程**:MPTST 5.02采用图形化的编程模式,允许用户借助拖拽动作来设计屏幕布局,设定按钮、滑块、指示灯等组件,显著简化了编程流程,并提升了工作效率。 2. **兼容性**:该软件能够适配欧姆龙的多个触摸屏产品线,包括CX-One、NS系列、NJ/NX系列等,使用户可以在同一个平台上完成对不同硬件的编程任务。 3. **数据通信**:MPTST 5.02具备与PLC(可编程逻辑控制器)进行数据交互的能力,通过将触摸屏作为操作界面,实现生产数据的显示与输入,以及设备状态的监控。 4. **报警与事件管理**:软件中集成了报警和事件管理机制,可以设定多种报警标准,一旦达到预设条件,触摸屏便会展示对应的报警提示,助力操作人员迅速做出响应。 5. **模拟测试**:在设备实际连接之前,MPTST 5.02支持用户进行脱机模拟测试,以此验证程序的正确性与稳定性。 6. **项目备份与恢复**:为了防止数据遗失,MPTST 5.02提供了项目文件的备份及还原功能,对于多版本控制与团队协作具有显著价值。 7. **多语言支持**:针对全球化的应...
<think>好的,用户问的是“2D画人体动作捕捉跟随怎么做”,需要给出一个结构清晰的中文回答。首先,我需要回忆一下相关的技术流程和步骤。用户可能是个动制作者或者游戏开发者,想在自己的项目中实现动作捕捉后的动跟随,但可能对具体步骤不太熟悉,需要详细的指导。 首先,得分解问题。动作捕捉一般分为数据采集、处理、绑定和应用几个阶段。对于2D,可能和3D有些不同,但基本原理类似。用户可能想知道如何从真实的人体动作捕捉数据转化为2D角色的动作,让角色能跟随真实动作。 第一步,数据采集。需要说明使用的设备,比如摄像头、传感器,或者基于视觉的解决方案。比如现在很多使用单目摄像头结合AI算法,像OpenPose或者MediaPipe这样的工具可以提取关键点。这时候要提到具体的工具,可能用户需要知道开源或免费的工具,降低成本。 第二步,数据处理。捕捉到的原始数据可能有噪声,需要平滑处理,可能需要滤波算法,比如卡尔曼滤波或者移动平均。还要将坐标转换到动角色的空间,可能需要归一化,调整比例,或者旋转角度。这部分需要详细说明,因为数据处理是关键,否则动会不自然。 第三步,骨骼绑定。2D通常使用骨骼动系统,比如Spine或者DragonBones。需要将捕捉到的关键点与角色的骨骼关节对应起来,比如肩、肘、腕等。可能需要调整权重,确保动作自然。这里要举例说明,比如肩关节控制上臂,肘关节控制前臂,这样用户能明白如何映射。 第四步,动作跟随的实现。这里可能需要插值算法让动作过渡平滑,或者添加逆向运动学(IK)来解决末端效应器的问题,比如手的位置正确后,调整肘和肩的角度。还要提到如何实时驱动动,可能需要编程,比如在Unity中使用C#脚本,或者在游戏引擎中设置骨骼动的实时更新。 第五步,优化和调整。动作可能会有抖动,需要调整滤波参数,或者增加延迟补偿。另外,风格化处理,比如夸张某些动作,使动更符合艺术风格。这部分用户可能容易忽视,但很重要,因为直接捕捉的动作可能不够美观。 另外,可能需要分情况讨论,比如实时跟随和离线处理的区别。实时的话对性能要求高,可能需要优化算法;离线的话可以更精细地调整。还要提到一些实际应用,比如游戏开发中的角色控制,或者动制作中的快速原型设计。 还要考虑用户可能的资源限制,比如预算不足时,推荐使用免费工具如OpenPose和Blender结合,或者使用现成的插件。如果有编程能力,可以自己写脚本处理数据;如果没有,可能需要依赖现有软件。 最后,总结步骤,让用户有一个清晰的流程:采集数据、处理、绑定骨骼、驱动动、优化调整。提醒可能出现的问题,比如抖动或绑定错误,以及解决方法。可能还需要推荐一些教程或工具链接,帮助用户进一步学习。</think>2D画人体动作捕捉跟随的实现可分为以下核心步骤,需结合计算机视觉、动绑定和数据处理技术: --- ### 一、动作数据采集 1. **传感器方案** - **低成本方案**:使用单目摄像头+AI算法(如OpenPose、MediaPipe)提取人体关键点(17-25个关节点)。 - **高精度方案**:穿戴式惯性传感器(如Xsens)或光学标记系统(需红外摄像头)。 2. **数据输出格式** - 关键点坐标($x_i, y_i$)序列,通常保存为JSON或CSV文件,包含时间戳信息。 --- ### 二、数据预处理 1. **降噪平滑** - 应用**卡尔曼滤波**或**Savitzky-Golay滤波器**消除抖动,公式示例: $$\hat{x}_t = \alpha x_t + (1-\alpha)\hat{x}_{t-1} \quad (0<\alpha<1)$$ 2. **坐标系转换** - 将摄像头坐标系映射到动角色坐标系,需计算仿射变换矩阵: $$\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \end{bmatrix}$$ --- ### 三、骨骼绑定与权重分配 1. **2D骨骼系统搭建** - 使用工具(Spine、DragonBones)创建层级化骨骼,例如: ``` 躯干 → 上臂_L → 前臂_L → 手_L ↓ 上臂_R → ... ``` 2. **关键点映射** - 定义关节点对应关系(如:MediaPipe手腕点 → 骨骼手部控制器)。 --- ### 四、动作跟随实现 1. **实时驱动方法** - **直接驱动**:将关键点坐标直接赋给骨骼控制器(需归一化处理)。 - **逆向运动学(IK)**:通过目标位置反推关节旋转角,例如手臂末端(手)位置驱动肘、肩关节。 2. **插值优化** - 使用四元数插值(Slerp)或贝塞尔曲线实现平滑过渡,避免机械感。 --- ### 五、调试与优化 1. **常见问题解决** - **抖动问题**:增大滤波窗口或加入运动趋势预测(如线性回归)。 - **穿模问题**:设置碰撞体约束(如手臂不可穿透胸腔)。 2. **风格化调整** - 添加动作夸张系数,例如将旋转角度放大1.2倍: $$\theta' = 1.2 \cdot \theta$$ --- ### 六、工具链推荐 | 阶段 | 开源方案 | 商业软件 | |------------|--------------------------|-------------------| | 数据采集 | MediaPipe + Python | Adobe Character Animator | | 骨骼绑定 | DragonBones | Spine | | 引擎集成 | Unity 2D Animation | Cocos Creator | --- ### 七、扩展应用 - **实时场景**:直播虚拟偶像(VTuber)驱动,延迟需控制在<100ms。 - **离线制作**:批量处理捕捉数据后手动修帧,适用于电影级动。 通过上述流程,可实现从真人动作到2D角色的高精度跟随,需注意不同动风格(卡通、写实)需调整映射参数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值