简易的“虚拟头盔”实现

头盔原理很简单,大致就是使用两个透镜,缩短眼睛的焦距,将两个眼睛看到的东西合二为一从而产生双屏3D效果。

于是开始设想:既然有了3D效果,为了达到更加沉浸的体验,为何不将头部的运动也映射到虚拟世界中去呢?抱着这个想法,我们做了如下尝试:

把头部数据(如旋转角、俯仰角等等)用陀螺仪接收传回电脑,为了简单起见快速出效果,直接手机,然后在手机端写了个app,负责使用wifi发送陀螺仪数据到pc,pc接收到数据之后,我写了个dll,共享内存的,不断更新那一块内存,宿主程序使用的时候,只需要call那块数据即可,方法非常简单。

安卓客户端我不懂,所以是我同学写的。我只说c++ dll的代码,为了方便起见我是用了一个简单sender来模拟陀螺仪发回的数据。

//sender
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <ctime>
using namespace std;

struct DataStruct
{
    float x;
    float y;
    float z;
};

#define BUF_SIZE 1024
TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 

int main()
{
    HANDLE hMapFile;
    float* pBuf;

    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,
        NULL,
        PAGE_READWRITE,
        0,
        BUF_SIZE,
        szName);                

    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not create file mapping object (%d).\n"),
            GetLastError());
        return 1;
    }
    pBuf = (float*) MapViewOfFile(hMapFile,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        BUF_SIZE);

    if (pBuf == NULL)
    {
        _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());

        CloseHandle(hMapFile);

        return 1;
    }
    while(1)
    {
        float s[3] = {1.0f,33.2f,12.3f};
        size_t a = sizeof(s);
        srand(clock());
        *s = rand() / (double)(3.2);
        *(s+1) = rand() / (double)(3.2);
        *(s+2) = rand() / (double)(3.2);
        cout<<s[0]<<" "<<s[1]<<" "<<s[2]<<endl;
        memcpy((PVOID)pBuf, (void*)s, sizeof(s));
    }
}

接收dll代码

#include <windows.h>
#include <string.h>
#include <string>
#include <iostream>
#include <tchar.h>
#include "recevedate.h"
using namespace std;

#define BUF_SIZE 1024
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
HANDLE hMapFile;
float* pBuf;

int dll_data_init()
{
        hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        BUF_SIZE,                // maximum object size (low-order DWORD)
        szName);                 // name of mapping object

    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not create file mapping object (%d).\n"),
            GetLastError());
        return -1;
    }
    pBuf = (float*) MapViewOfFile(hMapFile,   // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,
        0,
        BUF_SIZE);

    if (pBuf == NULL)
    {
        _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());

        CloseHandle(hMapFile);

        return -1;
    }
    return 0;
}

float get_x()
{
    return pBuf[0];
}

float get_y()
{
    return pBuf[1];
}

float get_z()
{
    return pBuf[2];
}

float get_dx()
{
    return pBuf[3];
}

float get_dy()
{
    return pBuf[4];
}

float get_dz()
{
    return pBuf[5];
}

void dll_data_ter()
{
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
}

初始化调用int dll_data_init()函数,退出时调用void dll_data_ter(),中间直接获取指定的数据即可。

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices; 

public class dll : MonoBehaviour {
    [DllImport("daterecive.dll")]
    public static extern int dll_data_init();
    [DllImport("daterecive.dll")]
    public static extern void dll_data_ter ();
    [DllImport("daterecive.dll")]
    public static extern float get_x ();
    [DllImport("daterecive.dll")]
    public static extern float get_y ();
    [DllImport("daterecive.dll")]
    public static extern float get_z ();
    // Use this for initialization
    void Start () {
        dll_data_init ();
    }

    // Update is called once per frame
    void Update () {

        //getdata ();
    }

    void OnApplicationQuit()
    {
        dll_data_ter ();
    }
}

初始化后这些函数都是可以调用的,修改一下摄像机代码或者其他代码即可。

在unity中处理了一个场景,做了一下实验:

左上角就是传回的数据,由于是模拟数据,所以不是很真实。

有了这个dll,这个系统可以轻松的拓展到很多游戏引擎中去,我在UE4中也做了相似的尝试。

至于显示,只要场景是双屏即可:

最后,整个装置就成型了:

比较简陋不要在意那些细节,看上去效果还是很不错的,但是不知道怎么展示……

时间: 2024-10-28 15:22:23

简易的“虚拟头盔”实现的相关文章

2014全球数字游戏报告

2014年superdata全球游戏市场报告 最近,来自业内统计分析公司Superdata发布了一份2014年全球游戏 数据统计报告.Xsolla参与了Superdata的发布会,其CEO Joost和高级分析师Stephanie为我们总结了2014年的全球游戏市场状况,并对2015年做出了预测.本期,小编将会为大家详细介绍这份报告. 2014年全球游戏市场总收入高达500亿美金 Superdata显示,2014年亚洲的手机游戏为全球游戏市场增加了15%的利润.其中,北美收入是123亿美金,拉美

