我正在尝试看看是否可以使用oscP5将processing中制作的草图链接到蚂蚁。草图是此编码列车视频的前半部分中概述的点的球体:
https://www.youtube.com/watch?v=RkuBWEkBrZA
在我开始将它与oscP5链接之前的代码似乎工作得很好:
import peasy.*;
PeasyCam cam;
PVector[][] globe;
int total = 20;
void setup() {
size(600, 600, P3D);
cam = new PeasyCam(this, 500);
globe = new PVector[total+1][total+1];
}
void draw() {
background(0);
fill(255);
lights();
float r = 200;
for (int i = 0; i < total+1; i++) {
float lat = map(i, 0, total, 0, PI);
for (int j = 0; j < total+1; j++) {
float lon = map(j, 0, total, 0, TWO_PI);
float x = r * sin(lat) * cos(lon);
float y = r * sin(lat) * sin(lon);
float z = r * cos(lat);
globe[i][j] = new PVector(x, y, z);
}
}
noFill();
for (int i = 0; i < total; i++) {
beginShape(TRIANGLE_STRIP);
for (int j = 0; j < total+1; j++) {
PVector v1 = globe[i][j];
stroke(255);
strokeWeight(2);
vertex(v1.x, v1.y, v1.z);
PVector v2 = globe[i+1][j];
vertex(v2.x, v2.y, v2.z);
}
endShape();
}
}然而,当我尝试实现oscP5时,它并不是很有效。我的蝗虫文件正在接收skech,但是这些点是不正确的,所以我一定是在发送什么数据上有问题,但是我似乎不知道应该发送什么。代码获取指定的半径、经度和纬度的值,并将其转换为x,y,z坐标,我试图让oscP5发送这些x,y,z坐标。
有谁有什么想法吗?到目前为止,代码如下。
//import necessary libraries
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
//import camera
import peasy.*;
PeasyCam cam;
// message to send
String message;
PVector[][] sphere;
int total = 20;
float lat;
float lon;
void setup() {
size(600, 600, P3D);
cam = new PeasyCam(this, 500);
sphere = new PVector[total+1][total+1];
//send message from this port
oscP5 = new OscP5(this,12000);
//send message to this port
myRemoteLocation = new NetAddress("127.0.0.1",12001);
}
void draw() {
background(0);
fill(255);
lights();
float r = 200;
for (int i = 0; i < total+1; i++) {
float lat = map(i, 0, total, 0, PI);
for (int j = 0; j < total+1; j++) {
float lon = map(j, 0, total, 0, TWO_PI);
float x = r * sin(lat) * cos(lon);
float y = r * sin(lat) * sin(lon);
float z = r * cos(lat);
sphere[i][j] = new PVector(x, y, z);
}
}
noFill();
for (int i = 0; i < total; i++) {
beginShape(TRIANGLE_STRIP);
for (int j = 0; j < total+1; j++) {
PVector v1 = sphere[i][j];
stroke(255);
strokeWeight(2);
vertex(v1.x, v1.y, v1.z);
PVector v2 = sphere[i+1][j];
vertex(v2.x, v2.y, v2.z);
}
endShape();
}
// osc message
OscMessage myMessage = new OscMessage("/hello world");
for (int j = 0; j < total+1; j++) {
//message to send
message = "x = " + String.valueOf(r * sin(lat) * cos(lon)) + "; " +
"y = " + String.valueOf(r * sin(lat) * sin(lon))+ "; " +
"z = " + String.valueOf(r * cos(lat))+ "; " ;
myMessage.add(String.valueOf(r * sin(lat) * cos(lon)));
myMessage.add(String.valueOf(r * sin(lat) * sin(lon)));
myMessage.add(String.valueOf(r * cos(lat)));
}
//print message
println(message);
//send message
oscP5.send(myMessage, myRemoteLocation);
}我认为错误出在代码的这一部分。
for (int j = 0; j < total+1; j++) {
//message to send
message = "x = " + String.valueOf(r * sin(lat) * cos(lon)) + "; " +
"y = " + String.valueOf(r * sin(lat) * sin(lon))+ "; " +
"z = " + String.valueOf(r * cos(lat))+ "; " ;
myMessage.add(String.valueOf(r * sin(lat) * cos(lon)));
myMessage.add(String.valueOf(r * sin(lat) * sin(lon)));
myMessage.add(String.valueOf(r * cos(lat)));
}任何帮助都是令人惊叹的。
发布于 2018-12-31 19:05:09
全局变量float lat;的值从不float lon;设置,因为在嵌套的for循环中,声明了两个新的局部变量(在循环块范围内):
for (int i = 0; i < total+1; i++) {
float lat = map(i, 0, total, 0, PI);
for (int j = 0; j < total+1; j++) {
float lon = map(j, 0, total, 0, TWO_PI);
// [...]
}
}注意,float lat = ...声明了一个新变量,lat = ...将是现有变量lat的赋值。
但是使用全局变量而不是设置新变量不会改变任何事情,因为当发送消息时,变量lat和lon将具有嵌套循环的最后一次迭代的值。
您必须实现两个新循环,并且必须重新计算lat和lon的值。循环后的print语句没有任何意义,因为它只打印最后一个坐标。
代码应该看起来像这样:
// osc message
OscMessage myMessage = new OscMessage("/hello world");
for (int i = 0; i < total+1; i++) {
float lat = map(i, 0, total, 0, PI);
for (int j = 0; j < total+1; j++) {
float lon = map(j, 0, total, 0, TWO_PI);
float x = r * sin(lat) * cos(lon);
float y = r * sin(lat) * sin(lon);
float z = r * cos(lat);
println("(", i, ",", j, ") : x =" , x, "y = ", y, "z = ", z);
myMessage.add(String.valueOf(x));
myMessage.add(String.valueOf(y));
myMessage.add(String.valueOf(z));
}
}
//send message
oscP5.send(myMessage, myRemoteLocation);https://stackoverflow.com/questions/53980055
复制相似问题