从二月到五月的毕设答辩,期间发生了很多没有结果的事情,但做毕设这件事情是从一而终的贯彻到底哒,前期遇到了许多技术上的问题,幸运的是在网络中遇到了乐于助人的人们,大家的无私分享才使得我能顺利毕业,这个过程让我深深感受到了互联网的力量以及更加深刻的理解了网络世界里的共享思想。这里重点感谢@会思考的猴子、Robert Pinedo López等网友~
从目前来看,互动装置相关的技术在中国并未受到重视,学习资源的匮乏使得众多爱好者望而却步。从这个角度出发,我希望将学习到的内容分享出来,使更多的人学习、进步!(哈哈哈,好官方,但真是我初衷)

简介

项目的目标群体为老年人,所以采取Kinect身体识别这一功能作为主要的交互方式,简单易操作。画面默认为随机生成的粒子向下坠落,当Kinect检测到有人时,绘制对象的身形剪影,并可以与粒子产生物理碰撞的效果。每次识别到人时,则会生成有关戏曲的角色图片和对应的戏曲,人物的进入动作可以对图片和戏曲进行切换。(戏曲元素的设计是为了更加符合老年群体的兴趣特点)

相关技术

Toxiclibs图形绘制库

Toxiclibs是一个独立的开源库集合,用于Java和Processing计算设计任务,由Karsten开发。该库可用于生成设计、动画、交互/界面设计、数据可视化、架构和数字制作等方面。在该项目中,该库用于对人形的绘制。通过该库,将Kinect中识别到的用户数据转化为形状的模式,并绘制在画面中,该操作为后续的形状检测奠定了基础。

BlobDetection形状检测库

BlobDetection库旨在通过在图像上找到“斑点”来进行计算机视觉的开发,它检测的是画面中亮度高于或低于特定值的区域,允许计算斑点区域的边界,但是该库不可以进行斑点区域的追踪既位置信息的计算。主要应用在Processing中,但也可以在任何java程序中使用。该库在本项目中用于检测由Toxiclibs库生成的人体图形,并对图形的边缘进行检测。

Box2D碰撞检测库

Box2D是一个较为又名的2d物理引擎,有C++、flash和Java等版本。我们所采用的为Java版本,可支持在Processing中开发。Box2D的功能较为多样,包括连续碰撞检测、联系回调、凸多边形和圆形、每个身体多个形状、一次性接触歧管、动态树宽相;可以实现的物理效果有连续物理与冲击求解器的时间、持久的身体关节接触图、岛屿解决方案和睡眠管理、接触,摩擦和恢复原状、旋转,棱柱,距离,齿轮,鼠标接头等关节类型、关节限制,电击和摩擦等。在此项目中我们所采用的是碰撞与摩擦的功能,通过该功能实现粒子图案与人物角色的物理碰撞效果。

相关功能

Kinect识别人体部分

Kinect识别人体这部分在Processing中实现的方法主要运用KinectV2 for Processing库,通过该库调用用户的身体数据,在本项目中需要获取去除背景的人物身形的图像,Kinect.enableBodyTrackImg()函数即可实现。此时,当识别区内有用户时,可以在Processing中看到没有背景的白色填充的用户,画面中的用户可以实时复制用户的动作,可以简单理解Kinect为充当的是去除背景,白色填充的摄像机。

import Processing.opengl.*;
import KinectPV2.*;
KinectPV2 Kinect;
Kinect = new KinectPV2(this);
Kinect.enableBodyTrackImg(true);
Kinect.init();
cam = Kinect.getBodyTrackImage();
blobs.copy(cam, 0, 0, cam.width, cam.height, 0, 0, blobs.width,blobs.height);   //将图像复制到较小的blob图像中
blobs.filter(BLUR, 1);   //模糊斑点图像
theBlobDetection.computeBlobs(blobs.pixels);    //检测斑点
粒子生成部分

粒子生成部分将指定粒子在特定的范围内生成,从而搭配基础界面的设计。粒子将采用外部图片做替换,将外部导入的图片作为一个一个的粒子进行生成。图片的设计为戏曲角色,这部分将在Photoshop中进行。粒子生成的书写不需要引用库,Processing中自带的函数即可实现。

void makeBody(float x, float y) {
//在box2d世界坐标中定义一个位于xy的动态体,创建它并设置此box2d体的速度和角度的初始值
BodyDef bd = new BodyDef();bd.type = BodyType.DYNAMIC;bd.position.set(box2d.coordPixelsToWorld(new Vec2(x, y)));body = box2d.createBody(bd);body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 6)));body.setAngularVelocity(random(-5, 5));
//设置box2d半径为r的圆形CircleShape cs = new CircleShape(); cs.m_radius = box2d.scalarPixelsToWorld(r);//稍微调整一下圆圈的夹具FixtureDef fd = new FixtureDef();fd.shape = cs;fd.density = 1;fd.friction = 0.01;fd.restitution = 0.3;
人形转化为多边形形状部分

