利用Unity3D与Oculus实现机器情绪安抚师的一种方案

(一张最原始的Unity3D中音乐可视化粒子海的图,想象一下,如果这幅场景出现在虚拟设备中,辅以根据音乐频谱变化的色彩与悦动频率,会是怎样的效果呢?)
Unity3D有着非常完备的虚拟三维场景交互开发功能,以Oculus为代表的虚拟现实设备又有着极强的视觉感染力,一副不错的耳机可以产生身临其境的听觉效果(在这里我使用的是森海塞尔头戴式耳机),我认为结合这三者进行开发可以对人的情绪产生非常显著的影响效果,“机器情绪安抚师”系统的开发就是基于这个比较理想化的想法,这套系统经过实验证明可以在一定程度上让人的情绪趋于缓和,从而更专注于需要做的事。我与几位小伙伴曾经基于这套系统撰写论文并投稿给人机交互领域顶级会议SIGCHI,最终并没有被接收,但我依然相信这种思路是可行的,并且会随着硬件的进步以及人类情绪识别技术的发展变得更加吸引人。
总框架设计

总体上说,我们是通过移动端来识别用户情绪,然后通过情绪模型获知用户情绪的反向情绪,再通过反向情绪精准地匹配服务器中的音乐,然后将音乐传至虚拟现实设备端,再通过音乐可视化算法输出音乐可视化内容。细节内容在下面这张系统架构图中有所展现。

