以前、polygon命令を使ってトーラスと言う形状を作りました(「数学曲面のモデリング」を参照ください)。トーラスの断面は円でしたので、二次曲面の組み合わせで作るのは難しい形状でした。
断面が円だと辛いですが、断面が多角形なら円錐面(場合によっては円柱面も使用)を組み合わせることで作れそうです。今回は、断面を正方形で作ってみます。
バウムクーヘンの様な形であれば、下図の様に、円柱面×2、平面×2で作成可能です。
and
{
plane 0,R2,0, 0,1,0;
plane 0,-R2,0, 0,-1,0;
cylind 0,0,0, 0,1,0, R1 + R2;
cylind 0,0,0, 0,1,0, -(R1 - R2);
}
Xi-TRACEデータ | baum_ring.xitr |
これも、断面が正方形(□)のリングです。ただ、これだと汎用的ではないので、次は断面が「□」ではなく、「◇」であるリングを作ってみます。
最初に触れたように、円錐面を使います。円錐面は下左図の様な形です。これを真横から見てみると、下右図の様に「×」マークの様な形に見えます。薄く色のついた側が中身の詰まった側で、Xi-TRACEではNOT/AND/ORと言った論理演算を使って組み合わせることにより、複雑な形状を定義することが可能です。
断面が「◇」であるリングを作成するため、まず、下図の様に上下に少しずらした円錐面を2つ使って、内側の二辺を削り出します。
最後に残したい◇形は黒線で示した図形ですので、青い円錐面と緑の円錐面をOR(和集合)した上で更に、NOT(否定)演算をかけます。これによって、色のついていない白色の部分が残ることとなり、内側の二辺を削り出すことができます。
同じ様に今度は外側の二辺を削り出すために赤とオレンジの円錐面のAND(共通部分)演算を取ります。
最後にすべてのANDを取ると、黒線の◇形が残ります。
and
{
cone 0,R1 + R2,0, 0,1,0, 1; // オレンジ
cone 0,-(R1 + R2),0, 0,1,0, 1; // 赤
nor // not (or (青, 緑))
{
cone 0,R1 - R2,0, 0,1,0, 1; // 青
cone 0,-(R1 - R2),0, 0,1,0, 1; // 緑
}
}
トーラスと同様に大半径R1と小半径R2の2つをパラメータとして、断面が◇形のリングを定義する手続きを作成しました。今回は、◇形の正方形なので、円錐面の傾きはリング面に対して45°の角度となっており、4つの円錐面の中心座標は下図の様に比較的簡単に求めることができました。
ちまちまと計算が面倒なので、比較的簡単な◇形を断面としました。◇形は四辺で、使用した円錐面も四面でした。断面が凸多角形である限り、多角形と同じ数の円錐面を組み合わせさえすれば、任意の凸多角形を断面とするリングが生成できるはずです。
ポイントは、リングの中心側を向いた辺は円錐面をORしてからNOTする、外側を向いた辺は全体のANDの中にそのまま記述することです。また、バウムクーヘンの例も一つのバリエーションで、リングの面に対して平行および直角な辺が存在した場合に限り、例外として円柱面や平面で削る必要があることが分かりました。
完成したデータと動画です。
Xi-TRACEデータ | cone_ring.xitr |
台の上に立っていたリングが回転しながら倒れていく様子です。とは言っても、倒れながら回転する動きに関しては物理的に計算したものではなく、適切にらしく見えるよう、倒れ方や回転速度を調整したものです。
動画は断面が正方形(◇)であることを示すところから始まっています。