元記事:Mesh editing rewrite


リライトされたMesh編集


Ton Roosendaal氏


新しい選択モード



Vertex選択

Edge選択

Face選択
 MeshのEditModeに入った時、三つの選択モードが選択できるようになりました。これらは3D Header内のアイコンで表示されています(ホットキー:[Ctrl]+[Tab])。

Vertex Select
従来どおりVertexを選択するモードで、以前のバージョンの動作を完全に互換性があります。

Edge Select
Vertexは描画されなくなり、デフォルトではEdge上で選択できるようになります。これは真のEdge選択で、あるFace中の4つのEdgeのうち3つを、自動的に4番目のEdgeが選ばれてしまうことなく選択できるということを意味します。

Face Select
Vertexの代わりに、現在、Faceの中心に選択用の「点」が描画されます。選択されたFaceにはまた、Edgeのように色づけされたアウトラインがつきます。これも真のFace選択で、それぞれのFaceをそのVertexもしくはEdgeの選択状態に関係なく、独立して選択できます。

[Shift]を押したまま選択モードアイコンをクリックすると、上記の選択を組み合わせることができます。現在選択をミックスすることができるようになり、期待通りの挙動をします。
例:Edge+Face選択モードで、あるFaceの4つのEdgeを選択すれば、そのFaceも選択されます。

選択モードとオプションの描画モード(半透明Face、Normal、Solid Draw)は一緒に動作します。すべてのBlenderのMesh編集ツールも、修正された選択モードに反応します。



すばやいEdge/Face loop選択


また、Edge loop(Edge選択モード中)やFace loop(Face選択モード中)を(Edgeモード)ループの一部を成すEdgeもしくは、(Faceモード)ループの一部をなす二つのFaceにつながるEdge上で[Alt]+右クリックすることにより、すばやい選択が行えるようになりました。この説明用のデモムービーをご覧下さい。


Lassoムービーへ
デモムービー(300KB AVI)
 

Lasso(投げ縄)選択


次の新しい選択ツールはLassoツールです。Lassoは[Ctrl]+左マウスドラッグ(もしくは[Ctrl]+右クリック。User PreferenceのSelection Mouse Buttons設定に依存)で操作します。形状を描くことにより、その中の入ったVertex、Edge、Face、また、ObjectModeではObjectを選択することができます。


Extrude

Extrude


EdgeやFace選択モード中のExtrudeにより、extrudeするものとすべきでないものをより正しくコントロールできます。例えば格子模様に選択を行い、extrudeしてみて下さい。

もしFaceをExtrudeする場合、Extrudeは旧FaceのNormalにそって行われ、3DViewでのワークフローがかなり楽になっています。[G](Grab/Move)、[R](Rotate)、[S](Scale)を一度押せば、通常のようにtransformモードが変更できます。

新しい方法のExtrudeも追加されています。最初の二つはFace選択モードでのRegionとIndividual Faceで、新しいFaceを集めたまま維持、もしくは個別のFaceのNormalにそって別々に分割します。また、Edge選択もしくはVertex選択モードでも、Edgeのみ、もしくはVertexのみのExtrudeが可能です。

Region
Region
 Individual Faces
Individual Faces
 Only Edges
Only Edges
 Only Vertices
Only Vertices


Zバッファ選択

Zバッファクリッピング(隠面排除)選択


この新しいオプションは背面で見えないVertex、Edge、Faceの描画を隠し、選択できないようにします。これはVertex、Edgeの終端、Faceの中心点のZバッファ(デプス:深度)値を元にしています。表示と同じアルゴリズムを使用しているため、選択は高精度です。この選択モードは3DViewのHeaderのアイコンでON/OFFできます→アイコン


SubSurf

Subdivision Surface


SubSurfにOptimalモードを使用中、Blenderが再分割された形状自身の(選択可能な)EdgeとFaceをオリジナルの元となるMeshを完全に隠して表示するようになりました。また、これは表示オプションの'Draw Faces'と'Draw Edges'にも動作します。開発中に作成されたデモムービーをご覧ください。



FGon前

FGon後
 

Fake polygons


Face選択最適化の最初のステップとして、同じ平面状にあるFaceの組をまとめることができます。単にFace群を選択し、[F]キーを押して下さい。選択されているFaceは一つのポリゴンを形成しなければならず、内部にVertexを持てないことに注意してください。

この新しいFGon(Fake-Gon、Face-Gonでもなんでも)機能は特にSubdivideやCutツール、SubSurfが作用するとき、現在は大きい面積のポリゴンのEdgeのHideの使用に制限がありますが、将来的には「本当の」n-gonスタイルのポリゴンに拡張される可能性があります。



