交互式VR电容器


平板电容是大学物理教学中的一个基本模型,在课堂与实验教学中都具有其代表性. 在传统课堂教学中,对于其电场线的绘制多为简单示意图;传统实验教学中,在研究其两板间距与板倾角对于其电容的影响时,一般通过测量电容,分析计算.
而如今,随着虚拟现实(VR)技术的逐渐成熟和广泛应用,我们可以借助虚拟仿真技术,建立VR平板电容模型,绘制渲染其电场线,并通过VR交互式系统,在安全的环境下抓取,移动,旋转带电平板,观察其电场线的变化,更为直观地认识到各个因素对于平板电容电场线(包括其边缘效应,场强大小)的影响,从而对这一物理问题有更加生动的认识. 本文将主要介绍VR平板电容的搭建方法,以及交互式功能的使用方法.









本文模型主要使用Unity 2018 3.9f1搭建,由点击程序生成的exe文件进入. 虚拟现实系统的其他软件与程序包包括SteamVR,VRTK等,硬件主要包括VR头戴式显示器(头显),定位光塔,VR手柄(左右手各一支)和计算机,如下图所示. 另外,VR头戴式显示器上配有耳机,VR手柄的按键如下图所示,其中“1”键为菜单键,其余“2”“7”“8”键在平板电容交互式系统中的功能将在下详述.

本文所介绍平板电容交互式系统中,基本架构为MVC式,其中,M指Model为模型,即控制电场线计算的代码,V指View为用户视图,即控制用户在VR系统中所观看到的物体、电场线等的代码,C指Controller为控制器,即控制用户界面与模型计算等交互的代码. 这样的程序架构,使得程序开发与测试更加清晰.

刷新

刷新功能分为实时刷新与延时刷新. 其中,实时刷新的实现方法为,程序每隔一定时间(如0.1s)自动检测物体位置并根据其位置计算渲染电场线. 对这一方法比较直接的改进是,每隔一定时间自动检测物体位置,若位置改变,则根据物体新位置重新计算渲染电场,若无改变,则不刷新电场线. 除上述改进方法外,也可通过增大刷新间隔,如变为1s检测一次物体位置改变,来减少运算量.
相比之下,延时刷新则可大幅度减少运算量. 延时刷新指的是,检测到物体被抓取时,程序使电场线消失,而后抓取结束,物体位置固定时,程序根据检测到的物体位置计算渲染出新的电场线分布. 本文所介绍的系统主要采用延时刷新方法.

移动与抓取

基本的移动功能和抓取功能由调用VRTK中的函数,以及与本系统功能适应的InteractableObject_Attach.cs脚本,挂在相应物体上实现. VR手柄的按键设置如图6所示.
移动功能由VR手柄的“2”键(触摸板)控制. 其中. 触摸触摸板上部(由下向上滑动也可,后)为前进,下部为后退,左部为向左移动,右部为向右移动. 另外,点击触摸板的相应部分也有同样效果.
抓取功能由VR手柄侧面(右手VR手柄的左侧,左手反之)按键“8”控制. 当用户操作手柄接触到VR系统中物体时,物体边缘会呈现橙色,如下图所示,此时,按下“8”键实现抓取,电场线自动消失. 之后,可以松开“8”键,将已抓取的物体自由旋转移动(移动操作如上文所述),至再次按下“8”键放下所抓取物体,系统根据物体新位置重新渲染电场线.


改变板子的大小

改变板子的大小由系统中帆布(canvas)及其上悬挂的按键(button)与VR手柄控制,帆布与按键的设置如下图所示.

其中,改变板子的大小由“方形板改变大小”与“圆形板改变大小”键控制,点击该键的方法为,扣住VR手柄背面扳机“7”键,此时视野中会观察到由手柄射出的一条射线,将该射线对准帆布上相应按钮后松开扳机“7”键,则可以实现对按钮的点击. 点击改变大小键后的用户视图中的部分景象如下图(a)(b)所示.


预制件与归位系统