Kinect传进来的数据生成的图像没有经过处理只能具备视觉效果,若是想要与画面发生交互,需要对图像进行处理,使这些数据生成图形。具备图形的属性,这部分操作需要调用Toxiclibs库进行实现。

//将轮廓添加到多边形
ArrayList<PVector> c = contours.get(i); //ArrayList c =contours.get(i);     //没绘制出的人形转化为c,c的属性为PVector        PVector fp = c.get(0);    //fp为识别到每个人形的idPVector lp = c.get(c.size()-1);  //lp用来区分每个人形if (fp.y > KinectHeight-5 && fp.x < closestPoint.x) {closestPoint = fp;selectedContour = i;selectedPoint = 0;}if (lp.y > KinectHeight-5 && lp.x < closestPoint.y) { closestPoint = lp;selectedContour = i;selectedPoint = 1;              //区分每个人物数据}}}ArrayList<PVector> contour = contours.get(selectedContour);
if (selectedPoint > 0) {        // 添加的每个人形只能为形状Collections.reverse(contour);}for (PVector p : contour) {add(new Vec2D(p.x, p.y));}contours.remove(selectedContour);}}
形状检测部分

数据成为图形之后,需要对图形的边缘进行检测,对边缘的检测这步操作为之后的碰撞检测奠定了基础。实现该部分功能所引用的是BlobDetection形状检测库。

void createPolygon() {ArrayList<ArrayList> contours = new ArrayList<ArrayList>();int selectedContour = 0;int selectedPoint = 0;for (int n=0; n<theBlobDetection.getBlobNb(); n++) {   //从blob创建轮廓Blob b = theBlobDetection.getBlob(n);      //b为获取到的边缘检测后的人形数据if (b != null && b.getEdgeNb() > 100) {     //当有数据并且数据完整时生成坐标信息ArrayList<PVector> contour = new
ArrayList<PVector>();for (int m=0; m<b.getEdgeNb(); m++) {  //m为边缘的信息位置,对其进行判断EdgeVertex eA = b.getEdgeVertexA(m);   //eA,eB为人形顶点EdgeVertex eB = b.getEdgeVertexB(m);if (eA != null && eB != null) { EdgeVertex fn = b.getEdgeVertexA((m+1) % b.getEdgeNb());EdgeVertex fp = b.getEdgeVertexA((max(0, m-1)));float dn = dist(eA.x*KinectWidth, eA.y*KinectHeight,    //顶点与Kinect的尺寸进行匹配
fn.x*KinectWidth, fn.y*KinectHeight);float dp = dist(eA.x*KinectWidth, eA.y*KinectHeight,
fp.x*KinectWidth, fp.y*KinectHeight);if (dn > 15 || dp > 15) {                 //对数据信息的匹配进行优化,并且实时处理Kinectif (contour.size() > 0) {                 识别到的人物信息并进行更新contour.add(new PVector(eB.x*KinectWidth,
eB.y*KinectHeight));contours.add(contour);contour = new ArrayList();} else {contour.add(new PVector(eA.x*KinectWidth,
eA.y*KinectHeight));}} else {contour.add(new PVector(eA.x*KinectWidth,
eA.y*KinectHeight));}}}}
碰撞检测部分

最后的碰撞检测部分则调用的是Box2D碰撞检测库进行实现,该库是针对于2D图形进行物理化碰撞效果实现的库,这部分内容的实现是整个交互效果呈现的核心重要阶段,通过该库极大增加了项目最终的互动效果。

学习网站

  • OpenProcessing 里面有很多创意编程爱好者发布的小案例,全部开源
  • 各种交互装置的、视觉交互的、工业的设计案例,可培养设计思维
  • Thomas Sanchez,KinectPV2库的开发者的个人网站,里面详细解释了该库的功能以及项目源码
  • 最后就是 Daniel Shiffman大佬YouTube栏目The Coding Train(自行查找,我就不提供链接啦~)

项目地址

  • 视频地址
  • 项目源码

备注信息

  • 上面的代码并非整个模块的所有代码,只是一些核心内容
  • 项目的成功运行需要在Processing中安装相应的库文件
  • 仅供学习,禁止商用