情绪识别
为了完成情绪识别方面的工作,我开发了一款安卓端的手机应用,其中主要采用的是Emokit情绪检测接口(http://www.emokit.com/),实现了用户可以利用智能手机随时随地对情绪进行多通道的检测与记录,客户端的几张截图如下所示。




情绪模型
在获知了用户情绪后,需要将情绪在某个权威的情绪模型中进行精准的定位以及数字化存储,这里采用的是心理学领域具有权威性的普拉奇克情绪三维模型。

普拉奇克(Plutchik)认为情绪是多维的,它包括强度、相似性和两极性三个维度。即(1)所有的情绪都能表现出不同的强度,如不同程度的愉快或悲伤;(2)不同的情绪在感受上的相似性,如快乐和期待、厌恶与惧怕等;(3)两极性是指感受完全不同的两种情绪,如悲痛与狂喜等。普拉奇克采用一个橘瓣体来形象的描述三个维度之间的关系(类似于八色相环),每个橘瓣体代表一类基本情绪,即狂喜、接受、惊奇、恐惧、悲痛、憎恨、狂怒和警惕。在这个橘瓣体中最强烈的情绪位于上部,越往下情绪强度越弱;对角位置的情绪表现出两极性;相邻的情绪具有相似性。
这个模型非常适合用于数字化地表示与存储用户情绪,原因主要是它可以很好地映射在二维坐标系中,并可以利用情绪点距离清楚地表现情绪激烈程度。在实际运用过程中,我们发现这个模型的效果确实是卓越的。
音乐可视化

(系统实际使用照片)
音乐可视化是本项目中非常重要的一环,从某种程度上说,音乐可视化效果的优劣直接影响用户沉浸感的好坏。由于本项目的音乐可视化内容是展现在Oculus端,所以有关音乐可视化的开发主要是基于Unity3D平台进行的。所运用到的原理主要是在Unity场景中构建粒子系统,然后根据音乐的频谱去改变光影粒子系统中各粒子的高度与颜色进而产生音乐可视化效果。
注:我乐意将这里的音乐可视化代码进行开源,需要的可以在博客下评论告诉我。
最终,通过两种方式进行了系统有效性的实验,一种是依靠高性能中心中的沉浸式旋转座椅与心电设备做了专业级别的测试与比对,另一种是找到了40位志愿者进行测试,我们通过情绪刺激、情绪检测、情绪调节、二次情绪检测的方式对每一位志愿者进行测试,最终结果表明,这套系统确实对于帮助用户情绪趋于稳定具有显著的效果。其中在消除负面情绪方面的作用效果要优于在舒缓激烈情绪方面的作用效果。

备注:本人非常乐意分享我的文章,转载请注明我的博客地址:http://www.cnblogs.com/matthewli/与原文地址:http://www.cnblogs.com/matthewli/p/7247622.html,谢谢!
利用Unity3D与Oculus实现机器情绪安抚师的一种方案的更多相关文章
- 利用Unity3D实现多平台增强现实网络游戏的一种方案
这几天去厦门参加了VALSE2017会议,对于其中某个环节展示的有关增强现实游戏的部分印象深刻.因为前两年一度沉迷于利用各类引擎开发游戏,所以也曾经以Pokemon GO为模板开发过一款多平台增强现实 ...
- [20171221]利用rman实现2台机器文件拷贝.txt
[20171221]利用rman实现2台机器文件拷贝.txt --//昨天使用rman duplicate建立dg,我看到执行如下代码: RMAN> duplicate target datab ...
- 利用Unity3D制作简易2D计算器
利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...
- 利用Powershell获取公司内部机器的资源信息,作为企业兴许资产管理的基本途径!
今天一个哥们问我是否用Powershell 实现.我好久没有写脚本,脚本的协作和调试还是费了一些时间,兴许调试了下.运作没有问题,大家能够參考以下的脚本来丰富您企业须要做的一些事情,脚本代码例如以下: ...
- 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...
- 利用Telnet来模拟Http请求 有GET和POST两种
利用Telnet来模拟Http请求---访问百度. 1.打开"运行"->cmd进入命令环境: 2.输入"telnet www.baidu.c ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...
- 利用adb查看手机设备ip和连接手机的两种方式
电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...
随机推荐
- C#从基于FTPS的FTP server下载数据 (FtpWebRequest 的使用)SSL 加密
FTPS,亦或是FTPES, 是FTP协议的一种扩展,用于对TLS和SSL协议的支持. 本文讲述了如何从一个基于FTPS的Server中下载数据的实例. 任何地方,如有纰漏,欢迎诸位道友指教. ...
- Nginx实用教程(一):启动、停止、重载配置
Nginx是一个功能强大的web服务器和负载均衡软件,由俄罗斯人开发.Nginx包括一个master进程和数个worker进程,master进程用于读取.解析配置文件和管理worker进程,worke ...
- php 数据访问基础
<?php // 创建数据库连接 $con = mysql_connect("localhost",'root','') or die('error:'.mysql_erro ...
- 【原创】源码角度分析Android的消息机制系列(三)——ThreadLocal的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Android源码(API24)中对ThreadLocal的定义: public class ThreadLocal<T> 即 ...
- Centos常用命令及解释
ps -ef|grep java ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. grep命 ...
- Linux网络服务12——NFS共享服务
Linux网络服务12--NFS共享服务 一.NFS简介 端口号:TCP.UDP 111端口 NFS(Network File System)网络文件系统,是一种基于TCP/IP传输的网络文件系统协议 ...
- TortoiseGit保存密码
TortoiseGit保存密码 方法一:使用Bash命令 1.设置name和emailgit config --global user.name "yilei"git config ...
- Java软件系统功能设计实战训练视频教程
Java软件系统功能设计实战训练视频教程 第01节课:整体课程介绍和杂项介绍第02节课:软件功能设计常见理念和方法第03节课:关于软件设计的一些思考第04节课:第一周作业的业务和相应模式:综合应用简单 ...
- 几种MQ消息队列对比与消息队列之间的通信问题
消息队列 开发语言 协议支持 设计模式 持久化支持 事务支持 负载均衡支持 功能特点 缺点 RabbitMQ Erlang AMQP,XMPP,SMTP,STOMP 代理(Broker)模式(消息在发 ...
- 获取元素到body/html的距离函数
获取元素到body的距离: <script> function offsetDis(obj) { var l = 0, t = 0; while(obj) { l = l + obj.of ...