如何使用Processing for Android在Google Cardboard设备中显示立体图像?

时间:2015-02-28 08:07:17

标签: android processing stereo-3d google-cardboard virtual-reality

Processing旨在使用Java更容易绘图。 Android的处理功能具有桌面兄弟功能和传感器信息。将这些东西组合在一起,显示立体图像并像Oculus Rift或Google Cardboard一样移动它不是很容易吗?

2 个答案:

答案 0 :(得分:3)

下面的代码在两个视口中显示图像 - 一个用于左眼,一个用于右眼。结果是,从Google Cardboard设备查看时,图像看起来是3D。当头部移动时,加速度计和陀螺仪数据用于移动3D图像。唯一的错误是Processing for Android的错误,如果你没有在这种模式下启动,横向模式会导致程序崩溃。我正在使用Processing 2.0.3和Android 4.3,因此在当前版本中可能已解决此问题。 (虽然我确实在Github上的Processing-Bugs讨论中看到它仍然是一个悬而未决的问题)。纹理图像是最喜欢的卡通人物的100×100像素图像。您可以使用任何您想要的 - 只需将图像存储在数据文件夹中。

//Scott Little 2015, GPLv3
//pBoard is Processing for Cardboard

import android.os.Bundle; //for preventing sleep
import android.view.WindowManager;
import ketai.sensors.*; //ketai library for sensors
KetaiSensor sensor;

float ax,ay,az,mx,my,mz; //sensor variables
float eyex = 50; //camera variables
float eyey = 50;
float eyez = 0;
float panx = 0;
float pany = 0;
PGraphics lv; //left viewport
PGraphics rv; //right viewport
PShape s; //the object to be displayed

//********************************************************************
// The following code is required to prevent sleep.
//********************************************************************
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// fix so screen doesn't go to sleep when app is active
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
//********************************************************************

void setup() {
sensor = new KetaiSensor(this);
sensor.start();

size(displayWidth,displayHeight,P3D); //used to set P3D renderer
orientation(LANDSCAPE); //causes crashing if not started in this orientation

lv = createGraphics(displayWidth/2,displayHeight,P3D); //size of left viewport
rv = createGraphics(displayWidth/2,displayHeight,P3D);

PImage img = loadImage("jake.jpg");  //texture image
s = createShape();
TexturedCube(img, s, 50, 50);
}

void draw(){
//draw something fancy on every viewports
panx = panx-mx*10;
pany = 0;
eyex = 0;
eyey = -20*az;

ViewPort(lv, eyex, eyey, panx, pany, -15); //left viewport
ViewPort(rv, eyex, eyey, panx, pany, 15);  //right viewport

//add the two viewports to your main panel
image(lv, 0, 0);
image(rv, displayWidth/2, 0);
}

//sensor data
void onAccelerometerEvent(float x, float y, float z){
ax = x;
ay = y;
az = z;
}

void onGyroscopeEvent(float x, float y, float z){
mx = x;
my = y;
mz = z;
}

//
void ViewPort(PGraphics v, float x, float y, float px, float py, int eyeoff){
v.beginDraw();
v.background(102);
v.lights();
v.pushMatrix();
v.camera(x+eyeoff, y, 300, px, py, 0, 0.0, 1.0, 0.0);
v.noStroke();
//v.box(100);
v.shape(s);
v.popMatrix();
v.endDraw();
}

//put a texture on PShape object, 6 faces for a cube
void TexturedCube(PImage tex, PShape s, int a, int b) {
s.beginShape(QUADS);
s.texture(tex);

// +Z "front" face
s.vertex(-a, -a, a, 0, b);
s.vertex( a, -a, a, b, b);
s.vertex( a, a, a, b, 0);
s.vertex(-a, a, a, 0, 0);

// -Z "back" face
s.vertex( a, -a, -a, 0, 0);
s.vertex(-a, -a, -a, b, 0);
s.vertex(-a, a, -a, b, b);
s.vertex( a, a, -a, 0, b);

// +Y "bottom" face
s.vertex(-a, a, a, 0, 0);
s.vertex( a, a, a, b, 0);
s.vertex( a, a, -a, b, b);
s.vertex(-a, a, -a, 0, b);

// -Y "top" face
s.vertex(-a, -a, -a, 0, 0);
s.vertex( a, -a, -a, b, 0);
s.vertex( a, -a, a, b, b);
s.vertex(-a, -a, a, 0, b);

// +X "right" face
s.vertex( a, -a, a, 0, 0);
s.vertex( a, -a, -a, b, 0);
s.vertex( a, a, -a, b, b);
s.vertex( a, a, a, 0, b);

// -X "left" face
s.vertex(-a, -a, -a, 0, 0);
s.vertex(-a, -a, a, b, 0);
s.vertex(-a, a, a, b, b);
s.vertex(-a, a, -a, 0, b);

s.endShape();
}

答案 1 :(得分:1)

显示较差的立体图像会很容易。 Oculus团队有充足的理由花这么长时间才能实现这一目标;)

首先,你需要知道人们不同程度地睁开眼睛,将视力集中在远离它们的物体上。如果您将相机完全平行设置,只有当用户专注于无限时,一切都会看起来很好。如果你以一种固定的方式转动每一个相机,没有眼睛跟踪,你会得到立体声,用于3D电影,遭受梯形失真效应。没有适当的眼动追踪,最好的办法是使用倾斜的相机截头 - 偏轴投影。有关详细信息,请访问here

还有其他问题。例如,当你转过头时,你不会只是改变眼睛的方向 - 你也可以改变他们在3D空间中的绝对位置。如果您只是将手机旋转应用到相机,效果将会消失。这就是至少使用头部模型的原因。当前版本的CardboardSDK支持对颈部建模,在查找/查看时进行垂直平移。

还有很多其他问题,例如由于耳机镜头造成的图像震荡失真,头部跟踪,校准到特定手机的一切,耳机,镜头,用户InterPupillaryDistance ...列表继续。

总而言之,不, VR不是一件简单或简单的事情。问题是,如果做得不好,就不会立即显现出来。用户可能不会有意识地知道有什么不对劲,但他们的大脑会知道。它一生都在训练周围的现实,并且很擅长知道什么时候出现故障。糟糕的vr应用程序可能会导致迷失方向,头痛,眼睛疲劳,恶心或只是提供不满意的体验。 VR世界的一些重要人物担心,许多糟糕的VR应用程序对很多人来说都是一种糟糕的体验,使他们远离技术并阻止它变得流行。

总而言之,如果你想做VR ,要么确保你真的知道自己在做什么,要么使用专家制作的SDK /框架。< / p>