We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hi everybody,
I'm currently working on a design project which represent a virtual world. My processing is a land with a camera in movement, giving the impression of surfing. I would like to make it in virtual reality, how I can do virtual reality with a processing ? Is it easy ? How it works ?
Many thanks !!
Here screen shots :
.
Here my code :
/**
Terrain
Demonstrating the Shapes3D library.
Click and drag mouse to change direction
W or P = faster
S or L = slower
Click on artefacts to change color/texture
created by Peter Lager
*/
import shapes3d.utils.*;
import shapes3d.animation.*;
import shapes3d.*;
Terrain terrain;
Box skybox;
Box[] droids;
Tube tube;
Ellipsoid obelisk;
PVector[] droidDirs;
int nbrDroids;
TerrainCam cam;
int camHoversAt = 8;
float terrainSize = 1000;
float horizon = 400;
long time;
float camSpeed;
int count;
boolean clicked;
// List of image files for texture
String[] textures = new String[] {
"grid01.png", "dada.png", "rouge.jpg",
"globe.jpg", "avast.png"
};
void setup() {
size(1300, 900, P3D);
cursor(CROSS);
terrain = new Terrain(this, 60, terrainSize, horizon);
terrain.usePerlinNoiseMap(0, 40, 0.15f, 0.15f);
terrain.setTexture("grid01.png", 4);
terrain.tag = "Ground";
terrain.tagNo = -1;
terrain.drawMode(S3D.TEXTURE);
/**
skybox = new Box(this, 0, 0, 500);
skybox.setSize(100, 100, 1);
skybox.setTexture("dada.png", Box.FRONT);
//skybox.setTexture("Black.png", Box.BACK);
//skybox.setTexture("Black.png", Box.LEFT);
//skybox.setTexture("Black.png", Box.RIGHT);
//skybox.setTexture("Black.png", Box.TOP);
//skybox.visible(true, Box.BOTTOM);
skybox.drawMode(S3D.TEXTURE);
skybox.tag = "Skybox";
skybox.tagNo = -1;
*/
nbrDroids = 4;
droids = new Box[nbrDroids];
droidDirs = new PVector[nbrDroids];
for (int i = 0; i < nbrDroids; i++) {
droids[i] = new Box(this, 10);
droids[i].setSize(10, 10, 1);
droids[i].moveTo(getRandomPosOnTerrain(terrain, terrainSize, 50));
droids[i].tagNo = i;
droids[i].tag = "cheval " + i;
//droids[i].fill(color(random(128, 255), random(128, 255), random(128, 255)));
//droids[i].drawMode(S3D.SOLID);
// Rajoute une texture cheval et annule la couleur
droids[i].setTexture(textures[1]);
droids[i].drawMode(S3D.TEXTURE);
droidDirs[i] = getRandomVelocity(random(15, 25));
terrain.addShape(droids[i]);
}
// 1 obélisque avec texture cheval
obelisk = new Ellipsoid(this, 4, 20);
obelisk.setRadius(5, 30, 5);
obelisk.moveTo(getRandomPosOnTerrain(terrain, terrainSize, 28));
obelisk.fill(color(0, 255, 0));
obelisk.tag = "dada";
obelisk.tagNo = 99999;
obelisk.setTexture(textures[4]);
obelisk.drawMode(S3D.TEXTURE);
terrain.addShape(obelisk);
// 1 tube aux fonds rouge et vert et au corps en texture cheval
tube = new Tube(this, 10, 30);
tube.setSize(3, 10, 6, 6, 20);
tube.moveTo(getRandomPosOnTerrain(terrain, terrainSize, 15.5));
tube.tagNo = 0;
tube.setTexture(textures[1]);
tube.drawMode(S3D.TEXTURE);
tube.fill(color(255, 0, 0), Tube.S_CAP);
tube.fill(color(0, 255, 0), Tube.E_CAP);
tube.drawMode(S3D.SOLID, Tube.BOTH_CAP);
camSpeed = 10;
cam = new TerrainCam(this);
cam.adjustToTerrain(terrain, Terrain.WRAP, camHoversAt);
cam.camera();
cam.speed(camSpeed);
cam.forward.set(cam.lookDir());
// Tell the terrain what camera to use
terrain.cam = cam;
time = millis();
}
void draw() {
background(35);
// Get elapsed time
long t = millis() - time;
time = millis();
// Update shapes on terrain
update(t/1000.0);
// Update camera speed and direction
if (mousePressed)
processMousePressed();
if (keyPressed)
processKeyPressed(t);
// Clicked on artefact?
if (clicked)
processMouseClick();
// Calculate amount of movement based on velocity and time
cam.move(t/1000.0);
// Adjust the cameras position so we are over the terrain
// at the given height.
cam.adjustToTerrain(terrain, Terrain.WRAP, camHoversAt);
// Set the camera view before drawing
cam.camera();
//obelisk.draw();
//tube.draw();
terrain.draw();
// Get rid of directional lights so skybox is evenly lit.
//skybox.moveTo(cam.eye().x, 0, cam.eye().z);
//skybox.draw();
}
void processMousePressed() {
float achange = (mouseX - pmouseX) * PI / width;
// Keep view and move directions the same
cam.rotateViewBy(achange);
cam.turnBy(achange);
}
void processKeyPressed(long t) {
if (key == 'W' || key =='w' || key == 'P' || key == 'p') {
camSpeed += (t/100.0);
cam.speed(camSpeed);
} else if (key == 'S' || key =='s' || key == 'L' || key == 'l') {
camSpeed -= (t/100.0);
cam.speed(camSpeed);
} else if (key == ' ') {
camSpeed = 0;
cam.speed(camSpeed);
}
}
void processMouseClick() {
clicked = false; // reset
Shape3D selected = Shape3D.pickShape(this, mouseX, mouseY);
println("hello" + selected);
if (selected != null) {
camSpeed = 0;
cam.speed(camSpeed);
if (selected.tagNo > textures.length)
selected .fill(color(random(128, 255), random(128, 255), random(128, 255)));
else if (selected.tagNo >= 0) {
selected.tagNo = (selected.tagNo + 1) % textures.length;
selected.setTexture(textures[selected.tagNo]);
}
}
}
/**
* Update artefacts and seekers
*/
public void update(float time) {
PVector np;
obelisk.rotateBy(0, time*radians(16.9f), 0);
tube.rotateBy(time*radians(25.6f), time*radians(6.871f), time*radians(17.3179f));
for (int i = 0; i < nbrDroids; i++) {
np = PVector.add(droids[i].getPosVec(), PVector.mult(droidDirs[i], time));
droids[i].moveTo(np);
droids[i].adjustToTerrain(terrain, Terrain.WRAP, 15);
}
}
/**
* Get a random position on the terrain avoiding the edges
* @param t the terrain
* @param tsize the size of the terrain
* @param height height above terrain
* @return
*/
public PVector getRandomPosOnTerrain(Terrain t, float tsize, float height) {
PVector p = new PVector(random(-tsize/2.1f, tsize/2.1f), 0, random(-tsize/2.1f, tsize/2.1f));
p.y = t.getHeight(p.x, p.z) - height;
return p;
}
/**
* Get random direction for seekers.
* @param speed
*/
public PVector getRandomVelocity(float speed) {
PVector v = new PVector(random(-10000, 10000), 0, random(-10000, 10000));
v.normalize();
v.mult(speed);
return v;
}
/**
* next texture or change color
*/
public void mouseClicked() {
clicked = true;
}
Answers
Try this link: http://android.processing.org/tutorials/vr_intro/index.html
Kf
thank you !!
@heloise --
Also check out the QueasyCam FPS library and the MazeRunner demo.
I follow the android processing tutorial but I can't find the vr library.. I don't know which library to use and which path to copy the library ?
As you can see on this screen shot I can't find VR library... Thank you for your help
You will need the latest Android Mode: https://forum.processing.org/two/discussion/21941/new-beta-of-the-android-mode#latest
To install it, make sure you uninstall any previous Android Mode version. Also make sure Processing is not running when moving folders as I describe next. Download the link, unzip the file and then copy the AndroidMode folder from the zip into your sketchFolder >> modes.
You can check you placed it properly if you go to sketchFolder >> modes >> AndroidMode you should be able to see android-core.zip as one of the files in that path.
I will suggest before you get the VR going, make sure the AndroidMode is working properly by testing a simple application, as provided in the Android Processing webpage.
Kf
Also https://forum.processing.org/two/discussion/22392/draw3d-for-google-cardboard#latest
Kf
Its not working...
Yeap It's working now thank you. But when I follow the tutorial here http://android.processing.org/tutorials/vr_i![](![](> > ))ntro/index.html . Im blocked here, you can see on the screenshot
Zero experience with VR headsets... I suggest you create a tix in github and don't forget to mention you also asked the question here in the forum. It would be great to see more documentation on setting up and working with VR gear but I haven't seen much contributions/comments about it lately...
https://github.com/processing/processing-android
Kf