No.1ベストアンサー
- 回答日時:
> OpenGLで境界表現によってソリッドモデルを表現したいのですが、うまくできません。
そりゃそうです.OpenGL が扱う幾何モデルは,
バラバラの頂点や多角形の集まりに過ぎません.
OpenGL とソリッドモデルはほとんど無関係で,
モデルを表示するときに OpenGL を使うというだけのことです.
実際,OpenGL にはソリッドモデルを扱うためのデータ構造も関数もありません.
OpenGL が行うことは,ぶっちゃけて言えば,3次元空間内の
多角形を座標変換して2次元平面に描画することだけです.
したがって OpenGL にとっては,複数の多角形の間の関係など
どうでもよくて,表示すべきすべての多角形を片っ端から
描画していけばいいわけです.
他方,境界表現では,頂点,稜線,面などの位相構造
(隣接関係,順序,向きなど) を管理する必要があります.
これらは OpenGL とは全く無関係なものです.
> どのように実装したらよいでしょうか
一例を挙げると,頂点,稜線,面をそれぞれオブジェクトとして,
・頂点は,それに接続する稜線と面へのポインタを,(立体の外側から見て左回りに)
稜線 → 面 → 稜線 → 面 → … とつないだ双方向リストを持つ.
・面は,それを構成する頂点と稜線へのポインタを,(立体の外側から見て左回りに)
頂点 → 稜線 → 頂点 → 稜線 → … とつないだ双方向リストを持つ.
・稜線は次のデータを持つ.
・両端に接続する頂点A,Bへのポインタ.
・立体の外側から見て,A→B方向に対して右側にある面へのポインタ.
・立体の外側から見て,B→A方向に対して右側にある面へのポインタ.
CGによる画像生成の流れ (同志社大学 知識情報処理研究室)
http://indy.doshisha.ac.jp/~watabe/cg/99/polygon …
情報組織論III Advanced Computer Graphics
http://graphics.c.u-tokyo.ac.jp/lectures/io3/not …
→ Half-Edge データ構造 (p.5)
産業情報システム (東大 生産システム工学研究室)
http://www.msel.t.u-tokyo.ac.jp/class/IMI/PDF/IM …
→ 境界表現によるソリッドモデル (p.21~)
厳密に正確な演算を用いたソリッドモデリングに関する研究
http://dspace.wul.waseda.ac.jp/dspace/bitstream/ …
「"境界表現" 面 稜線 頂点」で検索
http://www.google.co.jp/search?q=%22%E5%A2%83%E7 …
この回答への補足
たびたび申し訳ありません。
>頂点は,それに接続する稜線と面へのポインタを,(立体の外側から見て左回りに)
稜線 → 面 → 稜線 → 面 → … とつないだ双方向リストを持つ.
・面は,それを構成する頂点と稜線へのポインタを,(立体の外側から見て左回りに)
頂点 → 稜線 → 頂点 → 稜線 → … とつないだ双方向リストを持つ.
・稜線は次のデータを持つ.
・両端に接続する頂点A,Bへのポインタ.
・立体の外側から見て,A→B方向に対して右側にある面へのポインタ.
・立体の外側から見て,B→A方向に対して右側にある面へのポインタ.
これを実際に簡単な立体(立方体やリブなど)に対して実装するとどのようなプログラムになるのでしょうか?
No.2
- 回答日時:
> これを実際に簡単な立体(立方体やリブなど)に対して
> 実装するとどのようなプログラムになるのでしょうか?
作ったことはないけど,基本的なデータ構造は↓こんな感じかな.
typedef struct Vertex Vertex_t; // 頂点
typedef struct Edge Edge_t; // 稜線
typedef struct Face Face_t; // 面
// Vertex_t,Edge_t,Face_t へのポインタの双方向リストの要素
typedef struct VEFListElement VEFListElement_t;
struct VEFListElement {
// 双方向リストを構成するポインタ
VEFListElement_t *next; // 次の要素
VEFListElement_t *previous; // 直前の要素
union {
Vertex_t *vertex;
Edge_t *edge;
Face_t *face;
};
};
// Vertex_t,Edge_t,Face_t へのポインタの双方向リスト
typedef struct {
VEFListElement_t *first; // 先頭要素を指す.
VEFListElement_t *last; // 末尾要素を指す.
} VEFList_t;
struct Vertex {
// 幾何データ
double x, y, z; // 座標
// 位相構造:この頂点に接続する稜線と面へのポインタの双方向リスト
// (立体の外側から見て左回り順,稜線と面を交互に)
VEFList_t edgesAndFaces;
};
struct Edge {
// 位相構造
Vertex_t *vertex[2]; // この辺の両端点
// face[0]:立体の外側から見て,vertex[0] → vertex[1]
// 方向に対して右側にある面へのポインタ.
// face[1]:立体の外側から見て,vertex[1] → vertex[0]
// 方向に対して右側にある面へのポインタ.
Face_t *face[2];
};
struct Face {
// 位相構造:この面を構成する頂点と稜線へのポインタの双方向リスト
// (立体の外側から見て左回り順,頂点と稜線を交互に)
VEFList_t verticesAndEdges;
};
このデータ構造に対してどういう操作をすればいいかは,
#1 で挙げた3番目の URL の「オイラー操作」を参考にしてください.
実装方法がわからなければ,双方向リストの勉強も必要.
上記データ構造以外に,1つの立体を構成する頂点,稜線,面をひとまとめに
するコンテナが必要.特に,同時に複数の立体を扱う場合は必須.
複雑な立体であっても,単連結な立体ならば基本的にこれでできると思う.
逆に穴が明いてたりすると,追加の情報が必要になるかも.
また,頂点数などが膨大な場合には,幾何学的処理 (最も近い頂点を
検索する,指定された領域内の頂点を列挙するなど) を効率良く行う
ために多次元木などのデータ構造も必要になる.
(その場合,計算幾何学も勉強してください.)
とても参考になりました。ありがとうございます。
実装するには足りない知識が多いようなのでまずは、その部分の勉強をしていきたいと思います。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VLOOKUP 構造化参照について 1 2023/04/24 19:39
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 計算機科学 アルゴリズムについて 2 2023/01/01 19:42
- 日本語 「お花畑」を超える言葉は? 憲法9条厳守論者などは「頭の中がお花畑」などと揶揄されるわけですが……。 9 2022/07/24 14:34
- 人類学・考古学 エジプト神話に出てくるヌト神の身体に表現された星印はパッドを除いたキー構造を意図していませんか? 1 2022/11/10 11:48
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- メディア研究 神社の『鳥居構造』はコンピュータディスクの象徴であり、『賽銭箱』はタスクマネージャーですか? 1 2022/10/29 05:02
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- 英語 「spend+時間+過去分詞」の文の構造について 4 2023/07/19 09:43
- JavaScript 階層別の組織図の自動作成について 1 2022/10/26 13:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++6.0 MFC ダイアログバーを...
-
C言語の関数と配列に関する質問
-
fopne で失敗する原因
-
C言語のポインタに直接アドレス...
-
基本アルゴリズムの『返す』の...
-
C言語: ポインタ
-
【なぜポインタを使うのか】
-
TCHAR文字列内の検索について
-
戻り値で構造体を返すことは可...
-
【VC++2005(CLR)】マルチスレッ...
-
メモリのアドレスからの値の取...
-
ポインタ変数の利用方法
-
VB.NET DLL【API関数(コールバ...
-
VBはCを混乱させる?
-
セグメントエラー
-
LPSTR型の初期化について
-
Windowプログラミング lParam...
-
関数の引数をvoid*でキャストする
-
CopyMemory()をmemcpy()に書き...
-
任意のアドレスの中身を参照し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報