系统的归位功能由预制件实现,即通过GameObjectLoader.cs等脚本将需要加载的物体制作为一个预制件,在点击归位键时,系统根据程序检测并去除场景中已有的物体,重新加载该键对应的预制件,并调用电场线绘制相关程序渲染电场线,回归到场景最初的状态. 归位功能由帆布上的“方形板归位”与“圆形板归位”键控制,使用VR手柄的点击方法同2.2.3中的描述. 事实上,2.2.3中改变板子的大小也由预置件实现,同理,可以实现各种形状大小的板子的加载. 点击归位键后的用户视图中如上图(c)(d)所示.

增加板子的数量

增加板子的数量这一功能同样依靠预制件的制作实现,值得注意的是,新增板子的产生位置固定,所以在多次增加新带电薄板时,应将之前增加的带电薄板移动位置,才可以观察到下一增加的带电薄板. 增加板子的数量这一功能由帆布第一行与第三行“+”、“–”键控制,其中,首行“+”、“–” 键分别代表增加一正方形带正、负电薄板,第三行的“+”、“–”键分别代表增加一圆形带正、负电薄板.

其他功能

除上述功能外,该系统还有部分未由帆布集成功能,如可以通过调整PlayerRig这一预制件的高度,实现用户身高的变化,多角度操作平板系统,以及,可以通过改变新的生成物体的位点,实现在某些特殊位置定点出现新物体等.

  • 2019.03.04

熟悉VR头戴式显示器与VR手柄的使用,包括按键、连接、充电等。 P. S. 可以戴眼镜戴VR显示器

  • 2019.03.09

选题思路[1]-[5]: 1. 带电体表面电荷分布(这一块的知识,包括尖端带的电荷多等,一直都是从课本的二维图画中获得,如果能用VR模拟出来会更具有直观性) 2. 电场线随带电物体相对位置的变化而变化(之前有同学做过电场线的绘制,我觉得如果有一些动态的展示会更直观互动性更强一些) 3. 磁感线 另外,可能可以做一些量子力学的相关模拟[6],包括观测使波函数坍缩等,因为这一块由于尺度比较小等原因平时理解起来并不是很直观;或者是一些尺度比较大的天体运动;再或者是一些比较危险现实中不太方便做的实验也可以用VR来做,还在继续考虑中。 Reference: [1]. Maroon VR demo, https://www.youtube.com/watch?v=iGuzgi-hfcM [2]. https://www.vrlabacademy.com/ [3]. http://jpirker.com/wp-content/uploads/2013/09/icalt2017-maroon-vr.pdf [4]. https://jpirker.com/maroon [5]. https://sciencevr.com/lab/faraday/ [6]. Visualization of QM, https://www.bilibili.com/video/av39800934/?p=11

  • 2019.03.11

下载并安装Visual Studio 2017,学习《C#入门经典》第一、二、三章。下载并安装Unity2018,新建了一个项目进行了一些简单的尝试,从github上下载了VRTK与SteamVR plugin,初步熟悉案例库。 选题思路: 1. 液体表面张力的测量(继续确定具体实验细节) 2. 平板电容器(有倾角,可移动距离等)

  • 2019.03.18

学习《C#入门经典》第四、五、六章。继续熟悉VRTK的案例库,了解到抓取行走等基本操作。学习Github的基本操作。

  • 2019.03.20

学习《C#入门经典》第七、八、九章,重点学习了“类”的概念,并建立unity项目进行尝试,学习了场景的要素和初步的场景搭建方法。继续熟悉VRTK的案例库。

  • 2019.03.25

学习《C#入门经典》第十、十一、十二章,重点理解了泛型的概念。继续熟悉VRTK的案例库。确定选题为VR交互式平板电容器。

  • 2019.04.01

使用Mathematica计算平板电容的电场,并绘制其矢量图,尝试扫描法利用其解析式在VR系统中绘制电场线。

  • 2019.04.04

尝试有限元法解微分方程计算电场分布,调试程序。学习MVC的程序架构,建立Unity程序的基本框架。

  • 2019.04.08