Edge回転の様子
Demo video (900KB AVI)
 

Rotate Edge


Rotate EdgeはJohnny Matthews氏による新しいツールで、二つのFaceが共有するEdgeを回転することで、Edgeを消して再度繋げるといった手間もなく、Mesh構造を簡単に再構築できます。現在、Meshメニュー→Edgesもしくは'Edge Specials'メニュー([Ctrl]+[E])にあります。二つのFaceのみに共有されているなら、どんなEdgeでも作用します。


その他注意点





EditMesh開発ノート


一般的なフラグの使用方法

"->f" フラグはeditmesh.cとeditmesh_lib.cのコア関数のための予約となっています。実際には現在は選択状態にしか使用されていません。

"->f1" と "->f2" フラグは自由に使えます。これらはVertex/Edge/face構造体で利用できます。自由であるがため、これらのフラグを使用している他の関数を呼び出すとき、チェックは慎重に行ってください…例えばextrude()やsubdivide()がこれらを使用しています。

選択フラグ

EditVert: eve->f & SELECT
EditEdge: eed->f & SELECT
EditFace: efa->f & SELECT

- 選択はhideでない場合のみ使用可能です!
- 選択フラグは常に更新されますが、しかし、
if 選択モード >= SELECT_EDGE Vertexの選択フラグは不正になる場合があります。
if 選択モード == SELECT_FACE Vertex/Edgeの選択フラグは不正になる場合があります。
これはVertexもしくはEdgeが共有されている所為です。

- Vertexを選択する場合
eve->f &= SELECT

- 常にEdgeを選択する場合
void EM_select_edge(eed, 1) // 1 = select, 0 = deselect

- 常にFaceを選択する場合
void EM_select_face(efa, 1) // 1 = select, 0 = deselect

- すべてのデータの'f'フラグをセット
void EM_set_flag_all(int flag);
void EM_clear_flag_all(int flag);

- 旧faceselectedOR()とfaceselectedAND()もまだありますが、そのVertexの評価にのみ使用されます。

選択を扱うコードのヒント

もし選択モードが 'face'の場合、VertexもしくはEdgeの選択は上位(下記参照)にフラッシュする必要があります。'Edge'選択モードにも同じことがいえます。これはすべての選択をコーディング中、注意を向けておく必要があるということです…ある一つのFaceの4つのVertexを選択しても、もう自動的にそのFaceが選択されることはありません。

しかしながら、上記のコールを使用することで、少なくとも選択は下位(Vertexレベル)にフラッシュされます。この時使用できるコールは以下のとおりです。

void EM_selectmode_flush(void);

これは選択モードを元に、選択を上位にフラッシュします。この関数は下記のような動作をします。
- もし選択モードが'vertex':Edge/Faceが選択されたVertexを元に選択されます。
- もし選択モードが'Edge':Faceが選択されたEdgeを元に選択されます。

上手くコントロールされた状況ではちゃんと動作します。

しかし、Faceモードで単にVertexの選択を変更しただけは、まだFaceは選択されません! もしどうしてもVertexの選択だけでの動作が避けられない場合、このコールを使用して下さい。

void EM_select_flush(void);

現在の選択モードを参照せず、今の選択を上流にフラッシュします。しかし、チェッカーボード状のFace選択のような特殊なケースでは破綻する恐れがあります。よってこれはあなたが他のすべてが非選択になっているのを知っている(もしくはそれを非選択にする)場合にのみ使用して下さい。例:プリミティブの追加。

Hideフラグ

EditVert: eve->h
EditEdge: eed->h
EditFace: efa->h

- すべてのhideフラグは常に新しく更新されます。
- hideしているVertex/Edge/Faceは常に非選択状態になります。よって選択されているものだけを操作する場合、hideフラグのチェックは必要ありません。

EditModeとのUndoの統一

新ファイル: editmode_undo.h
ポインタハンドルスタイルのUndoの、非常に素晴らしい関数です。たった三つのコア関数で、あなたのUndoは空へ舞い上がります! このCファイルは素晴らしいリファレンスになります。

また、古いUndoシステムは置き換えられたことに注意して下さい。現在Mesh自身への依存は最小限に(EditModeへの出入りを悪用しなければ)留めており、EditMode関数に上手く制限されています。

EditModeへの出入り

すべてのVertex/Face/Edgeが3つの大きなチャンクに割り当てられたためスピードアップしました。Vertex/Face/Edgeにはこのようなデータが解放できないことを示すためのタグがセットされています。

また、Edgeのハッシュテーブル(参照テーブル)がEditEdge自身の一部を除き、すべてにおいてもうmallocを使用しないようになりました。