VR的本质在我看来就是对现实世界的模拟和重现。从一定程度上接管了人类的视觉和听觉系统,使得人们可以只透过VR眼镜就可以低成本地获取各种非常真实的体验。这里的低成本可以是金钱的成本,时间的成本和位移的成本。随着信息的爆发,以及获取信息的途径的便捷,人们也越来越希望通过有限的个体寿命来获取更多的信息和体验。人们热衷于刷各种短视频可能也有这方面的原因,瘫在沙发上就可以惊叹世间的无奇不有。
这也是我选择做这个原因,我觉得未来人们会越来越离不开虚拟的世界,虚拟世界的出现将会改变这个世界。虚拟世界可以减少交通拥堵,减少能源的消耗,也就意味着更少的尾气,更少的垃圾产生,更少的环境污染。因此我希望在搭建虚拟世界的这条路上能有所为。
这个项目是结合这些想法的一个demo,我用模拟的想法来,模拟计算机基本逻辑元件,连接件,操作件,然后通过这些基本元件的组合可以模拟真正的逻辑计算。
- 构思:Office Visio
- 图片处理:Adobe Photoshop CC 2018
- Modeling:SketchUp 2017
- Code:Notepad++ & Visual studio 2017
- Version Control: GitHub
- Engine: Unreal 4.21 ( C++ and Blueprint)
- Audio: GoldWave
- Video: Adobe AfterEffect CC 2017
- Test Device: HTC vive focus plus
用 Visio 制作出元件的原理图和说明,然后转换为贴图在 Level 中使用。
所有的项目使用的模型均为本人采用 Sketchup 制作而成,模型经过减面优化。
这个项目的一个特点是,不需要空间动作和位置捕捉,只需要坐在椅子上就可以完整体验VR项目,在空间内随意走动,并且几乎不会产生3D眩晕症。
- 通过左手扳机传送进行远距离移动,通过触摸手柄可以调整传送后所面向的方向
- 通过触摸左手面板进行无缝精确移动,移动时会出现引路机器人,目光聚焦机器人几乎可以消除3D眩晕
- 左手的 Forward direction 决定 seamless movement 的 direction
- 右手click 左右键可以实现 Turn 转向。
- 右手的扳机可以实现可以交互物体的交互
- 右手抓握左手上的手表,可以打开包裹
- 激活激光笔可以使用激光笔功能,实现远距离操作
- 场景内的排序展示,并非动画展示,而是在进行真正的排序。只是把排序转换为动画的时候比较有意思。
首先游戏开始后,排序管理Actor 只有一个Tick循环可以用,不能进行 for 循环嵌套。而且Tick 作为函数执行的时候,是不能按我们想象的方式执行Sleep()函数的,而是先把所有的 Sleep()函数都执行完了之后(一直处于一个等待状态),才执行其他的语句的。
- 只用一个Tick()循环来替代一个需要多个 for 嵌套的循环,将会是很大的不同。
#include "BubbleSort.h"
void ABubbleSort::BeginPlay()
{
Super::BeginPlay();
ElaspedSecond = 0;
i = 0;//初始化外循环的i
j = 0;//初始内外循环的j
bCompare = 1;//三个状态循环,1:比较 2:交换 3:等待1秒
}
// Called every frame
void ABubbleSort::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
ElaspedSecond += DeltaTime;//累计每帧的时间
if (ElaspedSecond >=1)//如果超过1秒则开始执行
{
if (bStart)//由开关控制
{
if (bCompare == 1) //三个状态循环,1:比较
{
if (j < a.Num() - 1 - i)
{
MoveToCompareZone(j + 1, j, SortBall); //移动到比较区
}
bCompare = 2;
}
else if(bCompare == 3) //三个状态循环,2:交换
{
if (i < a.Num())
{
if (j < a.Num() - 1 - i)
{
if (a[j] > a[j + 1])
{
MySwap(a[j + 1], a[j]); //数值交换
Swap(j+1, j, SortBall); //移动代表数字的球
}
else
{
MoveBack(j + 1, j, SortBall);//返回原位置
}
}
else
{
j = 0;
j--; //很关键的一步,因为此处内循环结束,设置j = 0了,但是循环外有一个 ++j ;
++i;
}
++j;
}
else if(i >= a.Num())
{
BigerNumIndicator->SetActorLocation(SortBall[0]->GetActorLocation());//排序结束后大数标识移动到最大处,待完善...
}
bCompare = 1;
}
else if (bCompare == 2) //三个状态循环,3:等待1秒
{
bCompare = 3;
}
}
ElaspedSecond--;//超过1秒后执行,执行完减去1秒,重新等待下一秒执行。
}
}
-
利用这些逻辑元件,是可以组建出,加法器,减法器,乘法器,除法器,存储器,编码器,解码器等等计算机组件的。有无限的可能性。
-
利用游戏设计的思想: 完成任务 → 获得奖励 → 能力成长 → 新任务;最终通过所学,获得打开外太空大门的门卡。