VR设备介绍

对于很多没有体验过现实增强,甚至虚拟现实眼镜产品的童鞋而言,这东西究竟应该怎么理解,硬件配置如何,用了什么操作系统,相比市面上的其他眼镜产品有何不同,这是个值得一说的问题.今天,我们先带大家一起领略下,各品牌研发的VR虚拟与现实设备吧. 首先我们科普下什么是虚拟设备 简单来说虚拟设备包括虚拟眼镜,虚拟头盔等.它们简称为VR(Virtual Reality虚拟现实).通过人机交互,语言,动作,口令进入到虚拟现实世界.可以在虚拟世界中实现:再生旅游,医疗学习,经营房产,游戏,生物,科学等一切人文有关

刀片服务器

刀片服务器是指在标准高度的机架式机箱内可插装多个卡式的服务器单元,是一种实现HAHD(High Availability High Density,高可用高密度)的低成本服务器平台,为特殊应用行业和高密度计算环境专门设计.刀片服务器就像“刀片”一样,每一块“刀片”实际上就是一块系统主板. 中文名 刀片服务器 外文名 blade server 对    象 标准高度机架式机箱 特    点 低成本 实    现 高可用高密度 性    质 多个卡式的服务器单元 目录 1 定义 2 类型 3 优点

[Nginx]简易配置Nginx虚拟主机

------------------------------------------------------------------------------------------------------- 配置虚拟主机: 1. 绑定域名 vim /etc/hosts #添加格式如:192.168.1.11 www.chenwei.ws 2. 添加虚拟主机  cd到根目录, 运行vhost.sh添加虚拟主机, 输入域名即可 3. 编辑配置文件 vim /usr/local/nginx/conf/

虚拟机上安装Linux操作系统

很久之前就知道虚拟机这个东西,也都在虚拟机上安装过Windows的操作系统和Linux的操作系统,但是一直都没有去做笔记. 最近还是比较有时间,就移除了前两天刚刚安装的Linux系统,重新安装一次,做一个记录. 至于虚拟机的安装就没有做详细的记录,这个跟安装其他的什么软件没什么区别. 好了.接下来就开始图文并茂的去记录一下安装Linux的操作系统的过程. 1.那么第一步肯定是要下载Linux的镜像文件,至于下载也早就下载好了.是rhel-server-6.6的,一个ISO的压缩包. 2.打开虚拟

最简易无加密方式下的ppp拨号连接

PPP拨号连接建立虚拟网卡,并可以进行路由设置.几乎所有其他的连接服务都建立在其之上,PPPoE,PPTP,L2TP等等. 而其中一个最基本的话题可能被忽略了,PPP是如何工作的,如何使用PPP建立最简易的连接. PPP协议实际上非常简单,握手信号之后即进行数据交换,由于原来的PPP连接的使用都是基于电话MODEM的点对点通信,不考虑过于复杂的加密并保证传输效率,所以PPP的缺省设置是基于tty设备的,如果使用串口就是ttyS0-ttyS? 当然,使用pppd应用于附加服务并不必须使用tty设备

【分享】VNR翻译日语游戏汉化简易图解教材

请[点击图片]到新链接看[原图].不然博客自动缩小图,看不清图解. 上面是用美少女万花镜来测试新版VNR翻译的如何,结果比我预料还要好.以前旧版根本比不上新版的.翻译非常准确.看了我上面的简易VNR图解,应该了解了怎样翻译了吧.接下来就是D.C.III.RX翻译. 来看下翻译效果吧. 最新版文本设置,其它还都是一样. D.C.III RX在VNR下全屏化 如果出现部分打开GAL游戏VNR却不自动弹出翻译窗口和翻译不出文本,请看下面解决方法. 提取文本后无法翻译或翻译不完整,不通顺解决方法 D.C

基于mini2440简易计算器

基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读<c程序设计第二版>里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等 mini2440  索尼X35   LCD液晶屏 主函数部分: #include "def.h" #include "option.h" #includ

【分享】VNR翻译日语游戏汉化简易图解教材2

[分享]VNR翻译日语游戏汉化简易图解教材 http://867258173.diandian.com/post/2014-07-19/40062240755  请先看上面[PC,PSP,同人志翻译图解教材]和下载[J北京各版本],[J北京词典].[精灵虚拟光驱],[APP,NT,LE,,Ntleas四大转码工具]和[AlphaROM一键破解],7z之类相关的 请先看上面地址和下载,以后更新的教材和新的整合版将在这里补充.   使用OCR光学识别自动翻译游戏 添加[人工字幕]提高翻译质量   游