ゴム網シミュレータの立体視版
このソフトウェアは無保証であり,あるがままを無償で提供します.このソフトウェアの使用によって発生した,いかなるトラブルに対しても,作者はその責任を負いません.このソフトウェアの利用は,利用される方の自己責任の上でお願いします.
このソフトウェアは実験的に作成したものであり,人の生理的な面への影響などについて検証しておりません.3D表示は視覚等に強い刺激を与える場合があります.このソフトウェアの使用によって目の疲労や頭痛,吐き気等,身体に異常を感じた場合は,直ちに使用を中止してください.また,異常を感じない場合でも,連続的な使用はおやめください.
また,過去に痙攣を伴う症状を経験されたことのある方や,光に対する感受性の高い方は,このソフトウェアの使用を避けてください.頭痛薬,睡眠剤等をご使用の方も,このソフトウェアの使用を避けてください.また,発育途上にあるお子様もこのソフトウェアの使用を避けてください.
上記の内容は初版作成時 (2004年) の記述を参考資料として残したものです.現在の一般的・医学的な助言を示すものではないため,必要に応じて最新の安全情報や医療機関の案内を参照してください.
このプロジェクトは CMake でビルドします.環境ごとに生成器 (Generator) を切り替えてください.
前提:
- Visual Studio 2022 (C++ によるデスクトップ開発)
- CMake 3.15 以上
- Git (freeglut の取得に使用)
コマンド (PowerShell):
cmake -S . -B build-vs2022 -G "Visual Studio 17 2022" -A x64
cmake --build build-vs2022 --config Release実行ファイルは build-vs2022/Release/net3s.exe に生成されます.
前提:
- Xcode (Command Line Tools を含む)
- CMake 3.15 以上
コマンド (Terminal):
cmake -S . -B build-xcode -G Xcode
cmake --build build-xcode --config Release実行ファイルは build-xcode/Release/net3s に生成されます.
前提パッケージ:
sudo apt update
sudo apt install -y build-essential cmake pkg-config freeglut3-dev libgl1-mesa-dev libglu1-mesa-devコマンド (Makefile 生成 + ビルド):
cmake -S . -B build-make -G "Unix Makefiles"
cmake --build build-make -j実行ファイルは build-make/net3s に生成されます.
この節では,起動後にどの順で操作すればよいかを具体的に説明します.
- プログラムを起動します.
- 立体視対応環境(当時の Lavie 3D など)では,必要に応じて 3D 表示を有効にします.
- 初期状態では平面の網(20x20)が表示されます.
- スペースキーでアニメーションを開始します(もう一度押すと停止).
- 赤い結び目: 通常の結び目(物理計算で動く)
- 青い結び目: 固定された結び目(重力や張力で動かない)
- 緑の結び目: 左ドラッグで選択中の結び目
初期設定では図形は表示面より少し奥に配置されています.これはカーソル操作時の混乱を減らすためで,慣れるまでは立体感をつかみにくい場合があります.
- 左ボタン
- 結び目をつかんでドラッグします.
- 近くに複数の結び目がある場合は,より手前の結び目が選択されます.
- 固定済みの青い結び目もドラッグできます(位置を直接変更).
- 中ボタン
- クリックした結び目の固定/解放を切り替えます.
- 右ボタン
- ドラッグで視点を回転します(図形そのものではなく視点を回す操作).
- スペースバー
- アニメーションを開始/停止します(トグル).
mキー- 図形を板状(平面網)に初期化し,アニメーションを停止します.
pキー- 図形を円筒形に初期化し,アニメーションを停止します.
vキー- 表示方法を次の順に切り替えます.
- 線画+結び目 → 隠面消去 → 隠面消去+結び目 → 結び目のみ → 線画のみ
o/cキー- 視差を広げる / 狭める(立体感の強さ調整)
n/fキー- 図形を手前へ / 奥へ移動
Esc/qキー- プログラムを終了
- スペースキーでアニメーション開始
- 右ドラッグで全体を回して形状を観察
- 左ドラッグで数個の結び目を引っ張って変形
- 中クリックで一部の結び目を固定して,布の張り方の違いを確認
vキーで表示モードを切り替え,線画と面表示を見比べるo/cとn/fで見やすい立体感と距離に調整
- 固定点をすべて解放すると,図形が落下して復旧できなくなる場合があります.
- 崩れた場合は
mまたはpキーで再初期化してください. - 強く引っ張りすぎると形が大きく乱れることがあります.必要に応じて一度停止(スペース)してから固定点を設定すると安定しやすくなります.
時々,Lavie G のビデオコントローラ (ATI RADEON9600) が停止してしまうことがあります.その場合は電源スイッチの長押しでリセットしてください.
このプログラムは,結び目 (Knot) を格子状に並べ,隣接点との自然長を保とうとする張力と重力で形状を更新する「質点系」の簡易シミュレーションです.主な実装は main.cpp,視点回転の計算は quaternion.cpp にあります.
- 各結び目は次の情報を持ちます.
- 位置
p[3] - 描画用法線
v[3] - 隣接4方向への自然長
d[4] - 隣接結び目ポインタ
n[4] - 固定・ドラッグ状態フラグ
fix
- 位置
- 形状生成:
mknet()は平面グリッドを作成し,四隅を固定します.mkpipe()は円筒状グリッドを作成し,上端列を固定します.
intervals()で初期配置時の隣接距離を計算し,それを自然長として保持します.
display() 内でアニメーション有効時に optimize(5) を呼び,5回の反復で結び目位置を更新します.
-
forcex()横方向(左右隣接)との距離差から張力を計算して加算します. -
forcez()縦方向(上下隣接)との距離差から張力を計算して加算します. -
forcey()固定されていない結び目に一定の重力(WEIGHT)を与えます.
張力の大きさは s = 1 - (自然長 / 現在長) を用い,s^3(コードでは s *= s * s)で非線形化した値を使います.これにより伸び・縮みの影響を強めた挙動になります.
- 表示モード:
- 点のみ
knotonly() - 線画
wireframe() - 隠面消去付き面描画
surface()
- 点のみ
surface()は各結び目の周辺ベクトルの外積和から法線を求め,正規化してライティングに使います.- ステレオ表示:
- 右目・左目で視錐台 (
glFrustum) と視点平行移動をずらして2回描画します. BARRIER設定ではステンシルを使って走査線ごとに色成分を分離し,視差バリア表示を行います.
- 右目・左目で視錐台 (
-
初期化 (
init) グリッド作成,OpenGL状態設定,回転行列初期化 (qrot) を実行します. -
イベント処理
- 左ドラッグ:
pick()+gluUnProject()で選択結び目を3D座標へ移動 - 中クリック: 結び目の固定/解放をトグル
- 右ドラッグ: クォータニオンで視点回転
- 毎フレーム (
idle->display) 物理更新(必要時)→ 投影設定 → 描画 → バッファスワップを実行します.
qmul()クォータニオン積で「現在姿勢」と「ドラッグで得た増分回転」を合成します.qrot()クォータニオンから 4x4 回転行列を生成し,glMultMatrixd(rt)でシーン回転に適用します.
右ドラッグ中は,マウス移動量から回転角を求めて増分クォータニオン dq を作り,tq = dq * cq として姿勢を更新します.
- 2004年3月25日:初版作成.
- 2026年4月17日:CMakeLists.txt 追加.