本机和在线草图之间的不同处理渲染
Different Processing rendering between native and online sketch
当 运行 这个示例直接使用 Processing 和 Processing.js 在浏览器中使用时,我得到不同的结果。为什么?
我对我的结果很满意,想在打开的 Processing 上分享它,但渲染完全不同,我不明白为什么。下面是一个最小的工作示例。
/* Program that rotates a triange and draws an ellipse when the third vertex is on top of the screen*/
float y = 3*height/2;
float x = 3*width/2;
float previous_1 = 0.0;
float previous_2 = 0.0;
float current;
float angle = 0.0;
void setup() {
size(1100, 500);
}
void draw() {
fill(0, 30);
// rotate triangle
angle = angle - 0.02;
translate(x, y);
rotate(angle);
// display triangle
triangle(-50, -50, -30, 30, -90, -60);
// detect whether third vertex is on top by comparing its 3 successive positions
current = screenY(-90, -60); // current position of the third vertex
if (previous_1 < previous_2 && previous_1 < current) {
// draw ellipse at the extrema position
fill(128, 9, 9);
ellipse(-90, -60, 7, 10);
}
// update the 2 previous positions of the third vertex
previous_2 = previous_1;
previous_1 = current;
}
- 在处理过程中,三角形的顶点在上画出椭圆,这是我的目标。
- 在线素描中,椭圆一直在画:/
问题出在screenY
函数上。在本地和在线打印处理草图中的 current
变量。在 OpenProcessing 中,变量 current
快速增长到数千以上,而它在本地保持在 0 到 ~260 之间。
似乎 OpenProcessing 在这个函数中有一个错误。
然而,要解决此问题,我建议您在圆的顶部绘制三角形时以不同的方式注册,例如使用角度变量:
// Calculate angle and modulo it by 2 * PI
angle = (angle - 0.02) % (2 * PI);
// If the sketch has made a full revolution
if (previous_1 < previous_2 && previous_1 < angle) {
// draw ellipse at the extrema position
fill(128, 9, 9);
ellipse(-90, -60, 7, 10);
}
// update the 2 previous angles of the third vertex
previous_2 = previous_1;
previous_1 = angle;
但是,由于三角形的绘制方式,椭圆的角度约为 PI / 3
。要解决此问题,一种选择是将屏幕旋转 angle + PI / 3
,如下所示:
rotate(angle + PI / 3);
您可能需要多尝试一下角度偏移,才能在圆的顶部完美绘制椭圆。
为了在线获得与通过 运行 本地处理获得的相同结果,您需要在调用 size
时将渲染模式指定为 3d
例如:
void setup() {
size(1100, 500, P3D);
}
您还需要在调用 screenY()
时指定 z 坐标
current = screenY(-90, -60, 0);
通过这两项更改,您在线获得的结果应该与本地获得的结果相同 运行。
在线:
本地:
当 运行 这个示例直接使用 Processing 和 Processing.js 在浏览器中使用时,我得到不同的结果。为什么?
我对我的结果很满意,想在打开的 Processing 上分享它,但渲染完全不同,我不明白为什么。下面是一个最小的工作示例。
/* Program that rotates a triange and draws an ellipse when the third vertex is on top of the screen*/
float y = 3*height/2;
float x = 3*width/2;
float previous_1 = 0.0;
float previous_2 = 0.0;
float current;
float angle = 0.0;
void setup() {
size(1100, 500);
}
void draw() {
fill(0, 30);
// rotate triangle
angle = angle - 0.02;
translate(x, y);
rotate(angle);
// display triangle
triangle(-50, -50, -30, 30, -90, -60);
// detect whether third vertex is on top by comparing its 3 successive positions
current = screenY(-90, -60); // current position of the third vertex
if (previous_1 < previous_2 && previous_1 < current) {
// draw ellipse at the extrema position
fill(128, 9, 9);
ellipse(-90, -60, 7, 10);
}
// update the 2 previous positions of the third vertex
previous_2 = previous_1;
previous_1 = current;
}
- 在处理过程中,三角形的顶点在上画出椭圆,这是我的目标。
- 在线素描中,椭圆一直在画:/
问题出在screenY
函数上。在本地和在线打印处理草图中的 current
变量。在 OpenProcessing 中,变量 current
快速增长到数千以上,而它在本地保持在 0 到 ~260 之间。
似乎 OpenProcessing 在这个函数中有一个错误。
然而,要解决此问题,我建议您在圆的顶部绘制三角形时以不同的方式注册,例如使用角度变量:
// Calculate angle and modulo it by 2 * PI
angle = (angle - 0.02) % (2 * PI);
// If the sketch has made a full revolution
if (previous_1 < previous_2 && previous_1 < angle) {
// draw ellipse at the extrema position
fill(128, 9, 9);
ellipse(-90, -60, 7, 10);
}
// update the 2 previous angles of the third vertex
previous_2 = previous_1;
previous_1 = angle;
但是,由于三角形的绘制方式,椭圆的角度约为 PI / 3
。要解决此问题,一种选择是将屏幕旋转 angle + PI / 3
,如下所示:
rotate(angle + PI / 3);
您可能需要多尝试一下角度偏移,才能在圆的顶部完美绘制椭圆。
为了在线获得与通过 运行 本地处理获得的相同结果,您需要在调用 size
时将渲染模式指定为 3d例如:
void setup() {
size(1100, 500, P3D);
}
您还需要在调用 screenY()
current = screenY(-90, -60, 0);
通过这两项更改,您在线获得的结果应该与本地获得的结果相同 运行。
在线:
本地: