普通にはありえない世界を描いた作品があります。ぐにゃぐにゃの時計や、りんごの皮のような男女はご存知の読者も多いことでしょう。BREP(ビーレップ:境界表現)と呼ばれるモデル形状を表す手法(第4回セミナー参照)でも「現実離れ」したモデルを作成することができます。困ったことに「現実離れ」しているかどうかは、モデル作者の意図にかかわらず、モデルを受け取る側が判断します。この辺りに、上流のモデリングシステムから下流のシステムへモデルがうまく渡らない原因があります。モデルを作成する側では、ユーザが意識して「超現実主義」モデルを作ることもありますが、実際にはユーザのコントロールできないところでシステムが勝手に「超現実主義」モデルを作ってしまうこともあります。今回のセミナーでは、受け手のシステムが理解できない可能性をもつモデル、つまり「超現実BREPモデル」について説明していきます。モデリング担当者は、システム操作と関連付けてシステムが作成するBREPの状態を意識することで、後工程と相性のよいモデルを作成することができるでしょう。一度サーフェスモデルとソリッドモデルBREPの視点から「サーフェスモデル」と「ソリッドモデル」について考えてみます。「サーフェスモデラー(張りぼて手法)」と「ソリッドモデラー(彫刻手法)」の区分をするものではありません。(セミナー予告編参照)いずれの手法で作成したモデルもシステム内部では、BREPとしてデータが保持されています。BREPはパッチワークみたいなもので、物体表面をいくつもの端切れで被っています。この端切れをFACE(フェース)と呼びます。(第4回セミナー参照)「サーフェスモデル」では、このFACEは縫い合わされていません。幾何的に「トリム曲面」(第3回セミナー参照)がばらばらに3次元空間に浮かんでいるだけなのです。「ソリッドモデル」では、隣接するFACEがEDGE(エッジ)を介して縫い合わされています。縫い合わされたFACE群をSHELL(シェル)と呼びます。すべてのFACEが縫い合わされてサッカーボールのようになったとき、つまりSHELLが閉じたとき、3次元空間のある体積を切り取ることができます。閉じたSHELLはVOLUME(ボリューム)と呼ばれ、ソリッド(中身が詰まった)状態を表すことができます。「位相」要素を介して関連づけしています。点は「VERTEX(バーテックス)」に、線は「EDGE(エッジ)」に、面は「FACE(フェース)」に1対1に対応します。どのEDGEの両端にどのVERTEXがあるか、どのFACEはどのEDGE群(LOOP)に囲まれているかといった隣接情報を適当に与えていくと、「超現実主義」モデルも作成することができます。(第4回セミナー参照)物体表面から針ねずみのように線が飛び出している形状も可能ですし、厚さがゼロの板を組み立てたような形状も作成できます。これら形状は、CGや有限要素法の解析モデルには有効なのですが、製品として製造できるものではありません。BREPとして数学的に許される形状表現すべてが、そのまま工業製品を表す形状になり得ないことはご理解いただけましたね。ノンマニホールドモデルでは、厚さゼロの部分があります。ソリッド(閉じたSHELL)を表すマニホールドモデルでは、すべてのEDGEは2つのFACEに隣接しています。EDGEはFACEの縫い目なのですから当たり前ですね。開いたSHELLでは、1つのFACEにのみ隣接するEDGEがあります。このEDGEを「オープンエッジ」とか「フリーエッジ」と呼びます。「小数を用いない」であなたの身長を測ることを考えます。長さを測るということは、「基準になる長さ」の何倍かを求めることです。基準になる長さとして「cm(10mm相当)」を採用してみましょう。身長168とか175というような値を得ることができます。この例では身長差7も算出できます。つぎに基準長さに「m(1000mm相当)」を採用してみます。小数を用いませんので、たいていの人は1か2のどちらかになってしまいます。男子高校2年生の平均身長は2mということになりかねません。基準長さに「mm(1mm相当)」を採用するとどうでしょう。先の例で、身長168(cm)であった人は、実は1683で、175(cm)の人は1747かもしれません。ここでは、長さを具体的にイメージし易いように単位をそえて数字を挙げました。コンピュータ内では、168とか123.4というのはただの「数値」です。基準にする長さに小さな値を採用するほど、より細かく長さ(身長)を決定することができます。この「基準にする(最小)長さ」は「分解能:resolution」と呼ばれる概念です。ほとんどの方は分解能についてもう知っています。ディスプレイだって800x600より1600x1200の方が細かな字を識別できます。1ピクセルが小さいわけですね。小数点以下2桁までが有効数字というのなら分解能は0.01となります。トレランス工業製品を表すBREPモデルでは、実際に加工できるものでなければなりませんから、自ずと「これ以上小さな長さは無意味」となる長さが決まります。コンピュータ上では、「無意味となる小さな長さ」をさらに相当小さく設定することができます。あまりに小さくすると製品に反映されないところで計算の手間ばかり増えてしまうことになります。「無意味となる最小長さ」がBREPモデルの分解能に相当します。この分解能は「トレランス」とも呼ばれます。トレランスは、「幾何計算のためのトレランス」と「位相維持のためのトレランス」があります。トレランスの設定は、「絶対値」を与えるのが一般的ですが、モデル全体の大きさを考慮して「相対値」を与えるシステムもあります。トレランスの値は、想定している「単位系」に依存します。コンピュータ固有の「実数のトレランス(計算精度)」があることもお忘れなく。実数のトレランスコンピュータの中では、x、y、zという座標値だけでなく、たくさんの係数が実数として扱われます。この実数を表すのに何桁使えるか(有効桁)が、このトレランスに相当します。(普通はトレランスとは言いませんが、ここでは便宜上トレランスの1つとみなします)有理数や無理数を用いないで、山ほど掛け算や割り算を繰り返してもほぼ正しい答えを得るためには、桁数が多い方が有利です。「単精度」では6桁、「倍精度」では15桁程度です。15桁という精度は、たまたま長さを表すとすれば(これが大切!)トレランス値(分解能)0.000000000000001mmになります。1000分の1同一点トレランスを用いる場面ほんのわずかに離れた(0.0000000001mm)2つの点を考えます。座標を倍精度の実数で表すシステムでは、この2点を区別することができます。この2点の間に線分を作成してみましょう。線分の長さは、0.0000000001mmとなります。同一点トレランスが0.001mmであるなら、この線分は「点に縮退」していることになり、線分として存在することができません。同一点トレランスは「2つの要素」に言及するとき意味を持ちます。2つの曲線の交点を求める場合や、2つの曲面の交線を求める場合に意味を持ちます。交点は、「本当の交点」ではなくそれぞれの曲線から最大で同一点トレランス相当離れている可能性があります。交線は、「本当の交線」ではなく、それぞれの曲面から少し離れている可能性があります。多くのBREPモデリングシステムでは、点、線、面が単独で浮かんでいる限り、実数のトレランスが位置の分解能になります。ある点、線、面から新しく点、線、面を求めるような幾何計算の場面で「同一点トレランス」が適用されます。くどいようですが、「同一点」という表現で、実数値(座標)を区別することと、モデルとして意味のある距離(長さ)を区別することを混同しないでください。トレランスは、モデリングシステムごとに一番具合のよい値が設定されています。逆にいうとあるシステムのあるトレランスで作成されたBREPモデルは、他のシステムでは具合が悪いこともあります。ライノセラスのトレランスライノセラスでは、4つのキーがあります。・単位系mm系のつもりで作ったモデルをインチ系で解釈されると実物のサイズが全く異なってしまいます。ライノセラスではこのようなトラブルを避けるため、事前に単位系を宣言しておくことができます。・絶対トレランス上記の説明では、「同一点トレランス」に相当します。2つの曲面の交線を求めることを考えます。幾何計算では「交線」を表す「曲線」を求めます。「交線」は2つの曲面から全く離れていません。求められた「曲線」は、(神のみ知る)「交線」に近い形を表していますが、最大このトレランス相当離れているかもしれません。言い換えると「曲線」は、このトレランス相当2つの曲面から離れているかもしれません。・相対トレランス幾何計算の途中では、与えられた絶対トレランスより小さな値を利用したい場面があります。このような場合、計算対象となる線や面の大きさから相対的にトレランスを決定します。・角度トレランスライノセラスでは、ユーザが直接指定することができます。ライノセラスでは、モデルの精度を甘くする(次節参照)「位相維持のためのトレランス」という概念はありません。ライノセラスで最後まで作成できたモデルは、精度よいものと考えられます。位相と幾何の調和BREPでは、概念的に位相要素と幾何要素を区別して考えます。システム内のデータ構造単位(エンティティ)が区別されているかどうかは問いません。位相要素は幾何要素の隣接関係を記述する代理人みたいなものです。位相要素によって隣接しているとされた2つの幾何要素、例えば曲面と曲線は、寸分違わず一致していなければならないのですが、現実にはそのような曲線・曲面を求めることは極めて困難なのです。妥協案として少しだけ離れていたりオーバーラップしている状態を許します。許した距離が「位相維持のためのトレランス」です。「位相維持のためのトレランス」を考慮しますと、VERTEX、EDGE、FACEはぼんやり膨らんだ形状とみなせます。VERTEXに対応する幾何要素は「点」です。膨らむと「球」になります。EDGEは「曲線」ですので「パイプ」になります。FACEは「曲面」ですので「マットレス」になります。位相として隣接しているとされる部分では、「球」と「パイプ」あるいは「マットレス」が必ず交わります。そのままで、「位相維持のためのトレランス」をより小さくすると「球」「パイプ」「マットレス」が隣接部分で交わらなくなります。この状態では、位相はくっついていると言っているのに、幾何的には離れていることになります。「位相と幾何が矛盾している」ことになります。こんなBREPモデルは要注意!位相と幾何の調和という立場からみて問題になるBREPモデルを紹介します。ここでは、「位相維持のためのトレランス」をマージトレランスと呼ぶことにします。マージトレランスより大きな隙間・オーバーラップを持つモデル点・線・面を球・パイプ・マットレスに見立てても、位相に反して幾何形状が離れている(一致すべき位置で一致しない)ことになります。明らかに位相と幾何の矛盾です。一般にマージトレランスを厳しくすると起こります。マージトレランスの緩いシステムで作成したBREPモデルを厳しいシステムに読み込むとこうなります。マージトレランスより小さなEDGEをもつモデルマージトレランスより小さな長さのEDGEは、モデル中に存在することができません。点に縮退しているとみなされるからです。BREPモデル中のEDGEは、EDGEの両端に球があることを考えると、最低でもマージトレランスの2倍の長さが必要です。マージトレランスの厳しい(小さい)システムで作成したBREPモデルを緩いシステムに読み込むとこうなります。データ変換とマージトレランスというわけで、マージトレランスを大きくすると微小EDGEが存在できなくなり、小さくすると隙間やオーバーラップが検出されます。多くのCADシステムでは、他のシステムで作成されたBREPモデルを受け入れるため、大き目のマージトレランスを設定できるようになっています。その際、縮退とみなされるEDGEやFACEは無視するしくみになっています。BREP全体で共通のマージトレランスを用いる代わりに、個々のVERTEXやEDGE毎にマージトレランスを設定するシステムもあります。スパイク・カット形状のFACEをもつモデルマージトレランスを大きくすると、スパイクやカット部分の形状が自己交差とみなされます。ノンマニホールドモデルマージトレランスより、形状の薄い部分が、肉厚ゼロとみなされます。位相情報を外したモデルIGES経由でBREPデータを渡すと「ソリッドモデル」が「サーフェスモデル」になることがあります。IGESの規格としては、マニホールドソリッドも記述できるのですが、ほとんどのシステムでは、トリム曲面(タイプ144)の集合を出力するだけで位相要素までは出力されないようです。筆者としてはもったいない気もしますが、BREPという概念が統一されていない現状では仕方ないのかもしれません。例によって感想質問の連絡先このセミナーのページで掲載した概念、文章、挿し絵など一切の責任は、筆者にあります。質問、意見は筆者まで。アプリクラフト社へはねじ込まないでください。