【干货篇】Processing-Kinect人形物理碰撞效果相关推荐

  1. Unity3D屏幕划线附带物理碰撞效果

    Unity用LineRenderer实现的,让球体缘着划的线运动的重力效果.类似拯救火柴人的简单效果 Unity屏幕划线带重力刚体效果-Unity3D文档类资源-CSDN下载

  2. 虚幻4 ue4 学习笔记pwan篇 1.4 pawn结合UPawnMovementComponent类 移动组件实现 移动球体添加物理碰撞...

    MyPawn.h部分 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pra ...

  3. js实现椭圆轨迹_Canvas实现直线与圆形的物理运动效果

    导语:之前写过几篇关于canvas实现圆环动画的文章,例如这篇:canvas绘制旋转的圆环百分比进度条和使用HTML5 Canvas arc()绘制圆形/圆环,实现方法是通过循环绘制圆环(圆饼)等来实 ...

  4. Stanford UE4 UE5 C++ 开发 课程笔记(三)子弹物理碰撞与弹道校正

    Stanford UE4 & UE5 C++ 开发 课程笔记(三) 子弹物理碰撞与弹道校正 物理碰撞 1. 防止碰撞体 2. 自定义碰撞通道 3. 在Projectile蓝图类中设置碰撞 效果 ...

  5. wps在线预览接口_在线文档预览(干货篇)

    目前市面上的文档预览产品确实是五花八门,总的来说分两类产品:免费的产品很少也很局限,收费的产品很多很丰富但有坑!(这个坑嘛,大家都懂) 部分公司会选择自制文档预览功能,其实分析比较自制和外购两种方案, ...

  6. iOS UIKit Dynamics(物理碰撞,动画)

    早期技术文章搬家,原文链接 大部分人或许觉得动画用UIView 或是CoreAnimation的动画效果,那为何还需要UIKit 中的UIDynamic? 答:UIDynamic 为使用者提供更符合现 ...

  7. UEC++学习笔记(二)运动和物理碰撞(子弹)

    改进运动 控制旋转 第三人称游戏中的旋转,控制器的旋转并不等同于人物的旋转. 在角色bp中勾选了Use Contrtoller Rotation Yaw就会将控制器的旋转添加到角色的身上 我们应该把控 ...

  8. 【Unity探究】物理碰撞实验

    这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就是物理碰撞.以前没有好好研究过,一直模糊不清,到底什么条件下才可以产生物理碰撞呢?只要其中一个有Rigidbody就可以了吗?所以进 ...

  9. unity物理碰撞介绍

    物理碰撞介绍 1. 刚体(RigidBody)概述 刚体是使游戏物体(GameObject)拥有物理行为的主要组件(Component).添加刚体时,物体会立即响应重力(gravity).如果还添加了 ...

最新文章

  1. cmd orcal 中文乱码
  2. 如何判断当前UI component是运行在IC还是non-IC环境下
  3. 前端 input怎么显示null_小猿圈WEB前端之HTML5+CSS3面试题(一)
  4. Go Web编程--应用ORM
  5. suse linux 10 下载,SUSE Linux 10下载
  6. 如何制作优秀的PPT
  7. 【名企招聘】4月26日19点,涛思数据带着高薪岗位JD和精美周边来啦~
  8. 小白刷LeeCode(算法篇)2
  9. Java第一周学习总结
  10. 民办二本计算机专业学生出路何在?
  11. 我们如何造红色敞篷跑车
  12. 处方常用拉丁词缩写与中文对照表
  13. [deviceone开发]-纳豆项目源码开源
  14. 黑马VUE快速入门笔记
  15. win10关闭系统更新的设置
  16. 推荐系统实践读书笔记-05利用上下文信息
  17. MATLAB循环调用函数使用并行池指南(带非官方实际例子)
  18. Docker安装redis详细教程
  19. android打电话播放录音,安卓原生的拨号器应用通话录音功能已经到来但暂时还不能正常使用...
  20. 删除linux后,修复windows的启动项:MBRFix工具

热门文章

  1. 佳能5D4相机Motion JPEG编码4K MOV视频损坏修复
  2. jquery转盘抽奖活动代码
  3. 解决Masonry 中equalTo和mas_equalTo 乱用的问题
  4. spring源码分析之分析入口
  5. 手机号获取验证码:django版本2.2/ js
  6. 哈夫曼树的构造 java_Java实现哈夫曼树的构造
  7. 鹅厂员工告诉你面试互联网公司要不要穿正装
  8. 【Web前端】HTMLCSS一文详解
  9. 在VS中怎么用vb画矩形_PS神操作之这个凹陷怎么做?
  10. 菲涅尔透镜的原理及应用