código fonte de Latifus p/processing

/* Rodando em processing 1.5.1. Atenção para as bibliotecas GSVideo, JMyron e SimpleArtoolkit. No linux, a versão do SimpleArtoolkit não é reconhecida, sugiro trocar pelo Nyartoolkit, mas ainda não fiz testes com essa biblioteca. Na pasta Code do arquivo, certifique-se que possuem 3 arquivos inseridos nele: jmyron.jar, simpleartoolkit.jar e libJMyron.jnilib, sem os quais a programação não roda. Na pasta data do arquivo, insira o vídeo e o marcador correspondente, “latifus”foi o marcador que eu criei usando artoolkit (mkpatt), mas pode ser qualquer marcador gerado (patt.hiro,p.e.), basta substituir na pasta e no código o mesmo ou aprovietar do exemplo do SimpleArtoolkit.*/

import JMyron.*;
import processing.opengl.*;
import codeanticode.gsvideo.*;
GSMovie mov;
import pARToolKit.SimpleARToolKit;
SimpleARToolKit ar;
int capWidth, capHeight;
PImage img;
JMyron m;
int sDetail = 55; // Sphere detail setting
float rotationX = 0;
float rotationY = 0;
float velocityX = 0;
float velocityY = 0;
float globeRadius = 450;
float pushBack = 0;
float aspectRatio = 1;
float a;
float offset = PI/24.0;
float[] cx, cz, sphereX, sphereY, sphereZ;
float sinLUT[];
float cosLUT[];
float SINCOS_PRECISION = 0.5;
int SINCOS_LENGTH = int(360.0 / SINCOS_PRECISION);

void setup() {
size(800,600, OPENGL);
initializeSphere(sDetail);
capWidth = 320;
capHeight = 240;
m = new JMyron();
m.start(capWidth,capHeight);
m.findGlobs(0);
img = createImage(capWidth,capHeight,ARGB);
mov = new GSMovie(this,”freya.mov”);
ar = new SimpleARToolKit(this, capWidth, capHeight);
ar.loadPattern(“latifus”, 195, 0.0f, 0.0f);
ar.register(“showBox”);
noStroke();
rectMode(CENTER);

frameRate(30);
}

void draw() {
background(0);

m.update();
m.imageCopy(img.pixels);
img.updatePixels();
hint(DISABLE_DEPTH_TEST);
image(img,0,0,width,height);
hint(ENABLE_DEPTH_TEST);
int[] numbers = new int[2];
numbers[0] = 80;
numbers[1] = 100;
int f = numbers[0] + numbers[1]; // Sets variable a to 240

if (ar.findMatch(img,f)) {
ar.showObject();
mov.read();
smooth();
mov.loop();
}}

void showBox(SimpleARToolKit _a) {

pushMatrix();
translate(CENTER, CENTER, -50);
pushMatrix();
noFill();
strokeWeight(2);
smooth();
popMatrix();
lights();
pushMatrix();
rotateX( radians(-rotationX) );
rotateY( radians(270 – rotationY) );
noStroke();
textureMode(IMAGE);
texturedSphere(globeRadius, mov);
popMatrix();
popMatrix();
for(int i=0; i<capHeight; i++) {
a++;
translate (0,i-a);
rotationX += velocityX;
rotationY += velocityY;
velocityX *= 0.95;
velocityY *= 0.95;

if(mousePressed){
velocityX += (mouseY-pmouseY) * 0.01;
velocityY -= (mouseX-pmouseX) * 0.01;
}}}

void initializeSphere(int res)
{
sinLUT = new float[SINCOS_LENGTH];
cosLUT = new float[SINCOS_LENGTH];

for (int i = 0; i < SINCOS_LENGTH; i++) {
sinLUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
cosLUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
}

float delta = (float)SINCOS_LENGTH/res;
float[] cx = new float[res];
float[] cz = new float[res];

// Calc unit circle in XZ plane
for (int i = 0; i < res; i++) {
cx[i] = -cosLUT[(int) (i*delta) % SINCOS_LENGTH];
cz[i] = sinLUT[(int) (i*delta) % SINCOS_LENGTH];
}

// Computing vertexlist vertexlist starts at south pole
int vertCount = res * (res-1) + 2;
int currVert = 0;

// Re-init arrays to store vertices
sphereX = new float[vertCount];
sphereY = new float[vertCount];
sphereZ = new float[vertCount];
float angle_step = (SINCOS_LENGTH*0.5f)/res;
float angle = angle_step;

// Step along Y axis
for (int i = 1; i < res; i++) {
float curradius = sinLUT[(int) angle % SINCOS_LENGTH];
float currY = -cosLUT[(int) angle % SINCOS_LENGTH];
for (int j = 0; j < res; j++) {
sphereX[currVert] = cx[j] * curradius;
sphereY[currVert] = currY;
sphereZ[currVert++] = cz[j] * curradius;
}
angle += angle_step;
}
sDetail = res;
}

void texturedSphere(float r, PImage t)
{
int v1,v11,v2;
r = (r + 240 ) * 0.33;
beginShape(TRIANGLE_STRIP);
texture(t);
float iu=(float)(t.width-1)/(sDetail);
float iv=(float)(t.height-1)/(sDetail);
float u=0,v=iv;
for (int i = 0; i < sDetail; i++) {
vertex(0, -r, 0,u,0);
vertex(sphereX[i]*r, sphereY[i]*r, sphereZ[i]*r, u, v);
u+=iu;
}
vertex(0, -r, 0,u,0);
vertex(sphereX[0]*r, sphereY[0]*r, sphereZ[0]*r, u, v);
endShape();

// Middle rings
int voff = 0;
for(int i = 2; i < sDetail; i++) {
v1=v11=voff;
voff += sDetail;
v2=voff;
u=0;
beginShape(TRIANGLE_STRIP);
texture(t);
for (int j = 0; j < sDetail; j++) {
vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1++]*r, u, v);
vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2++]*r, u, v+iv);
u+=iu;
}
// Close each ring
v1=v11;
v2=voff;
vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1]*r, u, v);
vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v+iv);
endShape();
v+=iv;
}
u=0;

beginShape(TRIANGLE_STRIP);
texture(t);
for (int i = 0; i < sDetail; i++) {
v2 = voff + i;
vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v);
vertex(0, r, 0,u,v+iv);
u+=iu;
}
vertex(sphereX[voff]*r, sphereY[voff]*r, sphereZ[voff]*r, u, v);
endShape();
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: