ワイヤーフレームで3D空間に形を置く
前回までで、Desmos上に3D的な視点と投影を導入する準備が整いました。今回は、実際に3D空間上にオブジェクトを置く ことに挑戦します。
まずは、ワイヤーフレーム(骨組み)だけの立体 を設置し、まるで空間内に構造物が存在しているかのような視覚表現を目指します。
この記事は、第106話??? 【グラフ計算機/Desmos】 をテキスト化したものです。
🎯 目次
ワイヤーフレームとは何か
立方体を3D空間に置く
その他の例
おわりに
1. ワイヤーフレームとは何か
ワイヤーフレームとは、立体の辺(エッジ)だけを線で描いた構造 です。ポリゴンの「面」が貼られていないので、構造がよく見える特徴があります。
CGの開発初期では、軽量かつ構造がわかりやすいために広く使われていました。
Screenshot of gameplay; the screen at the top shows the player's view of a space station, while the bottom half of the screen displayed details about the ship's position and direction.
Spasim(March 1974) - wiki
2. 立方体を3D空間に置く
点と点を結ぶ
3D空間上にワイヤーフレームを表示するために、Desmos既存機能である点と点を繋ぐ点のリスト を活用します。
V i e w ( p ) V_{iew}\left(p\right)V i e w ( p ) は3D空間上の点 p pp をカメラ視点から見た点が(Desmosグラフ計算機の2Dキャンバス上に)描画されます。2点 p 1 , p 2 p_1, p_2p 1 , p 2 を上記の画像のように点で繋げたいのであれば、
V i e w ( [ p 1 , p 2 ] ) V_{iew}\left(\left[p_1, p_2\right]\right)V i e w ( [ p 1 , p 2 ] )
のように、リストで囲めば良いです。これをたくさんつなげれば3Dオブジェクトができます。
立方体を描画
まずは、最もシンプルなワイヤーフレームオブジェクトとして、立方体 を描画します。
4 - - - - - 3
/ | / |
1 - - - - - 2 |
| | | | z
| 8 - - - | - 7 x _ |
| / | / /
5 - - - - - 6 y
立方体は次の8頂点と、
v 1 = ( 1 , 1 , 1 ) , v 2 = ( − 1 , 1 , 1 ) , v 3 = ( − 1 , − 1 , 1 ) , v 4 = ( 1 , − 1 , 1 ) v 5 = ( 1 , 1 , − 1 ) , v 6 = ( − 1 , 1 , − 1 ) , v 7 = ( − 1 , − 1 , − 1 ) , v 8 = ( 1 , − 1 , 1 ) \begin{aligned}
& \mathbf{v}_1 = (1, 1, 1), \quad \mathbf{v}_2 = (-1, 1, 1), \quad \mathbf{v}_3 = (-1, -1, 1), \quad \mathbf{v}_4 = (1, -1, 1) \\
& \mathbf{v}_5 = (1, 1, -1), \quad \mathbf{v}_6 = (-1, 1, -1), \quad \mathbf{v}_7 = (-1, -1, -1), \quad \mathbf{v}_8 = (1, -1, 1)
\end{aligned} v 1 = ( 1 , 1 , 1 ) , v 2 = ( − 1 , 1 , 1 ) , v 3 = ( − 1 , − 1 , 1 ) , v 4 = ( 1 , − 1 , 1 ) v 5 = ( 1 , 1 , − 1 ) , v 6 = ( − 1 , 1 , − 1 ) , v 7 = ( − 1 , − 1 , − 1 ) , v 8 = ( 1 , − 1 , 1 )
合計12本の辺からなります。各辺は2つの頂点を結んだ線分として定義されます。
Desmosでの描画例
今回のように少ない辺で構成されているモノであれば、3D座標を順にリストとして並べ、線で結ぶのが効率的です。
Desmosのテーブルを用い、点のリストを作成します。複数の線を描画する場合、線と線を途切れさせたい場所に ( 0 / 0 , 0 / 0 ) (0/0, 0/0)( 0/0 , 0/0 ) のような不定形の座標を挿入するのが効果的なテクニックです。これにより、Desmosは描画を中断し、次の有効な座標から新しい線として描画を再開します。
例えば、以下のように頂点を繋いでいくことで、立方体の全12本の辺を描画できます。
b o x X b_{oxX}b o x X b o x Y b_{oxY}b o x Y b o x Z b_{oxZ}b o x Z 備考 1 11 1 11 1 11 − 1 -1− 1 1 11 1 11 − 1 -1− 1 − 1 -1− 1 1 11 1 11 − 1 -1− 1 1 11 1 11 1 11 1 11 上面 0 / 0 0/00/0 0 / 0 0/00/0 0 / 0 0/00/0 途切れ 1 11 1 11 − 1 -1− 1 − 1 -1− 1 1 11 − 1 -1− 1 − 1 -1− 1 − 1 -1− 1 − 1 -1− 1 1 11 − 1 -1− 1 − 1 -1− 1 1 11 1 11 − 1 -1− 1 下面 0 / 0 0/00/0 0 / 0 0/00/0 0 / 0 0/00/0 途切れ 1 11 1 11 1 11 1 11 1 11 − 1 -1− 1 v1-v5 0 / 0 0/00/0 0 / 0 0/00/0 0 / 0 0/00/0 途切れ − 1 -1− 1 1 11 1 11 − 1 -1− 1 1 11 − 1 -1− 1 v2-v6 0 / 0 0/00/0 0 / 0 0/00/0 0 / 0 0/00/0 途切れ − 1 -1− 1 − 1 -1− 1 1 11 − 1 -1− 1 − 1 -1− 1 − 1 -1− 1 v3-v7 0 / 0 0/00/0 0 / 0 0/00/0 0 / 0 0/00/0 途切れ 1 11 − 1 -1− 1 1 11 1 11 − 1 -1− 1 − 1 -1− 1 v4-v8
3. その他の例
立方体の例では、点と点を結んでワイヤーフレームを表現していたため、点が視界の裏側 ( y < 0 ) (y < 0)( y < 0 ) に行ってしまうと、点が消えてしまい辺が表示されなくなってしまいます。(上記のデモでカメラを立方体の内部へ移動させてみてください)
これを回避するために、辺を媒介変数で用いる 方法があります。
媒介変数で線を引く
媒介変数表示で引いた線は、点と点を結ぶ方法とは違います。イメージとしては、連続した点が細かく描画されて線が出来上がるようで、端が描画外に行っても、途中の線は描かれます。
上記のデモでは、 ( t , t , t ) ( 0 ≤ t ≤ 1 ) \left(t,t,t\right) \ \left(0\le t\le1\right)( t , t , t ) ( 0 ≤ t ≤ 1 ) が描画されています。同じ線を引くために、
V i e w ( ( t , t , t ) ) V_{iew}\left(\left(t,t,t\right)\right)V i e w ( ( t , t , t ) )
とすれば、
3D空間上に描くことができます。これをたくさん集めれば3Dオブジェクトができます。
球体ワイヤーフレーム
緯線、経線それぞれ媒介変数表示で曲線を描き球体を表現できます。
V i e w ( ( ( cos t ) ( sin v ) , ( cos t ) ( cos v ) , sin t ) ) for v = [ 0...9 ] 10 2 π ( 0 ≤ t ≤ 2 π ) V i e w ( ( ( cos u ) ( sin t ) , ( cos u ) ( cos t ) , sin u ) ) for u = [ − 4...4 ] 10 π ( − π ≤ t ≤ π ) V_{iew}\left(\left(\left(\cos t\right)\left(\sin v\right),\left(\cos t\right)\left(\cos v\right),\sin t\right)\right)\operatorname{for}v=\frac{\left[0...9\right]}{10}2\pi \ \left(0 \le t \le 2\pi\right)\\
V_{iew}\left(\left(\left(\cos u\right)\left(\sin t\right),\left(\cos u\right)\left(\cos t\right),\sin u\right)\right)\operatorname{for}u=\frac{\left[-4...4\right]}{10}\pi \ \left(-\pi \le t \le \pi\right)\\V i e w ( ( ( cos t ) ( sin v ) , ( cos t ) ( cos v ) , sin t ) ) for v = 10 [ 0...9 ] 2 π ( 0 ≤ t ≤ 2 π ) V i e w ( ( ( cos u ) ( sin t ) , ( cos u ) ( cos t ) , sin u ) ) for u = 10 [ − 4...4 ] π ( − π ≤ t ≤ π )
ワイヤーフレーム?
まるで1層1層積むかのような3D表現のやり方もあります。
円錐
c o n e = 1 − t V i e w ( ( c o n e cos 20 π t + 2 , c o n e sin 20 π t , t ) ) c_{one}=1-t\\
V_{iew}\left(\left(c_{one}\cos20\pi t+2,c_{one}\sin20\pi t,t\right)\right)c o n e = 1 − t V i e w ( ( c o n e cos 20 π t + 2 , c o n e sin 20 π t , t ) )
しずく
d r o p = ( 1 − t ) t V i e w ( ( d r o p cos 20 π t , d r o p sin 20 π t , t ) ) d_{rop}=\left(1-t\right)\sqrt{t}\\
V_{iew}\left(\left(d_{rop}\cos20\pi t,d_{rop}\sin20\pi t,t\right)\right)d ro p = ( 1 − t ) t V i e w ( ( d ro p cos 20 π t , d ro p sin 20 π t , t ) )
双円錐
b i c o n e = 1 2 − ∣ t − 1 2 ∣ V i e w ( ( b i c o n e cos 20 π t − 2 , b i c o n e sin 20 π t , t ) ) b_{icone}=\frac{1}{2}-\left|t-\frac{1}{2}\right| \\
V_{iew}\left(\left(b_{icone}\cos20\pi t-2,b_{icone}\sin20\pi t,t\right)\right)b i co n e = 2 1 − t − 2 1 V i e w ( ( b i co n e cos 20 π t − 2 , b i co n e sin 20 π t , t ) )
おわりに
今回は、Desmos上にワイヤーフレームの立方体オブジェクト を設置することで、実際の3D空間に構造物を描く第一歩を踏み出しました。線のつながり方や奥行きの感じ方を通して、空間の中に物体が存在する感覚を得ることができたはずです。
次回は、このワイヤーフレームに「面」を貼っていきます。単に面を描くだけでなく、裏側の面を非表示にする陰面処理 にも踏み込み、よりリアルな視覚表現を目指します。