- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一台配备眼动仪的 Oculus Rift,用于根据眼动仪输入显示实时图像。我想听听您对我处理 Rift 显示的方式的意见(对吗?)。
我有一个简单文本的基本图像,它是根据眼动仪的注视坐标使用 OpenCV 修改的。因此,每次眼动仪输出注视坐标 (60Hz) 时,我都会得到一张新图像,就好像我正在使用网络摄像头流一样。我有一个工作程序,但由于我是 OpenGL 的新手,我希望有人可以完成以下步骤,看看我是否没有遗漏任何东西。我只会在下面包含主要的代码块和书面评论:
1) 首先,我创建并绑定(bind)一个纹理。 matToTexture 是将 cv::mat 图像转换为纹理的函数。
tex = matToTexture(result, GL_NEAREST, GL_NEAREST, GL_CLAMP);
glBindTexture(GL_TEXTURE_2D, tex)
2) 然后我制作眼睛渲染缓冲区并设置 VR 组件,获取眼睛姿势等:
for (int eye=0; eye<2; eye++)
{
idealSize = ovrHmd_GetFovTextureSize(hmd, (ovrEyeType)eye, hmd->DefaultEyeFov[eye], 1.0f);
EyeRenderTexture[eye] = tex;
//EyeRenderViewport[eye].Pos.x = 0;
EyeRenderViewport[0].Pos.x =0;
EyeRenderViewport[1].Pos.x = idealSize.w/2;
EyeRenderViewport[eye].Pos.y = 0;
EyeRenderViewport[eye].Size = idealSize;
}
//Setup VR components
ovrGLConfig oglcfg;
oglcfg.OGL.Header.API = ovrRenderAPI_OpenGL;
oglcfg.OGL.Header.BackBufferSize.w = hmd->Resolution.w;
oglcfg.OGL.Header.BackBufferSize.h = hmd->Resolution.h;
oglcfg.OGL.Header.Multisample = 1;
oglcfg.OGL.Window = handle;
oglcfg.OGL.DC = GetDC(handle);
if (!ovrHmd_ConfigureRendering(hmd, &oglcfg.Config,
ovrDistortionCap_Vignette |
ovrDistortionCap_TimeWarp | ovrDistortionCap_Overdrive,
hmd->DefaultEyeFov, EyeRenderDesc))
return(1);
//Getting eye pose outside the loop since our pose will remain static
ovrVector3f useHmdToEyeViewOffset[2]= {EyeRenderDesc[0].HmdToEyeViewOffset, EyeRenderDesc[1].HmdToEyeViewOffset};
ovrHmd_GetEyePoses(hmd, 0, useHmdToEyeViewOffset, EyeRenderPose, NULL);
glGenTextures(1, &textureID);
//Changing eye tracking location from 1920-1080 to 2364-1461 since that is
//optimal buffer size
float x_scale = static_cast<float>(image.cols)/static_cast<float>(hmd->Resolution.w);
float y_scale = static_cast<float>(image.rows)/static_cast<float>(hmd->Resolution.h);
//x_adjusted and y_adjusted store the new adjusted x,y values
float x_adjusted, y_adjusted;
最后,我有了 while 循环渲染
while(1)
{
//Changing the texture dynamically because the result image is changing
//with eye tracker input
tex = matToTexture(result, GL_NEAREST, GL_NEAREST, GL_CLAMP);
glBindTexture(GL_TEXTURE_2D, tex);
for (int eye = 0; eye<2; eye++)
{
projection[eye] = ovrMatrix4f_Projection(EyeRenderDesc[eye].Fov, 1, 1000, 1);
glMatrixMode(GL_PROJECTION);
glLoadTransposeMatrixf(projection[eye].M[0]);
EyeRenderTexture[eye] = tex;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(EyeRenderDesc[eye].HmdToEyeViewOffset.x,-EyeRenderDesc[eye].HmdToEyeViewOffset.y, EyeRenderDesc[eye].HmdToEyeViewOffset.z);
//Distortion Rendering
eyeTexture[eye].OGL.Header.API = ovrRenderAPI_OpenGL;
//eyeTexture[eye].OGL.Header.TextureSize = idealSize;
eyeTexture[eye].OGL.Header.TextureSize.h = idealSize.h;
eyeTexture[eye].OGL.Header.TextureSize.w = 2*idealSize.w;
eyeTexture[eye].OGL.Header.RenderViewport.Size = idealSize;
eyeTexture[0].OGL.Header.RenderViewport.Pos.x = 0;
eyeTexture[1].OGL.Header.RenderViewport.Pos.x = idealSize.w;
eyeTexture[eye].OGL.Header.RenderViewport.Pos.y = 0;
eyeTexture[eye].OGL.TexId = EyeRenderTexture[eye];
}
ovrHmd_EndFrame(hmd, EyeRenderPose, &eyeTexture[0].Texture);
//restoring result back to original so that new scotoma position
//can be added onto it
image.copyTo(result);
// Clear the screen to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//Exiting loop if 'q' is pressed
if (quit == 1) break;
}
glDeleteTextures(1, &tex);
所以我只有一个 OpenGL 纹理,我会在每一帧中对其进行修改。我已经阅读了有关帧缓冲区以及如何使用它们的信息,但即使在阅读了一堆资源之后,我仍然很困惑是否应该将它们用于这个特定的应用程序。我在做什么好吗?如果有源可以推荐以了解有关此 2D 应用程序的 OpenGL 的更多信息,我将不胜感激。
问题:两个屏幕目前都看到完全相同的图像。这是为什么?两只眼睛不应该看到略有不同的图像吗?我没有正确设置眼睛纹理/视口(viewport)吗?如果需要,我可以上传整个代码。
当我编写这段代码时,我使用的是 Rift 0.5.0,但现在我升级到了 0.8.0 beta
谢谢!
最佳答案
QUESTION: Both the screens currently see the same exact image. Why is that? Shouldn't both eyes see slightly different images?
occulus SDK 不会为您创建立体图像对。这里只有两件事值得关注:
为您提供正确的投影参数以及视点/方向
后处理图像对以在裂缝上显示(变形、色差校正)。
虽然您确实从 SDK 查询了投影矩阵和视点位置,但您实际上并没有对其进行任何操作。您只需将它们设置为 OpenGL 投影和模型 View 矩阵,无需使用它渲染任何内容。
代码应该将渲染到纹理中,为3D世界提供不同的视角,最后使用ovrHmd_EndFrame
来完成对其进行后处理并渲染到实际窗口。
但是,您只需提供单视场输入纹理作为输入,完全跳过渲染步骤并直接对其进行后处理。
您不能从单个单视场图像自动推断出立体图像对。
来自您的评论:
I understand that won't be real 3D, but I would like to know for example how a monoscopic computer game image can be modified to show slighlty different views on left vs. right eye.
这取决于您如何定义“单视场游戏”。这些游戏中的大多数实际上使用 3D 数据表示并将其渲染到屏幕上,从而创建 2D 投影。在这种情况下,对于立体输出,渲染必须进行两次,使用不同的投影和 View 矩阵。
另一种方法是使用单视场图像和深度缓冲区来创建另一个 View ,方法是将 3d 点(我们通过深度缓冲区获得)重新投影到完全不同的 View 配置,并填充所有洞。
然而,这些都不适用于
I have a new image so it is as if I'm working with a webcam stream.
如果您只有单视场网络摄像头,则无法直接获取渲染场景不同视角所需的 3D 信息。有一些方法可以使用视频流的时间相干性来重建此类信息,请参阅 structure from motion wikipedia artice .但这非常有限,不适用于任何实时使用。
关于c++ - Oculus Rift DK2 上的简单视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601009/
我在 Unity/C# 中为 VR/Oculus 开发了 2 个应用 我想从另一个开始(它们都不在官方 Oculus 商店中)。 我找到了这个指南:Integrate App Deeplinking
我正在我的新 Oculus Go 中测试我的几个 three.js 应用程序。我想知道是否可以仅使用目前似乎可用于主要浏览器的 GamePad API 来访问 Controller 。 查看Oculu
最近两年的VR领域多少有些冷淡,去年登场的Oculus Quest在抛弃定位基站和连接线的设计方式虽然已经无限接近于大家梦想中的VR设备,但完全无线化的体验在今天还是会受到机能等问题的限制,不过随着
鉴于qt3d的结构,是否可以将oculus sdk与qt3d应用程序集成? 我已经尝试过,但我的两个主要障碍是: 我不能使用 oculus sdk 创建的纹理交换链中的纹理作为渲染目标附件 我无法在每
我想获得您在 oculus 设置中设置的玩家高度。例如,如果您高度 185 厘米(6 英尺),显然持有相机对象的游戏对象必须设置为相同的高度,即 185 厘米。 是否有我可以查找的函数或变量来获取玩家
我想通过扬声器实时播放从Oculus Go的麦克风获得的声音,但无法做到。我已经尝试过此代码,但在带耳机麦克风的Editor中不能与Oculus Go一起使用,还是我犯了一些错误? using Sys
我正在尝试创建一个 makefile 来编译基于 Oculus Rift 的程序。我在一个目录中有 Oculus Rift 库的对象文件,在另一个目录中有头文件。这是我的生成文件: ##### # M
我写了这个简单的代码: public class Test { public static void main(String args[]) { OculusRift ocul
我正在使用 Unity 2019.3 为 oculus quest 开发项目。我之前在这方面做过一些工作,但我遇到了一些问题,我无法找到结果。 简单地说,我想在脚本中引用 oculus thumbst
网页是否可以仅使用一些通用的 javascript 代码(如 document.addEventListener)来监听 Oculus Controller 的按钮按下情况? 默认情况下,在 VR 浏
我正在尝试编写一个 .csv 文件来保存用户的操作并稍后从设备中收集它。我已经在我的电脑上试过了,它可以工作,但我似乎无法让它在 Oculus Quest 中工作。 我的代码是这样的: using (
我正在开发一个项目,该项目将一些渲染卸载到我为 Unity 编写的 native 插件,以便利用实例化和其他高级图形功能。我正在为跨平台版本开发它,但我使用的是 Mac,因此测试主要使用 OpenGL
我教室里的学生正在使用Unity来为Oculus Go构建应用程序。我可以毫无问题地构 build 备,但是某些权限设置阻止学生进行构建。他们得到这个错误。我认为安全设置阻止gradle启动另一个线程
我们正在进行一项实验,在该实验中,HMD的用户必须体验多种旋转增益。我的意思是,我们希望将用户头部的相对旋转更改为虚拟世界中的旋转增益。 例如,旋转增益为2表示当我在现实生活中将头的偏航度更改为45度
我尝试过,但无论有没有ONSP Audio Source,我都听不出它们有什么不同。 . 为什么? 我需要导出到装备 vr,并佩戴设备来获得差异吗? 最佳答案 我得到了答案。 存在差异。您需要做的是启
有谁知道我可以从哪里获得一些不错的 AFrame Oculus Go Controller 文档? 我需要使用 Oculus Go Controller 制作一个像 WASD 一样移动的相机 Cont
我正在使用 oculus 编写应用程序,但相机设置有问题。只是有时一切正常,相机开始晃动,我们正在看的模型似乎在抖动。到目前为止有人遇到同样的问题吗? 更新相机矩阵的代码如下: // Concaten
我目前正在开展一个项目,我需要读取 Oculus Rift DK2 传感器。我在网上搜索了可用的示例,遗憾的是我能找到的唯一示例导致我在 SDK 版本等方面遇到很多麻烦。我找到了一个教程,介绍如何实现
我刚刚向我的项目 Gear VRF 添加了一个库,但该库的 build.gradle 文件找不到 Oculus SDK。我收到错误“不复制 Oculus 文件:未找到 OVR_MOBILE_SDK,以
我制作了一个使用音频唇形同步的应用程序,它在 android 和 mac 上运行良好,但是当我为 iOS 构建它时,它一直给我这个错误: DllNotFoundException: Unable to
我是一名优秀的程序员,十分优秀!