Post date: Feb 12, 2013 1:00:36 AM
自分が楕円体を実装することにしたしなければならないとき、まだscale命令を知らなかったこともあり、自分で球を実装することにした。
ところでProcessingのsphere命令だとsphereDetail()によって球の粗さを変えることができる。ここで粗さを3にした時の球は次の様になる。
detailを3にするといろいろ3になることが分かった。
また、円状に考えて3分割することにする。つまりsin(TWO_PI * i / 3)すればいいのだ。
void ellipsoid(float x1, float y1, float z1, float x2, float y2, float z2, int n) {
float dx=abs(x1-x2)/2;
float dy=abs(y1-y2)/2;
float dz=abs(z1-z2)/2;
float s=PI/n;
float s2=s*2;
pushMatrix();
translate((x1+x2)/2, (y1+y2)/2, (z1+z2)/2);
beginShape(TRIANGLE_STRIP);
for (int i=0;i<n;i++) {
vertex(0, 0, dz);
vertex(dx*sin(s)*cos(s2*i), dy*sin(s)*sin(s2*i), dz*cos(s));
vertex(dx*sin(s)*cos(s2*(i+1)), dy*sin(s)*sin(s2*(i+1)), dz*cos(s));
}
endShape(CLOSE);
for (int i=1;i<=n-2;i++) {
beginShape(TRIANGLES);
for (int j=0;j<n;j++) {
vertex(dx*sin(s*(i+1))*cos(s2*j), dy*sin(s*(i+1))*sin(s2*j), dz*cos(s*(i+1)));
vertex(dx*sin(s*(i+1))*cos(s2*(j+1)), dy*sin(s*(i+1))*sin(s2*(j+1)), dz*cos(s*(i+1)));
//vertex(dx*sin(s*i)*cos(s2*(j+1)),dy*sin(s*i)*sin(s2*(j+1)),dz*cos(s*i));
vertex(dx*sin(s*i)*cos(s2*j), dy*sin(s*i)*sin(s2*j), dz*cos(s*i));
}
endShape(CLOSE);
}
beginShape(TRIANGLE_STRIP);
for (int i=0;i<n;i++) {
vertex(0, 0, -dz);
vertex(dx*sin(s)*cos(s2*i), -dy*sin(s)*sin(s2*i), dz*cos(s));
vertex(dx*sin(s)*cos(s2*(i+1)), -dy*sin(s)*sin(s2*(i+1)), dz*cos(s));
}
endShape(CLOSE);
popMatrix();
}