继续尝试有限元法解微分方程计算电场分布,调试程序。继续学习Unity的操作,学习了通过程序将可调节参数生成在面板中的操作。

  • 2019.04.12

尝试使用简单的步进法绘制电场线,以点电荷为切入点编写并测试绘制以及实时刷新电场线的功能,测试初始点的选取对于步进法的影响。

  • 2019.04.15

尝试使用步进法与积分得到的严格解析式绘制渲染电场线,编写并调试程序。

  • 2019.04.18

尝试使用步进法与点电荷模型绘制渲染电场线,编写并调试程序。

  • 2019.04.22

确定使用步进法与点电荷法绘制电场线,调整VR系统中用户看到的图像使其更加美观。

  • 2019.04.26

将实时刷新功能变为延时刷新,使得程序运行效率显著提高,在电脑的VR模拟器上调试项目。

  • 2019.04.28

学习如何集成并生成可直接运行的exe文件,在实验室VR系统上调试项目,重点调试抓取移动功能。

  • 2019.04.29

期中报告

  • 2019.05.06

观察到电场线绘制在系统不对称时出现断线的现象。考虑到圆形板的对称性更高,电场线绘制可能会更加美观,尝试建立圆形平板电容模型并绘制其电场线。

  • 2019.05.09

尝试修改电场线绘制的算法,继续使用步进法,更改电场线的终止位置与步进方向,将终止位置改为靠近电荷或远离电荷处,步进方向改为电场方向。同时学习着色器的使用,尝试画出电势。

  • 2019.05.13

继续尝试修改电场线绘制的算法和学习着色器的使用。

  • 2019.05.16

继续尝试修改电场线绘制的算法和学习着色器的使用。学习预制件功能的实现与使用方法,为系统添加归位功能。

  • 2019.05.20

继续尝试修改电场线绘制的算法和学习着色器的使用,包括顶点着色器和片元着色器。使用mathematica计算电势的表达式。

  • 2019.05.23

由于电场线的步进方法需要考虑起始电荷的电量正负,继续尝试修改电场线绘制程序。尝试电势的绘制。

  • 2019.05.30

基本完成电场线绘制渲染程序的编写,进行调试,搭建了几个新模型,包括多板,变形后的板子等。尝试绘制电势。

  • 2019.06.03

由于体系对称性较低,电势的绘制较难实现。集成体系已有功能,学习VR系统中帆布与按键的搭建,以及与用户的交互方法。设置预制件。

  • 2019.06.07

集成体系已有功能,修改调试使其更加美观,完善与用户的交互功能。

  • 2019.06.10

期末报告 (晚上,使用数组管理体系中的物体,修复了体系生成多个相同物体时的bug)

  • 集成实现用户身高的变化,多角度操作平板系统的功能
  • 集成在某些特殊位置定点出现新物体的功能
  • 电势的绘制渲染
  • 对这一模型进行改善,使其电荷分布可根据物体的相对位置改变,更接近实际


  • [1]. 贾起民, 郑永令等. 电磁学 * [M]. 北京:高等教育出版社, 2010.5.
  • [2]. 蔡圣善, 朱耘等. 电动力学 * [M]. 北京:高等教育出版社, 2002.7.
  • [3]. 冀盼, 谢懿德. VR开发实战 * [M]. 电子工业出版社,2017.1.
  • [5]. Watson K , Christian Nagel等. C#入门经典 * [M]. 清华大学出版社, 2010. 12.
  • [6]. 江俊勤. 基于Mathematica的数字化物理学 * [M]. 科学出版社, 2015. 12.
  • [7]. 冯乐乐. Unity Shader入门精要 * [M]. 北京:人民邮电出版社, 2016.6


感谢吕景林老师,黄文恺学长,助教胡琼同学的帮助!

  • course/demo/projects/2019/interactive_vr_charged_plate.txt
  • 最后更改: 2019/06/16 12:26
  • 由 xiaokun