Computer-graphics-quick-guide
コンピュータグラフィックスの基礎
コンピューターグラフィックスは、プログラミングの助けを借りてコンピューターの画面に絵を描く技術です。 これには、データの計算、作成、および操作が含まれます。 言い換えれば、コンピューターグラフィックスは画像の生成と操作のためのレンダリングツールであると言えます。
陰極線管
グラフィカルシステムの主要な出力デバイスは、ビデオモニターです。 ビデオモニターの主な要素は、次の図に示す* Cathode Ray Tube(CRT)*です。
CRTの操作は非常に簡単です-
- 電子銃は電子ビーム(陰極線)を放出します。
- 電子ビームは、蛍光体でコーティングされたスクリーン上の指定された位置に向けられる集束および偏向システムを通過します。
- ビームがスクリーンに当たると、蛍光体は、電子ビームが接触する各位置で小さな光スポットを放射します。
- 電子ビームを同じスクリーンポイントにすばやく戻すことにより、画像を再描画します。
画面にオブジェクトを表示するには、2つの方法(ランダムスキャンとラスタースキャン)があります。
ラスタースキャン
ラスタースキャンシステムでは、電子ビームは画面上を一度に1行ずつ掃引されます。 電子ビームが各列を横切ると、ビーム強度のオンとオフが切り替わり、照射スポットのパターンが作成されます。
画像の定義は、 Refresh Buffer または Frame Buffer と呼ばれるメモリ領域に保存されます。 このメモリ領域には、すべてのスクリーンポイントの輝度値のセットが保持されます。 次に、保存された輝度値がリフレッシュバッファから取得され、次の図に示すように、画面に一度に1行(スキャンライン)で「ペイント」されます。
各スクリーンポイントは、*ピクセル(ピクセル)*または*ペル*と呼ばれます。 各走査線の終わりで、電子ビームは画面の左側に戻り、次の走査線の表示を開始します。
ランダムスキャン(ベクタースキャン)
この手法では、ラスタースキャンのように左から右、上から下にスキャンするのではなく、画像を描画する画面の部分にのみ電子ビームを向けます。 また、ベクター表示、ストローク書き込み表示、または*書道表示*とも呼ばれます。
画像の定義は、 refresh display file と呼ばれるメモリ領域に一連の線描画コマンドとして保存されます。 指定された画像を表示するために、システムは表示ファイル内の一連のコマンドを循環させ、各コンポーネント行を順番に描画します。 すべての線描画コマンドが処理された後、システムはリスト内の最初の行コマンドに戻ります。
ランダムスキャンディスプレイは、画像のすべてのコンポーネントラインを毎秒30〜60回描画するように設計されています。
コンピュータグラフィックスの応用
コンピューターグラフィックスには多数のアプリケーションがあり、そのいくつかを以下に示します-
- コンピューターグラフィックユーザーインターフェイス(GUI)-ユーザーがコンピューターと対話できるようにするグラフィックのマウス指向のパラダイム。
- ビジネスプレゼンテーショングラフィックス-「絵は千の言葉に値する」。
- Cartography -マップの描画。
- 天気マップ-リアルタイムのマッピング、記号表現。
- 衛星画像-測地線画像。
- 写真の強化-ぼやけた写真をシャープにします。
- 医療画像-MRI、CATスキャンなど -非侵襲的な内部検査。
- エンジニアリング図面-機械、電気、土木など -過去の青写真を置き換える。
- タイポグラフィ-パブリッシングにおけるキャラクター画像の使用-過去のハードタイプを置き換えます。
- 建築-建設計画、外観スケッチ-過去の青写真と手描きの図面を置き換えます。
- アート-コンピューターはアーティストに新しい媒体を提供します。
- トレーニング-フライトシミュレーター、コンピューター支援命令など
- エンターテイメント-映画やゲーム。
- シミュレーションとモデリング-物理モデリングと制定法の置き換え
ライン生成アルゴリズム
線は2点を接続します。 グラフィックの基本要素です。 線を引くには、線を引くことができる2つのポイントが必要です。 次の3つのアルゴリズムでは、ラインの1つのポイントを$ X _ \ {0}、Y _ \ {0} $、ラインの2番目のポイントを$ X _ \ {1}、Y _ \ {1} $と呼びます。
DDAアルゴリズム
Digital Differential Analyzer(DDA)アルゴリズムは、ここで手順を追って説明する単純なライン生成アルゴリズムです。
- ステップ1 *-2つのエンドポイント$(X _ \ {0}、Y _ \ {0})$および$(X _ \ {1}、Y _ \ {1})$の入力を取得します。
- ステップ2 *-2つの終点間の差を計算します。
dx = X1 - X0
dy = Y1 - Y0
- ステップ3 *-ステップ2で計算された差に基づいて、ピクセルを配置するステップの数を識別する必要があります。 dx> dyの場合、x座標でさらにステップが必要です。それ以外の場合はy座標。
if (absolute(dx) > absolute(dy))
Steps = absolute(dx);
else
Steps = absolute(dy);
- ステップ4 *-x座標とy座標の増分を計算します。
Xincrement = dx/(float) steps;
Yincrement = dy/(float) steps;
- ステップ5 *-x座標とy座標を適切にインクリメントしてピクセルを配置し、線の描画を完了します。
for(int v=0; v < Steps; v++)
{
x = x + Xincrement;
y = y + Yincrement;
putpixel(Round(x), Round(y));
}
ブレゼンハムのライン生成
Bresenhamアルゴリズムは、もう1つのインクリメンタルスキャン変換アルゴリズムです。 このアルゴリズムの大きな利点は、整数計算のみを使用することです。 単位間隔でx軸を移動し、各ステップで2つの異なるy座標から選択します。
たとえば、次の図に示すように、位置(2、3)から(3、3)と(3、4)のいずれかを選択する必要があります。 元のラインにより近いポイントが必要です。
サンプル位置$ X _ \ {k} + 1、$で、数学的な線からの垂直分離は、$ d _ \ {upper} $および$ d _ \ {lower} $としてラベル付けされます。
上記の図から、$ x _ \ {k} + 1 $の数学線上のy座標は-
Y = m($ X _ \ {k} $ + 1)+ b
したがって、$ d _ \ {upper} $および$ d _ \ {lower} $は次のように与えられます-
d _ \ {lower} = y-y _ \ {k}
= m(X _ \ {k} + 1)+ b-Y _ \ {k}
and
d _ \ {upper} =(y _ \ {k} + 1)-y
$ = Y _ \ {k} + 1-m(X _ \ {k} + 1)-b $
これらを使用して、数学的な線に近いピクセルを簡単に決定できます。 この単純な決定は、2つのピクセル位置の違いに基づいています。
d _ \ {lower}-d _ \ {upper} = 2m(x _ \ {k} + 1)-2y _ \ {k} + 2b-1
_m_を_dy/dx_に置き換えてみましょう。ここで、_dx_と_dy_はエンドポイント間の違いです。
dx(d _ \ {lower}-d _ \ {upper})= dx(2 \ frac \ {\ mathrm \ {d} y} \ {\ mathrm \ {d} x}(x _ \ {k} + 1 )-2y _ \ {k} + 2b-1)
= 2dy.x _ \ {k}-2dx.y _ \ {k} + 2dy + 2dx(2b-1)
= 2dy.x _ \ {k}-2dx.y _ \ {k} + C
したがって、線に沿ったkthステップの決定パラメータ$ P _ \ {k} $は次のように与えられます-
p _ \ {k} = dx(d _ \ {lower}-d _ \ {upper})
= 2dy.x _ \ {k}-2dx.y _ \ {k} + C
決定パラメータ$ P _ \ {k} $の符号は、$ d _ \ {lower}-d _ \ {upper} $の符号と同じです。
$ p _ \ {k} $が負の場合、下のピクセルを選択し、そうでない場合は上のピクセルを選択します。
座標の変化はx軸に沿って単位ステップで発生するため、整数計算ですべてを行うことができます。 ステップk + 1で、決定パラメーターは次のように与えられます-
p _ \ {k +1} = 2dy.x _ \ {k + 1}-2dx.y _ \ {k + 1} + C
これから$ p _ \ {k} $を引きます-
$$ p _ \ {k + 1}-p _ \ {k} = 2dy(x _ \ {k + 1}-x _ \ {k})-2dx(y _ \ {k + 1}-y _ \ {k})$ $
ただし、$ x _ \ {k + 1} $は$(xk)+ 1 $と同じです。 So −
p _ \ {k + 1} = p _ \ {k} + 2dy-2dx(y _ \ {k + 1}-y _ \ {k})
ここで、$ Y _ \ {k + 1} – Y _ \ {k} $は、$ P _ \ {k} $の符号に応じて0または1です。
最初の決定パラメータ$ p _ \ {0} $は$(x _ \ {0}、y _ \ {0})$で評価されます-
p _ \ {0} = 2dy-dx
ここで、上記のすべてのポイントと計算を念頭に置いて、勾配m <1-
- ステップ1 *-行の2つの終点を入力し、左の終点を$(x _ \ {0}、y _ \ {0})$に保存します。
- ステップ2 *-点$(x _ \ {0}、y _ \ {0})$をプロットします。
- ステップ3 *-定数dx、dy、2dy、および(2dy – 2dx)を計算し、決定パラメーターの最初の値を取得します-
p _ \ {0} = 2dy-dx
- ステップ4 *-k = 0から始まる、ラインに沿った各$ X _ \ {k} $で、次のテストを実行します-
$ p _ \ {k} $ <0の場合、プロットする次のポイントは$(x _ \ {k} +1、y _ \ {k})$です。
p _ \ {k + 1} = p _ \ {k} + 2dy それ以外の場合、
(x _ \ {k}、y _ \ {k} +1)
p _ \ {k + 1} = p _ \ {k} + 2dy-2dx
- ステップ5 *-ステップ4(dx – 1)回繰り返します。
m> 1の場合、毎回yをインクリメントしながらxをインクリメントする必要があるかどうかを調べます。
解いた後、決定パラメータ$ P _ \ {k} $の方程式は非常に似たものになり、方程式のxとyだけが入れ替わります。
中間点アルゴリズム
中間点アルゴリズムは、PittewayとVan Akenによって変更されたBresenhamによるものです。 次の図に示すように、ポイントPを(x、y)座標に既に配置し、ラインの勾配が0≤k≤1であると仮定します。
次に、次のポイントをEとNのどちらに置くかを決定する必要があります。 これは、ポイントNまたはEに最も近い交点Qを識別することで選択できます。 交点Qが点Nに最も近い場合、Nは次の点と見なされます。それ以外の場合はE
それを決定するには、まず中間点M(x + 1、y +½)を計算します。 EとNを結ぶ垂直線と線の交点QがM未満の場合、Eを次の点として使用します。それ以外の場合は、次のポイントとしてNを使用します。
これを確認するには、暗黙的な方程式を考慮する必要があります-
F(x、y)= mx + b-y
任意のXで正のmの場合、
- yが線上にある場合、F(x、y)= 0
- yが線の上にある場合、F(x、y)<0
- yが線より下の場合、F(x、y)> 0
円生成アルゴリズム
画面に円を描くことは、線を描くことよりも少し複雑です。 円を生成するための2つの一般的なアルゴリズム- Bresenham’s Algorithm および Midpoint Circle Algorithm があります。 これらのアルゴリズムは、円を描くために必要な後続のポイントを決定するという考えに基づいています。 私たちはアルゴリズムを詳細に議論しましょう-
円の方程式は$ X ^ \ {2} + Y ^ \ {2} = r ^ \ {2}、$です。ここで、rは半径です。
ブレゼンハムのアルゴリズム
ラスターディスプレイに連続した円弧を表示することはできません。 代わりに、円弧を完成させるために最も近いピクセル位置を選択する必要があります。
次の図から、ピクセルを(X、Y)の場所に配置し、次のピクセルをどこに配置するかを決定する必要があることがわかります-N(X + 1、Y)またはS(X + 1、 Y-1)。
これは、決定パラメーター d によって決定できます。
- d ⇐ 0の場合、N(X + 1、Y)が次のピクセルとして選択されます。
- d> 0の場合、S(X + 1、Y-1)が次のピクセルとして選択されます。
アルゴリズム
- ステップ1 *-円と半径の中心の座標を取得し、それぞれx、y、Rに保存します。 P = 0およびQ = Rに設定します。
- ステップ2 *-決定パラメーターD = 3 – 2Rを設定します。
- ステップ3 *-P≤Qの間、ステップ8を繰り返します。
- ステップ4 *-円を描く(X、Y、P、Q)を呼び出します。
- ステップ5 *-Pの値を増やします。
- ステップ6 *-D <0の場合、D = D + 4P + 6。
- ステップ7 *-Else Set R = R-1、D = D + 4(P-Q)+ 10。
- ステップ8 *-円を描く(X、Y、P、Q)を呼び出します。
Draw Circle Method(X, Y, P, Q).
Call Putpixel (X + P, Y + Q).
Call Putpixel (X - P, Y + Q).
Call Putpixel (X + P, Y - Q).
Call Putpixel (X - P, Y - Q).
Call Putpixel (X + Q, Y + P).
Call Putpixel (X - Q, Y + P).
Call Putpixel (X + Q, Y - P).
Call Putpixel (X - Q, Y - P).
中間点アルゴリズム
ステップ1 *-半径 *r と円の中心$(x _ \ {c、} y _ \ {c})$を入力し、原点を中心とする円の円周上の最初の点を取得します。
(x0, y0) = (0, r)
- ステップ2 *-決定パラメータの初期値を次のように計算します
$ P _ \ {0} $ = 5/4 – r(この方程式の簡略化については、以下の説明を参照してください。)
f(x, y) = x2 + y2 - r2 = 0
f(xi - 1/2 + e, yi + 1)
= (xi - 1/2 + e)2 + (yi + 1)2 - r2
= (xi- 1/2)2 + (yi + 1)2 - r2 + 2(xi - 1/2)e + e2
= f(xi - 1/2, yi + 1) + 2(xi - 1/2)e + e2 = 0
Let di = f(xi - 1/2, yi + 1) = -2(xi - 1/2)e - e2
Thus,
If e < 0 then di > 0 so choose point S = (xi - 1, yi + 1).
di+1 = f(xi - 1 - 1/2, yi + 1 + 1) = ((xi - 1/2) - 1)2 + ((yi + 1) + 1)2 - r2
= di - 2(xi - 1) + 2(yi + 1) + 1
= di + 2(yi + 1 - xi + 1) + 1
If e >= 0 then di <= 0 so choose point T = (xi, yi + 1)
di+1 = f(xi - 1/2, yi + 1 + 1)
= di + 2yi+1 + 1
The initial value of di is
d0 = f(r - 1/2, 0 + 1) = (r - 1/2)2 + 12 - r2
= 5/4 - r {1-r can be used if r is an integer}
When point S = (xi - 1, yi + 1) is chosen then
di+1 = di + -2xi+1 + 2yi+1 + 1
When point T = (xi, yi + 1) is chosen then
di+1 = di + 2yi+1 + 1
- ステップ3 *-K = 0で始まる各$ X _ \ {K} $位置で、次のテストを実行します-
If PK < 0 then next point on circle (0,0) is (XK+1,YK) and
PK+1 = PK + 2XK+1 + 1
Else
PK+1 = PK + 2XK+1 + 1 – 2YK+1
Where, 2XK+1 = 2XK+2 and 2YK+1 = 2YK-2.
- ステップ4 *-他の7オクタントの対称点を決定します。
- ステップ5 *-各計算ピクセル位置(X、Y)を$(X _ \ {C、} Y _ \ {C})$を中心とする円形パスに移動し、座標値をプロットします。
X = X + XC, Y = Y + YC
- ステップ6 *-X> = Yになるまでステップ3から5を繰り返します。
ポリゴン充填アルゴリズム
ポリゴンは、次の図に示すように、頂点の順序付きリストです。 特定の色で多角形を塗りつぶすには、多角形の境界にあるピクセルと多角形の内部にあるピクセルを決定する必要があります。 この章では、さまざまな手法を使用してポリゴンを塗りつぶす方法を説明します。
スキャンラインアルゴリズム
このアルゴリズムは、スキャンラインとポリゴンエッジを交差させることで機能し、交差のペア間でポリゴンを塗りつぶします。 次の手順は、このアルゴリズムの仕組みを示しています。
- ステップ1 *-指定されたポリゴンからYminとYmaxを見つけます。
- ステップ2 *-ScanLineは、YminからYmaxまでのポリゴンの各エッジと交差します。 ポリゴンの各交点に名前を付けます。 上図に示すように、p0、p1、p2、p3という名前が付けられています。
- ステップ3 *-交点をX座標の昇順で並べ替えます。 (p0、p1)、(p1、p2)、および(p2、p3)。
- ステップ4 *-ポリゴンの内側にある座標のすべてのペアを塗りつぶし、代替のペアを無視します。
フラッドフィルアルゴリズム
領域とその境界を異なる色で塗りつぶしたいオブジェクトに出くわすことがあります。 境界充填アルゴリズムのように特定の境界色を検索する代わりに、指定された内部色でそのようなオブジェクトをペイントできます。
オブジェクトの境界に依存する代わりに、塗りつぶしの色に依存します。 つまり、オブジェクトの内部色を塗りつぶし色に置き換えます。 元の内部色のピクセルがなくなると、アルゴリズムは完了します。
繰り返しになりますが、このアルゴリズムは、ピクセルを塗りつぶす4連結または8連結の方法に依存しています。 ただし、境界色を探す代わりに、内部の一部であるすべての隣接ピクセルを探します。
境界塗りつぶしアルゴリズム
境界塗りつぶしアルゴリズムはその名前として機能します。 このアルゴリズムは、オブジェクト内のポイントを選択し、オブジェクトの境界に到達するまで塗りつぶし始めます。 このアルゴリズムが機能するには、境界線の色と塗りつぶす色が異なる必要があります。
このアルゴリズムでは、境界線の色がオブジェクト全体で同じであると想定しています。 境界塗りつぶしアルゴリズムは、4接続ピクセルまたは8接続ピクセルで実装できます。
4連結ポリゴン
この手法では、図に示すように4連結ピクセルが使用されます。 現在のピクセルの上、下、右、左にピクセルを配置しています。このプロセスは、異なる色の境界が見つかるまで続きます。
アルゴリズム
- ステップ1 *-シードポイント(seedx、seedy)、fcolor、およびdcolの値を初期化します。
- ステップ2 *-ポリゴンの境界値を定義します。
- ステップ3 *-現在のシードポイントがデフォルトの色かどうかを確認し、境界ピクセルに達するまでステップ4と5を繰り返します。
If getpixel(x, y) = dcol then repeat step 4 and 5
- ステップ4 *-シードポイントの塗りつぶし色でデフォルトの色を変更します。
setPixel(seedx, seedy, fcol)
- ステップ5 *-4つの近傍点を使用して再帰的に手順に従います。
FloodFill (seedx – 1, seedy, fcol, dcol)
FloodFill (seedx + 1, seedy, fcol, dcol)
FloodFill (seedx, seedy - 1, fcol, dcol)
FloodFill (seedx – 1, seedy + 1, fcol, dcol)
- ステップ6 *-終了
この手法には問題があります。 以下に示すように、リージョン全体を埋めようとした場合を考えてください。 ここでは、画像は部分的にのみ塗りつぶされます。 このような場合、4連結ピクセル技術は使用できません。
8接続ポリゴン
この手法では、図に示すように8連結ピクセルが使用されます。 4連結手法で行っていたように、現在のピクセルの上下左右にピクセルを配置しています。
これに加えて、現在のピクセルの領域全体が覆われるように、ピクセルを対角線上に配置しています。 このプロセスは、異なる色の境界が見つかるまで続きます。
アルゴリズム
- ステップ1 *-シードポイント(seedx、seedy)、fcolor、およびdcolの値を初期化します。
- ステップ2 *-ポリゴンの境界値を定義します。
- ステップ3 *-現在のシードポイントがデフォルトの色であるかどうかを確認し、境界ピクセルに達するまでステップ4と5を繰り返します。
If getpixel(x,y) = dcol then repeat step 4 and 5
- ステップ4 *-シードポイントの塗りつぶし色でデフォルトの色を変更します。
setPixel(seedx, seedy, fcol)
- ステップ5 *-4つの近傍点を使用して再帰的に手順に従います
FloodFill (seedx – 1, seedy, fcol, dcol)
FloodFill (seedx + 1, seedy, fcol, dcol)
FloodFill (seedx, seedy - 1, fcol, dcol)
FloodFill (seedx, seedy + 1, fcol, dcol)
FloodFill (seedx – 1, seedy + 1, fcol, dcol)
FloodFill (seedx + 1, seedy + 1, fcol, dcol)
FloodFill (seedx + 1, seedy - 1, fcol, dcol)
FloodFill (seedx – 1, seedy - 1, fcol, dcol)
- ステップ6 *-終了
4連結ピクセルテクニックは、8連結テクニックでは発生しない次の図に示すように、領域を塗りつぶすことができませんでした。
内外テスト
この方法は counting number method とも呼ばれます。 オブジェクトを塗りつぶしている間、特定のポイントがオブジェクトの内部にあるか外部にあるかを識別する必要があります。 特定のポイントがオブジェクトの内側にあるか外側にあるかを識別することができる2つの方法があります。
- 奇偶則
- 非ゼロワインディング数規則
奇偶則
この手法では、任意の点(x、y)から無限大までの線に沿って交差するエッジをカウントします。 相互作用の数が奇数の場合、ポイント(x、y)は内部ポイントです。相互作用の数が偶数の場合、ポイント(x、y)は外部ポイントです。 次の例は、この概念を示しています。
上の図から、点(x、y)から、左側の相互作用点の数は5で、右側の相互作用点の数は3であることがわかります。 両端から、相互作用点の数は奇数であるため、点はオブジェクト内で考慮されます。
非ゼロ巻数規則
このメソッドは、指定されたポイントが内部かどうかをテストするために単純なポリゴンでも使用されます。 ピンとゴムバンドの助けを借りて簡単に理解できます。 多角形の端の1つにピンを固定し、その中の輪ゴムを固定してから、多角形の縁に沿って輪ゴムを引き伸ばします。
多角形のすべての端が輪ゴムで覆われたら、テストするポイントに固定されているピンを確認します。 ポイントで少なくとも1つの風がポリゴン内にある場合、それ以外の場合は、ポイントがポリゴン内にないと言うことができます。
別の代替方法では、多角形のすべてのエッジに方向を与えます。 テストするポイントからX方向の左端に向かってスキャンラインを描画します。
- 上方向に向かうすべてのエッジに値1を、方向値として他のすべてに-1を与えます。
- スキャンラインが通過するエッジ方向の値を確認し、それらを合計します。
- この方向の値の合計がゼロ以外の場合、テストするこのポイントは*内部ポイント*、それ以外の場合は*外部ポイント*です。
- 上の図では、スキャンラインが通過する方向の値を合計すると、合計は1 – 1 + 1 = 1になります。これはゼロ以外です。 そのため、ポイントは内部ポイントと呼ばれます。
表示とクリッピング
コンピューターグラフィックスでのクリッピングの主な用途は、表示ウィンドウの外側にあるオブジェクト、線、または線分を削除することです。 ビューイング変換は、ビューイングボリュームに対するポイントの位置、特にビューアーの背後のポイントには影響されません。ビューを生成する前にこれらのポイントを削除する必要があります。
ポイントクリッピング
特定のウィンドウからポイントをクリップするのは非常に簡単です。 次の図を検討してください。長方形はウィンドウを示しています。 ポイントクリッピングは、指定されたポイント(X、Y)が指定されたウィンドウ内にあるかどうかを示します。そして、ウィンドウの最小および最大座標を使用するかどうかを決定します。
XがWx1≤X≤Wx2の間にある場合、指定されたポイントのX座標はウィンドウ内にあります。 同様に、YがWy1≤Y≤Wy2の間にある場合、指定されたポイントのY座標はウィンドウ内にあります。
ラインクリッピング
ラインクリッピングの概念は、ポイントクリッピングと同じです。 ラインクリッピングでは、ウィンドウの外側にあるラインの部分をカットし、ウィンドウの内側にある部分のみを保持します。
Cohen-Sutherlandラインクリッピング
このアルゴリズムは、次の図に示すように、クリッピングウィンドウを使用します。 クリッピング領域の最小座標は$(XW _ \ {min、} YW _ \ {min})$で、クリッピング領域の最大座標は$(XW _ \ {max、} YW _ \ {max})$です。
Cohen-Sutherland Line Clipping
4ビットを使用して領域全体を分割します。 これらの4ビットは、次の図に示すように、領域の上部、下部、右、および左を表します。 ここで、 TOP および LEFT ビットは、 TOP-LEFT コーナーであるため1に設定されます。
ラインには3つの可能性があります-
- 行は完全にウィンドウ内に入れることができます(この行は受け入れられます)。
- 行は完全にウィンドウの外側にある場合があります(この行は領域から完全に削除されます)。
- 線は部分的にウィンドウの内側にある場合があります(交点を見つけ、領域内にある線の部分のみを描画します)。
アルゴリズム
- ステップ1 *-各エンドポイントに地域コードを割り当てます。
ステップ2 *-両方のエンドポイントに地域コード *0000 がある場合、この行を受け入れます。
ステップ3 *-それ以外の場合、両方の地域コードに対して論理的な AND *操作を実行します。
ステップ3.1 *-結果が 0000でない場合、*行を拒否します。
- ステップ3.2 *-それ以外の場合は、クリッピングが必要です。
- ステップ3.2.1 *-ウィンドウの外側にある行のエンドポイントを選択します。
- ステップ3.2.2 *-ウィンドウ境界での交点を見つけます(リージョンコードに基づいて)。
- ステップ3.2.3 *-エンドポイントを交点に置き換え、地域コードを更新します。
- ステップ3.2.4 *-簡単に受け入れられるか、または簡単に拒否されるクリップされた行が見つかるまで、ステップ2を繰り返します。
- ステップ4 *-他の行に対してステップ1を繰り返します。
Cyrus-Beckラインクリッピングアルゴリズム
このアルゴリズムは、Cohen-Sutherlandアルゴリズムよりも効率的です。 パラメトリックライン表現と単純なドット積を採用しています。
線のパラメトリック方程式は-
P0P1:P(t) = P0 + t(P1 - P0)
N〜i〜を外側の法線エッジE〜i〜とします。 ここで、エッジE〜i〜上の任意のポイントP〜Ei〜を選択すると、ドット積N〜i〜。[P(t)– P〜Ei〜]は、ポイントP(t)が「クリップエッジの内側」にあるかどうかを決定しますまたは、クリップの端の「外側」またはクリップの端の「上」です。
N〜i〜。[P(t)– P〜Ei〜] <0の場合、ポイントP(t)は内側にあります。
N〜i〜。[P(t)– P〜Ei〜]> 0の場合、ポイントP(t)は外側にあります。
N〜i〜。[P(t)– P〜Ei〜] = 0(交差点)の場合、ポイントP(t)はエッジ上にあります。
N〜i〜。[P(t)– P〜Ei〜] = 0
N〜i〜。[P〜0〜+ t(P〜1〜-P〜0〜)– P〜Ei〜] = 0(P(t)をP〜0〜+ t(P〜1〜-と置き換えるP〜0〜))
N〜i〜。[P〜0〜– P〜Ei〜] + N〜i〜.t [P〜1〜-P〜0〜] = 0
N〜i〜。[P〜0〜– P〜Ei〜] + N〜i〜∙tD = 0([P〜1〜-P〜0〜]にDを代入)
N〜i〜。[P〜0〜– P〜Ei〜] =-N〜i〜∙tD
tの方程式は、
t = \ tfrac \ {N _ \ {i}。[P _ \ {o}-P _ \ {Ei}]} \ {\ {-N _ \ {i} .D}}
次の条件に有効です-
- N〜i〜≠0(エラーは発生しません)
- D≠0(P〜1〜≠P〜0〜)
- N〜i〜∙D≠0(P〜0〜P〜1〜はE〜i〜と平行ではありません)
ポリゴンクリッピング(サザーランドホジマンアルゴリズム)
クリッピングウィンドウを指定して、ポリゴンをクリップすることもできます。 Sutherland Hodgemanポリゴンクリッピングアルゴリズムは、ポリゴンクリッピングに使用されます。 このアルゴリズムでは、ポリゴンのすべての頂点がクリッピングウィンドウの各エッジに対してクリップされます。
まず、ポリゴンウィンドウの左端に対してポリゴンがクリップされ、ポリゴンの新しい頂点が取得されます。 これらの新しい頂点は、次の図に示すように、クリッピングウィンドウの右端、上端、下端に対してポリゴンをクリップするために使用されます。
クリッピングウィンドウでポリゴンのエッジを処理しているときに、エッジが完全にクリッピングウィンドウ内になく、交差点から外側のエッジまでの部分的なエッジがクリップされる場合、交差点が見つかります。 次の図は、左、右、上端、下端のクリッピングを示しています-
テキストの切り抜き
コンピューターグラフィックスでテキストクリッピングを提供するには、さまざまな手法が使用されます。 文字の生成に使用される方法と特定のアプリケーションの要件によって異なります。 以下にリストされているテキストのクリッピングのための3つの方法があります-
- すべてまたはまったく文字列のクリッピング
- すべてまたはまったく文字のクリッピング
- テキストクリッピング
次の図は、すべてまたはまったく文字列のクリッピングを示しています-
すべてまたはまったく文字列のクリッピング方法では、文字列全体を保持するか、クリッピングウィンドウに基づいて文字列全体を拒否します。 上の図に示すように、STRING2は完全にクリッピングウィンドウ内にあるため、STRING2を維持し、STRING1はウィンドウ内に部分的にのみ存在します。
次の図は、すべてまたはまったく文字のクリッピングを示しています-
このクリッピング方法は、文字列全体ではなく文字に基づいています。 このメソッドでは、文字列が完全にクリッピングウィンドウ内にある場合、それを保持します。 それが部分的にウィンドウの外側にある場合、-
- 文字列の外側にある部分のみを拒否します
- 文字がクリッピングウィンドウの境界上にある場合、その文字全体を破棄し、残りの文字列を保持します。
次の図は、テキストのクリッピングを示しています-
このクリッピング方法は、文字列全体ではなく文字に基づいています。 このメソッドでは、文字列が完全にクリッピングウィンドウ内にある場合、それを保持します。 部分的にウィンドウの外側にある場合、
- 文字列の外側にある部分のみを拒否します。
- 文字がクリッピングウィンドウの境界上にある場合、クリッピングウィンドウの外側にある文字の部分のみを破棄します。
ビットマップグラフィックス
ビットマップは、画像を記述するピクセルのコレクションです。 これは、コンピューターが画像の保存と表示に使用するコンピューターグラフィックスの一種です。 このタイプのグラフィックスでは、画像はビットごとに保存されるため、ビットマップグラフィックスと呼ばれます。 理解を深めるために、ビットマップグラフィックスを使用して笑顔の顔を描く次の例を考えてみましょう。
このスマイリーフェイスがコンピューターグラフィックスに少しずつ保存される様子を見ていきましょう。
元のスマイリーフェイスを注意深く観察すると、上の図でB1、B2およびE1、E2として表されている2本の青い線があることがわかります。
同様に、スマイリーは、それぞれA4、B5、C6、D6、E5、およびF4の組み合わせビットを使用して表されます。
ビットマップグラフィックスの主な欠点は次のとおりです-
- ビットマップ画像のサイズを変更することはできません。 サイズを変更しようとすると、ピクセルがぼやけます。
- 色付きビットマップは非常に大きくなる場合があります。
2D変換
変換とは、ルールを適用することにより、いくつかのグラフィックスを別のものに変更することを意味します。 変換、拡大または縮小、回転、せん断など、さまざまな種類の変換を行うことができます。 変換が2D平面で行われる場合、2D変換と呼ばれます。
変換は、コンピューターグラフィックスで重要な役割を果たし、画面上のグラフィックスの位置を変更し、サイズや向きを変更します。
同種座標
変換とそれに続く回転やスケーリングなどの一連の変換を実行するには、順次プロセスに従う必要があります-
- 座標を変換し、
- 変換された座標を回転してから、
- 回転した座標をスケーリングして、複合変換を完了します。
このプロセスを短縮するには、2×2変換行列の代わりに3×3変換行列を使用する必要があります。 2×2行列を3×3行列に変換するには、追加のダミー座標Wを追加する必要があります。
この方法で、2つの数字の代わりに3つの数字でポイントを表すことができます。これは*同次座標*システムと呼ばれます。 このシステムでは、すべての変換方程式を行列乗算で表現できます。 デカルトポイントP(X、Y)は、P ’(X〜h〜、Y〜h〜、h)により同次座標に変換できます。
翻訳
翻訳は、オブジェクトを画面上の別の位置に移動します。 変換座標(t〜x〜、t〜y〜)を元の座標(X、Y)に追加して、新しい座標(X ’、Y’)を取得することにより、2Dで点を変換できます。
上記の図から、あなたはそれを書くことができます-
- X ’= X&plus; t〜x〜*
- Y ’= Y&plus; t〜y〜*
ペア(t〜x〜、t〜y〜)は、変換ベクトルまたはシフトベクトルと呼ばれます。 上記の方程式は、列ベクトルを使用して表すこともできます。
$ P = \ frac \ {[X]} \ {[Y]} $ p '= $ \ frac \ {[X']} \ {[Y ']} $ T = $ \ frac \ {[t _ \ { x}]} \ {[t _ \ {y}]} $
私たちはそれを次のように書くことができます-
*P ’= P&plus; T*
回転
回転では、オブジェクトをその原点から特定の角度θ(シータ)で回転させます。 次の図から、点P(X、Y)は、原点から距離rの水平X座標から角度φにあることがわかります。
角度θで回転させたいとしましょう。 新しい場所に回転すると、新しいポイントP '(X'、Y ')が得られます。
標準の三角法を使用して、点P(X、Y)の元の座標は次のように表すことができます-
$ X = r \、cos \、\ phi …… (1)$
$ Y = r \、sin \、\ phi …… (2)$
同様に、ポイントP '(X'、Y ')を次のように表すことができます-
$ \ {x} '= r \:cos \:\ left(\ phi \:&plus; \:\ theta \ right)= r \:cos \:\ phi \:cos \:\ theta \:-\: r \:sin \:\ phi \:sin \:\ theta ……. (3)$
$ \ {y} '= r \:sin \:\ left(\ phi \:&plus; \:\ theta \ right)= r \:cos \:\ phi \:sin \:\ theta \:&plus; \:r \:sin \:\ phi \:cos \:\ theta ……. (4)$
式(1)と(2)をそれぞれ(3)と(4)に代入すると、次のようになります。
$ \ {x} '= x \:cos \:\ theta − \:y \:sin \:\ theta $
$ \ {y} '= x \:sin \:\ theta&plus; \:y \:cos \:\ theta $
上記の方程式を行列形式で表すと、
[X 'Y'] = [X Y] \ begin \ {bmatrix} cos \ theta&sin \ theta \\ -sin \ theta&cos \ theta \ end \ {bmatrix} OR
P ’= P R
Rは回転行列です
R = \ begin \ {bmatrix} cos \ theta&sin \ theta \\ -sin \ theta&cos \ theta \ end \ {bmatrix}
回転角度は正と負のどちらでもかまいません。
正の回転角度の場合、上記の回転行列を使用できます。 ただし、負の角度の回転の場合、マトリックスは次のように変化します-
R = \ begin \ {bmatrix} cos(− \ theta)&sin(− \ theta)\\ -sin(− \ theta)&cos(− \ theta)\ end \ {bmatrix}
= \ begin \ {bmatrix} cos \ theta&-sin \ theta \\ sin \ theta&cos \ theta \ end \ {bmatrix} \ left(\ because cos(− \ theta)= cos \ theta \;および\; sin(− \ theta)= −sin \ theta \ right)
スケーリング
オブジェクトのサイズを変更するには、スケーリング変換が使用されます。 スケーリングプロセスでは、オブジェクトのサイズを拡大または縮小します。 スケーリングは、目的の結果を得るために、オブジェクトの元の座標にスケーリング係数を掛けることで実現できます。
元の座標が(X、Y)、スケーリング係数が(S〜X〜、S〜Y〜)、生成された座標が(X ’、Y’)であると仮定します。 これは以下に示すように数学的に表すことができます-
- X '= X。 S〜X〜およびY '= Y S〜Y〜*
スケーリング係数S〜X〜、S〜Y〜は、それぞれXおよびY方向にオブジェクトをスケーリングします。 上記の方程式は、以下のように行列形式で表すこともできます-
\ binom \ {X '} \ {Y'} = \ binom \ {X} \ {Y} \ begin \ {bmatrix} S _ \ {x}&0 \\ 0&S _ \ {y} \ end \ {bmatrix}
OR
- P ’= P S*
ここで、Sはスケーリング行列です。 次の図に、スケーリングプロセスを示します。
スケーリング係数Sに1未満の値を指定すると、オブジェクトのサイズを小さくできます。 1より大きい値を指定すると、オブジェクトのサイズを増やすことができます。
反射
反射は、元のオブジェクトの鏡像です。 つまり、180°の回転操作であると言えます。 反射変換では、オブジェクトのサイズは変わりません。
次の図は、X軸とY軸、およびそれぞれ原点に関する反射を示しています。
剪断
オブジェクトの形状を傾斜させる変換は、せん断変換と呼ばれます。 2つのせん断変換* X-せん断*および* Y-せん断*があります。 1つはX座標値をシフトし、もう1つはY座標値をシフトします。 しかしながら;どちらの場合も、1つの座標のみが座標を変更し、他の座標はその値を保持します。 せん断は、*スキュー*とも呼ばれます。
Xせん断
Xせん断はY座標を保持し、X座標に変更が加えられます。これにより、下の図に示すように垂直線が右または左に傾斜します。
X-せん断の変換行列は次のように表すことができます-
X _ \ {sh} = \ begin \ {bmatrix} 1&shx&0 \\ 0&1&0 \\ 0&0&1 \ end \ {bmatrix}
Y '= Y&plus; 〜 X
X ’= X
Yせん断
YシアはX座標を保持し、Y座標を変更します。これにより、次の図に示すように、水平線が上下に傾斜する線に変換されます。
Yせん断は、次の行列から表すことができます-
Y _ \ {sh} \ begin \ {bmatrix} 1&0&0 \\ shy&1&0 \\ 0&0&1 \ end \ {bmatrix}
X ’= X&plus; Sh〜x〜。 Y
Y ’= Y
複合変換
平面T1の変換の後に2番目の平面変換T2が続く場合、結果自体は、T1とT2の順序で構成された単一の変換Tで表すことができます。 これはT = T1∙T2と書かれています。
複合変換は、変換行列を連結して結合変換行列を取得することで実現できます。
結合行列-
*[T] [X] = [X] [T1] [T2] [T3] [T4]…。 [Tn]*
[Ti]は次の組み合わせです
- 翻訳
- スケーリング
- 剪断
- 回転
- 反射
一般的に行列の乗算は累積的ではないため、変換の順序の変更は異なる結果をもたらします。つまり、[A]です。 [B]≠[B]。 [A]および乗算の順序。 変換を作成する基本的な目的は、一連の変換を次々に適用するのではなく、1つの合成変換をポイントに適用することで効率を上げることです。
たとえば、任意の点(X〜p〜、Y〜p〜)を中心にオブジェクトを回転させるには、3つのステップを実行する必要があります-
- ポイント(X〜p〜、Y〜p〜)を原点に変換します。
- 原点を中心に回転させます。
- 最後に、回転中心を元の位置に戻します。
3Dコンピューターグラフィックス
2Dシステムでは2つの座標XとYのみを使用しますが、3Dでは追加の座標Zが追加されます。 3Dグラフィックス技術とそのアプリケーションは、エンターテインメント、ゲーム、コンピューター支援設計業界の基本です。 科学的な視覚化の研究の継続的な領域です。
さらに、3Dグラフィックスコンポーネントは現在、ほぼすべてのパーソナルコンピューターの一部であり、ゲームなどのグラフィックスを多用するソフトウェアを対象としていますが、他のアプリケーションで使用される機会が増えています。
平行投影
平行投影はz座標を破棄し、オブジェクトの各頂点からの平行線は、ビュー平面と交差するまで延長されます。 平行投影では、投影の中心ではなく投影の方向を指定します。
平行投影では、投影の中心から投影面までの距離は無限です。 このタイプの投影では、投影された頂点を元のオブジェクトの接続に対応する線分で接続します。
平行投影は現実的ではありませんが、正確な測定には適しています。 このタイプの投影では、平行線は平行のままであり、角度は保持されません。 さまざまなタイプの平行投影が次の階層に示されています。
正投影
正投影では、投影の方向は平面の投影に垂直です。 正投影には3つのタイプがあります-
- フロントプロジェクション
- トッププロジェクション
- サイドプロジェクション
斜め投影
斜め投影では、投影の方向は平面の投影に垂直ではありません。 斜め投影では、正射投影よりもオブジェクトをよく見ることができます。
斜め投影には、 Cavalier と Cabinet の2種類があります。 キャバリエ投影は、投影面と45°の角度をなします。 ビュー平面に垂直な線の投影は、キャバリエ投影の線自体と同じ長さです。 キャバリアプロジェクションでは、3つの主な方向すべての短縮率が等しくなります。
キャビネット投影は、投影面と63.4°の角度をなします。 キャビネット投影では、表示面に垂直な線は実際の長さの半分で投影されます。 両方の投影は、次の図に示されています-
等尺投影
オブジェクトの複数の側面を表示する正投影は、* axonometric正投影と呼ばれます*。 最も一般的な軸測投影法は、投影平面がモデル座標系の各座標軸と等距離で交差する「等角投影法」です。 この投影では、線の平行度は保持されますが、角度は保持されません。 次の図は、等角投影を示しています-
透視投影
透視投影では、投影の中心から投影面までの距離は有限であり、オブジェクトのサイズは距離に反比例して変化し、より現実的に見えます。
距離と角度は保持されず、平行線は平行のままになりません。 代わりに、それらはすべて*投影の中心*または*投影基準点*と呼ばれる単一の点に収束します。 次の図に示す3種類の透視投影法があります。
- *ワンポイント*透視投影は簡単に描画できます。
- * 2ポイント*透視投影では、深度の印象が向上します。
- * 3つのポイント*透視投影は、描画が最も困難です。
次の図は、透視投影の3つのタイプすべてを示しています-
翻訳
3D変換では、X座標とY座標とともにZ座標を転送します。 3Dでの翻訳のプロセスは、2Dの翻訳に似ています。 翻訳は、オブジェクトを画面上の別の位置に移動します。
次の図は、翻訳の効果を示しています-
元の座標(X、Y、Z)に移動座標$(t _ \ {x、} t _ \ {y、} t _ \ {z})$を追加して新しい座標(X '、Y'、Z ')。
$ T = \ begin \ {bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ t _ \ {x}&t _ \ {y}&t _ \ {z}&1 \\ \ end \ {bmatrix} $
P ’= P∙T
$ [X ′\:\:Y′ \:\:Z ′\:\:1] \:= \:[X \:\:Y \:\:Z \:\:1] \:\ begin \ {bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ t _ \ {x}&t _ \ {y}&t _ \ {z}&1 \\ \ end \ {bmatrix} $
$ = [X + t _ \ {x} \:\:\:Y + t _ \ {y} \:\:\:Z + t _ \ {z} \:\:\:1] $
3D変換
回転
3D回転は2D回転と同じではありません。 3D回転では、回転軸とともに回転角度を指定する必要があります。 X、Y、Z軸を中心に3D回転を実行できます。 それらは以下のような行列形式で表されます-
R _ \ {x}(\ theta)= \ begin \ {bmatrix} 1&0&0&0 \\ 0&cos \ theta&−sin \ theta&0 \\ 0&sin \ theta&cos \ theta&0 \\ 0&0&0& 1 \\ \ end \ {bmatrix} R _ \ {y}(\ theta)= \ begin \ {bmatrix} cos \ theta&0&sin \ theta&0 \\ 0&1&0&0 \\ -sin \ theta&0&cos \ theta&0 \\ 0&0&0&1 \\ \ end \ {bmatrix} R _ \ {z}(\ theta)= \ begin \ {bmatrix} cos \ theta&-sin \ theta&0&0 \\ sin \ theta&cos \ theta &0&0 \\ 0&0&1&0 \\ 0&0&0&1 \ end \ {bmatrix}
次の図は、さまざまな軸の周りの回転を説明します-
スケーリング
スケーリング変換を使用して、オブジェクトのサイズを変更できます。 スケーリングプロセスでは、オブジェクトのサイズを拡大または縮小します。 スケーリングは、目的の結果を得るために、オブジェクトの元の座標にスケーリング係数を掛けることで実現できます。 次の図は、3Dスケーリングの効果を示しています-
3Dスケーリング操作では、3つの座標が使用されます。 元の座標が(X、Y、Z)であり、スケーリング係数がそれぞれ$(S _ \ {X、} S _ \ {Y、} S _ \ {z})$であり、生成された座標が(X ' 、Y '、Z')。 これは以下に示すように数学的に表すことができます-
$ S = \ begin \ {bmatrix} S _ \ {x}&0&0&0 \\ 0&S _ \ {y}&0&0 \\ 0&0&S _ \ {z}&0 \\ 0&0&0&1 \ end \ { bmatrix} $
P ’= P∙S
$ [\ {X} '\:\:\:\ {Y}' \:\:\:\ {Z} '\:\:\:1] = [X \:\:\:Y \:\ :\:Z \:\:\:1] \:\:\ begin \ {bmatrix} S _ \ {x}&0&0&0 \\ 0&S _ \ {y}&0&0 \\ 0&0&S _ \ {z }&0 \\ 0&0&0&0&1 \ end \ {bmatrix} $
$ = [X.S _ \ {x} \:\:\:Y.S _ \ {y} \:\:\:Z.S _ \ {z} \:\:\:1] $
剪断
オブジェクトの形状を傾斜させる変換は、*せん断変換*と呼ばれます。 2Dせん断のように、3DでX軸、Y軸、またはZ軸に沿ってオブジェクトをせん断できます。
上図に示すように、座標Pがあります。 あなたはそれをせん断して新しい座標P 'を得ることができます。これは以下のように3Dマトリックス形式で表すことができます-
$ Sh = \ begin \ {bmatrix} 1&sh _ \ {x} ^ \ {y}&sh _ \ {x} ^ \ {z}&0 \\ sh _ \ {y} ^ \ {x}&1&sh_ \ {y} ^ \ {z}&0 \\ sh _ \ {z} ^ \ {x}&sh _ \ {z} ^ \ {y}&1&0 \\ 0&0&0&1 \ end \ {bmatrix} $
P ’= P∙Sh
$ X ’= X + Sh _ \ {x} ^ \ {y} Y + Sh _ \ {x} ^ \ {z} Z $
$ Y '= Sh _ \ {y} ^ \ {x} X + Y + sh _ \ {y} ^ \ {z} Z $
$ Z '= Sh _ \ {z} ^ \ {x} X + Sh _ \ {z} ^ \ {y} Y + Z $
変換行列
変換マトリックスは、変換のための基本的なツールです。 n x m次元の行列にオブジェクトの座標が乗算されます。 通常、変換には3 x 3または4 x 4のマトリックスが使用されます。 たとえば、さまざまな操作について次のマトリックスを考えます。
$ T = \ begin \ {bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ t _ \ {x}&t _ \ {y}&t _ \ {z}&1 \\ \ end \ {bmatrix} $
$ S = \ begin \ {bmatrix} S _ \ {x}&0&0&0 \\ 0&S _ \ {y}&0&0 \\ 0&0&S _ \ {z}&0 \\ 0&0&0&1 \ end \ { bmatrix} $
$ Sh = \ begin \ {bmatrix} 1&sh _ \ {x} ^ \ {y}&sh _ \ {x} ^ \ {z}&0 \\ sh _ \ {y} ^ \ {x}&1&sh_ \ {y} ^ \ {z}&0 \\ sh _ \ {z} ^ \ {x}&sh _ \ {z} ^ \ {y}&1&0 \\ 0&0&0&1 \ end \ {bmatrix} $
翻訳マトリックス
スケーリングマトリックス
せん断マトリックス
$ R _ \ {x}(\ theta)= \ begin \ {bmatrix} 1&0&0&0 \\ 0&cos \ theta&-sin \ theta&0 \\ 0&sin \ theta&cos \ theta&0 \\ 0&0&0&1 \\ \ end \ {bmatrix} $
$ R _ \ {y}(\ theta)= \ begin \ {bmatrix} cos \ theta&0&sin \ theta&0 \\ 0&1&0&0 \\ -sin \ theta&0&cos \ theta&0 \\ 0&0&0&1 \\ \ end \ {bmatrix} $
$ R _ \ {z}(\ theta)= \ begin \ {bmatrix} cos \ theta&-sin \ theta&0&0 \\ sin \ theta&cos \ theta&0&0 \\ 0&0&1&0 \\ 0&0& 0&1 \ end \ {bmatrix} $
回転マトリックス
コンピュータグラフィックス曲線
コンピューターグラフィックスでは、多くの場合、さまざまな種類のオブジェクトを画面に描画する必要があります。 オブジェクトは常に平らではないため、オブジェクトを描くには何度も曲線を描く必要があります。
曲線の種類
曲線は、無限に大きいポイントのセットです。 各ポイントには、エンドポイントを除く2つのネイバーがあります。 曲線は、*明示的、暗黙的、*および*パラメトリック曲線*の3つのカテゴリに大きく分類できます。
暗黙の曲線
暗黙的な曲線表現は、曲線上の点があるかどうかをテストできる手順を使用することにより、曲線上の点のセットを定義します。 通常、暗黙的な曲線は、次の形式の暗黙的な関数によって定義されます-
f(x、y)= 0
多値曲線(x値に対して複数のy値)を表すことができます。 一般的な例は円で、その暗黙的な表現は
*x ^ 2 ^ + y ^ 2 ^-R ^ 2 ^ = 0*
明示的な曲線
数学関数y = f(x)は、曲線としてプロットできます。 このような関数は、曲線の明示的な表現です。 明示的な表現は、垂直線を表現できず、単一値でもあるため、一般的ではありません。 xの各値について、通常、yの単一の値のみが関数によって計算されます。
パラメトリック曲線
パラメトリック形式の曲線は、パラメトリック曲線と呼ばれます。 明示的および暗黙的な曲線表現は、関数が既知の場合にのみ使用できます。 実際には、パラメトリック曲線が使用されます。 二次元パラメトリック曲線は次の形式を持っています-
P(t)= f(t)、g(t)またはP(t)= x(t)、y(t)
関数fとgは、曲線上の任意の点の(x、y)座標になり、パラメーターtが特定の間隔[a、b]、通常[0、1]で変化したときに点が取得されます。
ベジェ曲線
ベジェ曲線は、フランス人エンジニア* PierreBézier*によって発見されました。 これらの曲線は、他のポイントの制御下で生成できます。 制御点を使用した近似接線は、曲線の生成に使用されます。 ベジェ曲線は、数学的に次のように表すことができます-
\ sum _ \ {k = 0} ^ \ {n} P _ \ {i} \ {B _ \ {i} ^ \ {n}}(t)
ここで、$ p _ \ {i} $は点の集合であり、$ \ {B _ \ {i} ^ \ {n}}(t)$は次の式で与えられるバーンスタイン多項式を表します-
\ {B _ \ {i} ^ \ {n}}(t)= \ binom \ {n} \ {i}(1-t)^ \ {n-i} t ^ \ {i}
ここで、 n は多項式の次数、 i はインデックス、 t は変数です。
最も単純なベジェ曲線は、点$ P _ \ {0} $から$ P _ \ {1} $までの直線です。 二次ベジェ曲線は、3つの制御点によって決定されます。 3次ベジェ曲線は、4つの制御点によって決定されます。
ベジェ曲線のプロパティ
ベジェ曲線には次の特性があります-
- これらは通常、制御点を結合するセグメントで構成される制御ポリゴンの形状に従います。
- それらは常に最初と最後の制御点を通過します。
- それらは、それらを定義する制御点の凸包に含まれています。
- 曲線セグメントを定義する多項式の次数は、定義するポリゴンポイントの数よりも1つ少なくなります。 したがって、4つの制御点の場合、多項式の次数は3です。 3次多項式。
- ベジェ曲線は、通常、定義するポリゴンの形状に従います。
- 終点での接線ベクトルの方向は、最初と最後のセグメントによって決定されるベクトルの方向と同じです。
- ベジェ曲線の凸包特性により、多項式が制御点にスムーズに追従することが保証されます。
- 制御ポリゴンと交差するよりも多くの直線がベジェ曲線と交差することはありません。
- アフィン変換では不変です。
- ベジェ曲線はグローバルな制御を示すため、制御点を移動すると曲線全体の形状が変化します。
- 与えられたベジェ曲線は、ポイントt = t0で、パラメータ値t = t0に対応するポイントで結合する2つのベジェセグメントに分割できます。
B-スプライン曲線
バーンスタイン基底関数によって生成されるベジェ曲線は、柔軟性が制限されています。
- まず、指定された多角形の頂点の数により、曲線を定義する結果の多項式の順序が固定されます。
- 2番目の制限特性は、曲線全体のすべてのパラメーター値について、ブレンド関数の値がゼロ以外であることです。
Bスプライン基底には、特殊なケースとしてバーンスタイン基底が含まれています。 Bスプライン基底は非グローバルです。
Bスプライン曲線は、制御点PiとBスプライン基底関数$ N _ \ {i、} $ k(t)の線形結合として定義されます。
$ C(t)= \ sum _ \ {i = 0} ^ \ {n} P _ \ {i} N _ \ {i、k}(t)、$ $ n \ geq k-1、$ $ t \:\イプシロン\:[tk-1、tn + 1] $
どこで、
- \ {$ p _ \ {i} $:i = 0、1、2….n}は制御点です
- kは、Bスプライン曲線の多項式セグメントの次数です。 次数kは、曲線が次数k-1の区分的多項式セグメントで構成されることを意味します
- $ N _ \ {i、k}(t)$は「正規化されたBスプラインブレンド関数」です。 それらは、kの順序と、通常「ノットシーケンス」と呼ばれる非減少の実数のシーケンスによって記述されます。
\ {t _ \ {i}:i = 0、... n + K}
N〜i〜、k関数は次のように説明されています-
N _ \ {i、1}(t)= \ left \\ {\ begin \ {matrix} 1、&if \:u \:\ epsilon \:[t _ \ {i、} t _ \ {i + 1 })\\ 0、&それ以外の場合\ end \ {matrix} \ right。
k> 1の場合
N _ \ {i、k}(t)= \ frac \ {t-t _ \ {i}} \ {t _ \ {i + k-1}} N _ \ {i、k-1}(t)+ \ frac \ {t _ \ {i + k} -t} \ {t _ \ {i + k}-t _ \ {i + 1}} N _ \ {i + 1、k-1}(t)
and
t \:\ epsilon \:[t _ \ {k-1}、t _ \ {n + 1})
B-スプライン曲線の特性
B-スプライン曲線には次の特性があります-
- パラメーター値のBスプライン基底関数の合計は1です。
- 各基底関数は、すべてのパラメーター値に対して正またはゼロです。
- 各基底関数には、k = 1を除き、正確に1つの最大値があります。
- 曲線の最大次数は、定義するポリゴンの頂点の数に等しくなります。
- Bスプライン多項式の次数は、定義するポリゴンの頂点の数に依存しません。
- Bスプラインでは、各頂点が関連する基底関数がゼロ以外のパラメーター値の範囲でのみ曲線の形状に影響を与えるため、曲線サーフェスをローカルで制御できます。
- 曲線は、変動を小さくする特性を示します。
- 曲線は、通常、定義するポリゴンの形状に従います。
- アフィン変換は、定義するポリゴンの頂点に適用することにより、曲線に適用できます。
- 定義ポリゴンの凸包内の曲線。
コンピュータグラフィックスサーフェス
ポリゴンサーフェス
オブジェクトは、サーフェスのコレクションとして表されます。 3Dオブジェクト表現は2つのカテゴリに分けられます。
- 境界表現(B-rep)-3Dオブジェクトを、オブジェクトの内部を環境から分離する表面のセットとして説明します。
- 空間分割表現-オブジェクトを含む空間領域を一連の小さな非重複の連続したソリッド(通常はキューブ)に分割することにより、内部プロパティを記述するために使用されます。
3Dグラフィックスオブジェクトで最も一般的に使用される境界表現は、オブジェクトの内部を囲む表面ポリゴンのセットです。 多くのグラフィックシステムはこの方法を使用します。 ポリゴンのセットは、オブジェクトの説明用に保存されます。 これにより、すべてのサーフェスを線形方程式で記述することができるため、サーフェスのレンダリングとオブジェクトの表示が簡素化および高速化されます。
ポリゴンサーフェスは、その*ワイヤーフレーム表示*をすばやく実行して、サーフェス構造の一般的な表示を行うことができるため、設計およびソリッドモデリングアプリケーションで一般的です。 次に、ポリゴンサーフェス全体にシェーディングパターンを補間して照らすことにより、リアルなシーンが生成されます。
ポリゴンテーブル
このメソッドでは、サーフェスは頂点座標と関連する属性のセットによって指定されます。 次の図に示すように、v〜1〜からv〜5〜までの5つの頂点があります。
- 各頂点は、テーブルでv〜1〜として表されるx、y、およびz座標情報を格納します:x〜1〜、y〜1〜、z〜1〜。
- エッジテーブルは、ポリゴンのエッジ情報を格納するために使用されます。 次の図では、エッジE〜1〜は頂点v〜1〜とv〜2〜の間にあり、表ではE〜1〜として表されています:v〜1〜、v〜2〜。
- ポリゴンサーフェステーブルには、ポリゴンに存在するサーフェスの数が格納されます。 次の図から、表面S〜1〜はエッジE〜1〜、E〜2〜、およびE〜3〜で覆われており、ポリゴンサーフェステーブルではS〜1〜として表すことができます:E〜1〜、E〜 2〜、E〜3〜。
平面方程式
平面の方程式は次のように表すことができます-
Ax + By + Cz + D = 0
ここで、(x、y、z)は平面上の任意の点であり、係数A、B、C、およびDは平面の空間特性を記述する定数です。 A、B、C、Dの値は、平面内の3つの非共線点の座標値を使用して3つの平面方程式のセットを解くことにより取得できます。 平面の3つの頂点が(x〜1〜、y〜1〜、z〜1〜)、(x〜2〜、y〜2〜、z〜2〜)および(x〜3〜、 y〜3〜、z〜3〜)。
比率A/D、B/D、およびC/Dの次の連立方程式を解きましょう。 A、B、C、およびDの値を取得します。
(A/D)x〜1〜&plus; (B/D)y〜1〜&plus; (C/D)z〜1〜= -1
(A/D)x〜2〜&plus; (B/D)y〜2〜&plus; (C/D)z〜2〜= -1
(A/D)x〜3〜&plus; (B/D)y〜3〜&plus; (C/D)z〜3〜= -1
上記の式を行列式で取得するには、上記の式にクラマーのルールを適用します。
$ A = \ begin \ {bmatrix} 1&y _ \ {1}&z _ \ {1} \\ 1&y _ \ {2}&z _ \ {2} \\ 1&y _ \ {3}&z _ \ {3} \ end \ {bmatrix} B = \ begin \ {bmatrix} x _ \ {1}&1&z _ \ {1} \\ x _ \ {2}&1&z _ \ {2} \\ x _ \ {3}&1&z_ \ {3} \ end \ {bmatrix} C = \ begin \ {bmatrix} x _ \ {1}&y _ \ {1}&1 \\ x _ \ {2}&y _ \ {2}&1 \\ x _ \ { 3}&y _ \ {3}&1 \ end \ {bmatrix} D =-\ begin \ {bmatrix} x _ \ {1}&y _ \ {1}&z _ \ {1} \\ x _ \ {2}& y _ \ {2}&z _ \ {2} \\ x _ \ {3}&y _ \ {3}&z _ \ {3} \ end \ {bmatrix} $
パラメータA、B、C、およびDを持つ任意のポイント(x、y、z)について、我々はそれを言うことができます-
- x&plus; &plus; Cz&plus; D≠0は、ポイントが平面上にないことを意味します。
- x&plus; &plus; Cz&plus; D <0は、ポイントがサーフェス内にあることを意味します。
- x&plus; &plus; Cz&plus; D> 0は、ポイントがサーフェスの外側にあることを意味します。
ポリゴンメッシュ
3Dサーフェスとソリッドは、一連の多角形要素と線要素で近似できます。 このような表面は*ポリゴンメッシュ*と呼ばれます。 ポリゴンメッシュでは、各エッジは最大2つのポリゴンで共有されます。 ポリゴンまたは面のセットは、一緒になってオブジェクトの「スキン」を形成します。
このメソッドは、グラフィックスで広範なクラスのソリッド/サーフェスを表すために使用できます。 ポリゴンメッシュは、隠面消去アルゴリズムを使用してレンダリングできます。 ポリゴンメッシュは3つの方法で表すことができます-
- 明示的な表現
- 頂点リストへのポインター
- エッジリストへのポインター
利点
- ほとんどすべてのオブジェクトをモデル化するために使用できます。
- 頂点のコレクションとして簡単に表現できます。
- 簡単に変換できます。
- コンピューター画面に簡単に描画できます。
デメリット
- 曲面は近似的にしか説明できません。
- 髪の毛や液体など、ある種のオブジェクトをシミュレートすることは困難です。
可視表面検出
不透明なオブジェクトと表面を含む画像を表示すると、目に近いオブジェクトの背後にあるオブジェクトをビューから見ることができません。 現実的な画面イメージを得るには、これらの隠された表面を削除する必要があります。 これらの表面の識別と除去は、*隠面問題*と呼ばれます。
隠れた表面の問題を除去するための2つのアプローチがあります-オブジェクト空間法*と*画像空間法。 オブジェクト空間法は物理座標系で実装され、画像空間法は画面座標系で実装されます。
2D画面に3Dオブジェクトを表示する場合、選択した表示位置から見える画面の部分を識別する必要があります。
深度バッファ(Zバッファ)メソッド
この方法はCutmullによって開発されました。 これはイメージ空間アプローチです。 基本的な考え方は、各サーフェスのZ深度をテストして、最も近い(可視の)サーフェスを決定することです。
この方法では、各サーフェスは、サーフェス全体で一度に1つのピクセル位置で個別に処理されます。 ピクセルの深度値が比較され、最も近い(最小のz)表面がフレームバッファーに表示される色を決定します。
ポリゴンの表面に非常に効率的に適用されます。 表面は任意の順序で処理できます。 遠いポリゴンから近いポリゴンをオーバーライドするには、 frame buffer および* depth buffer、*という名前の2つのバッファーが使用されます。
- 深さバッファ*は、サーフェスが処理されるときに(0≤深さ≤1)、(x、y)位置の深さ値を格納するために使用されます。
- フレームバッファ*は、各位置(x、y)のカラー値の強度値を格納するために使用されます。
Z座標は通常、範囲[0、1]に正規化されます。 Z座標の0の値は後方のクリッピングペインを示し、Z座標の1の値は前方のクリッピングペインを示します。
アルゴリズム
- ステップ-1 *-バッファ値を設定します-
深度バッファ(x、y)= 0
フレームバッファ(x、y)=背景色
- ステップ-2 *-各ポリゴンを処理します(一度に1つ)
ポリゴンの投影された(x、y)ピクセル位置ごとに、深度zを計算します。
Z> depthbuffer(x、y)の場合
表面色の計算、
デプスバッファ(x、y)= zを設定
フレームバッファ(x、y)= surfacecolor(x、y)
利点
- 実装は簡単です。
- ハードウェアに実装されている場合、速度の問題が軽減されます。
- 一度に1つのオブジェクトを処理します。
デメリット
- 大きなメモリが必要です。
- 時間のかかるプロセスです。
スキャンライン方式
これは、目に見える表面を識別するための画像空間法です。 このメソッドには、単一のスキャンラインのみの深度情報があります。 深度値の1つのスキャンラインを必要とするために、次のスキャンラインを処理する前に、特定のスキャンラインと交差するすべてのポリゴンを同時にグループ化して処理する必要があります。 このために、* edgeテーブル*と* polygonテーブル*の2つの重要なテーブルが維持されています。
*The Edge Table* -シーン内の各ラインの座標エンドポイント、各ラインの逆スロープ、およびエッジをサーフェスに接続するためのポリゴンテーブルへのポインターが含まれています。
ポリゴンテーブル-平面係数、サーフェスマテリアルプロパティ、その他のサーフェスデータが含まれ、エッジテーブルへのポインタである場合があります。
特定のスキャンラインを横切る表面の検索を容易にするために、アクティブなエッジのリストが形成されます。 アクティブリストには、スキャンラインを横切るエッジのみがxの昇順で保存されます。 また、スキャンラインに沿った位置がサーフェスの内側か外側かを示すフラグが各サーフェスに設定されます。
各スキャンラインのピクセル位置は左から右に処理されます。 サーフェスとの左の交差点で、サーフェスフラグがオンになり、右側でフラグがオフになります。 特定のスキャンライン位置で複数のサーフェスのフラグがオンになっている場合にのみ、深度計算を実行する必要があります。
エリア細分化方法
領域の細分化方法は、単一の表面の一部を表すビュー領域を見つけることで利用します。 各表示領域が単一の可視表面の一部の投影になるか、表面がまったくなくなるまで、表示領域全体をますます小さな長方形に分割します。
サブディビジョンが単一のサーフェスに属するものとして簡単に分析されるまで、または単一ピクセルのサイズに縮小されるまで、このプロセスを続けます。 これを簡単に行うには、各ステップでエリアを4つの等しい部分に連続的に分割します。 指定された領域境界とサーフェスが持つことができる4つの可能な関係があります。
- 周囲の表面-領域を完全に囲むもの。
- 重複する表面-部分的に領域の内側と外側にあるもの。
- 内側の表面-完全に領域の内側にあるもの。
- 外面-領域の完全に外側にあるもの。
エリア内の表面可視性を決定するためのテストは、これらの4つの分類の観点から述べることができます。 次の条件のいずれかが当てはまる場合、指定された領域のさらなる細分化は必要ありません-
- すべての表面は、面積に関して外側の表面です。
- 領域内にあるのは、内側、オーバーラップ、または周囲の1つの表面のみです。
- 周囲の表面は、エリア境界内の他のすべての表面を覆い隠します。
背面検出
多面体の背面を識別するための高速でシンプルなオブジェクト空間の方法は、「内部-外部」テストに基づいています。 点(x、y、z)は、平面パラメーターA、B、C、およびDのポリゴンサーフェスの「内側」にあります。私たちはその顔の内側にいて、表示位置から正面を見ることができません)。
デカルト成分(A、B、C)を持つポリゴンサーフェスに対する法線ベクトル N を考慮することにより、このテストを簡略化できます。
一般に、Vが目(または「カメラ」)位置からの視線方向のベクトルである場合、このポリゴンは
*V.N> 0*
さらに、オブジェクトの説明が投影座標に変換され、表示方向が表示z軸に平行な場合、-
V =(0、0、V〜z〜)およびV.N = V〜Z〜C
したがって、Cの符号のみを法線ベクトル N のコンポーネントと見なす必要があります。
負の$ Z _ \ {V} $軸に沿った表示方向を持つ右手系表示システムでは、C <0の場合、ポリゴンは背面になります。 また、視線方向がそのポリゴンに向かっているため、法線のzコンポーネントがC = 0である面は表示されません。 したがって、一般的に、その法線ベクトルがz成分値を持っている場合、背面として任意のポリゴンにラベルを付けることができます-
*C <= 0*
同様の方法は、左利きの表示システムを使用するパッケージで使用できます。 これらのパッケージでは、平面パラメータA、B、C、およびDは、右回りシステムで使用される反時計回りとは異なり、時計回りに指定されたポリゴン頂点座標から計算できます。
また、背面には表示位置から離れる方向を指す法線ベクトルがあり、表示方向が正の$ Z _ \ {v} $軸に沿っている場合、C> = 0で識別されます。 オブジェクトを定義するさまざまな平面のパラメーターCを調べることにより、すべての背面をすぐに識別できます。
A-Bufferメソッド
A-bufferメソッドは、depth-bufferメソッドを拡張したものです。 A-bufferメソッドは、レンダリングシステムRenders Everything You Ever Saw(REYES)のためにLucas film Studiosで開発された可視性検出メソッドです。
Aバッファは、透明度を許可するために深度バッファ方式を拡張します。 Aバッファの主要なデータ構造は、蓄積バッファです。
Aバッファの各位置には2つのフィールドがあります-
- 深度フィールド-正または負の実数を格納します
- 強度フィールド-表面強度情報またはポインター値を保存します
深さ> = 0の場合、その位置に格納される数値は、対応するピクセル領域に重なる単一の表面の深さです。 強度フィールドには、その時点での表面色のRGBコンポーネントとピクセルカバレッジの割合が格納されます。
深さ<0の場合、ピクセル強度への複数面の寄与を示します。 強度フィールドには、表面データのリンクリストへのポインターが格納されます。 Aバッファの表面バッファには以下が含まれます-
- RGB強度成分
- 不透明度パラメーター
- 深さ
- エリアカバレッジの割合
- 表面識別子
アルゴリズムは、深度バッファアルゴリズムと同様に進行します。 深度と不透明度の値は、ピクセルの最終的な色を決定するために使用されます。
深度ソート方法
深度ソート方法では、画像空間とオブジェクト空間の両方の操作を使用します。 深さソート方法は、2つの基本的な機能を実行します-
- 最初に、表面は深さの降順にソートされます。
- 第二に、表面は最大の深さの表面から順番にスキャン変換されます。
ポリゴンサーフェスのスキャン変換は、画像空間で実行されます。 隠面の問題を解決するためのこの方法は、多くの場合*ペインターのアルゴリズム*と呼ばれます。 次の図は、深度ソートの効果を示しています-
アルゴリズムは、深さでソートすることから始まります。 たとえば、ポリゴンの最初の「深度」推定値は、ポリゴンの頂点の最も近いz値であると見なされます。
リストの最後にあるポリゴンPを見てみましょう。 Z範囲がPに重なるすべてのポリゴンQを考えます。 Pを描く前に、次のテストを行います。 次のテストのいずれかが陽性の場合、Qの前にPを描画できると仮定できます。
- X範囲は重複していませんか?
- y範囲は重複していませんか?
- Pは視点から見てQ平面の反対側に完全にありますか?
- Qは視点とP平面の完全に同じ側にありますか?
- ポリゴンの投影は重なりませんか?
すべてのテストが失敗した場合、もう一方のプレーンを使用してPまたはQを分割します。 新しいカットポリゴンが深度順に挿入され、プロセスが続行されます。 理論的には、この分割によりO(n ^ 2 ^)個のポリゴンが生成される可能性がありますが、実際にはポリゴンの数ははるかに少なくなります。
バイナリスペースパーティション(BSP)ツリー
可視性の計算には、バイナリ空間分割が使用されます。 BSPツリーを構築するには、ポリゴンから始めて、すべてのエッジにラベルを付ける必要があります。 一度に1つのエッジのみを処理し、各エッジを拡張して、プレーンを2つに分割します。 ツリーの最初のエッジをルートとして配置します。 内側か外側かに基づいて、後続のエッジを追加します。 すでにツリー内にあるエッジの拡張にまたがるエッジは2つに分割され、両方がツリーに追加されます。
- 上の図から、最初に A をルートとして取得します。
- 図(a)のすべてのノードのリストを作成します。
- 図* bに示すように、ルート A の前にあるすべてのノードをノード A の左側に配置し、ルート A の後ろにあるすべてのノードを右側に配置します。
- 最初にすべてのフロントノードを処理し、次にバックノードを処理します。
- 図(c)に示すように、最初にノード B を処理します。 ノード B の前には何もないので、NILを配置しました。 ただし、ノード B の後ろにノード C があるため、ノード C はノード B の右側に移動します。
- ノード D に対して同じプロセスを繰り返します。
コンピュータグラフィックスフラクタル
フランス/アメリカの数学者ブノワ・マンデルブロ博士がフラクタルを発見しました。 フラクタルという言葉はラテン語のフラクタルから派生したものです。
フラクタルとは何ですか?
フラクタルは、単一の式からコンピューターによって生成される非常に複雑な画像です。 それらは反復を使用して作成されます。 つまり、前の反復の結果を考慮して、わずかに異なる値を使用して1つの式が何度も繰り返されます。
フラクタルは次のような多くの分野で使用されています-
- 天文学-銀河、土星の環などの分析用
- 生物学/化学-細菌培養、化学反応、人体解剖学、分子、植物、
- その他-雲、海岸線、境界線、データ圧縮、拡散、経済、フラクタルアート、フラクタル音楽、風景、特殊効果などの描写用
フラクタルの生成
次の図に示すように、同じ形状を何度も繰り返すことでフラクタルを生成できます。 図(a)では、正三角形を示しています。 図(b)では、三角形が繰り返されて星のような形を作っていることがわかります。 図(c)では、図(b)の星形が何度も繰り返され、新しい形が作成されていることがわかります。
必要な形状を作成するために、無限の反復を行うことができます。 プログラミング用語では、再帰を使用してこのような形状を作成します。
幾何学的フラクタル
幾何学的フラクタルは、非整数またはフラクタル次元を持つ自然に見られる形状を扱います。 決定論的(非ランダム)自己相似フラクタルを幾何学的に構築するには、イニシエーター*と呼ばれる所定の幾何学的形状から始めます。 次に、イニシエーターのサブパートは、 *generator と呼ばれるパターンに置き換えられます。
例として、上図に示されているイニシエーターとジェネレーターを使用する場合、それを繰り返すことで適切なパターンを構築できます。 イニシエーターの各直線セグメントは、各ステップで4つの等しい長さの線セグメントに置き換えられます。 スケーリング係数は1/3であるため、フラクタル次元はD = ln 4/ln 3≈1.2619です。
また、イニシエーターの各ラインセグメントの長さは各ステップで4/3倍に増加します。そのため、次の図に示すように、フラクタル曲線の長さは無限になります。
コンピューターアニメーション
アニメーションとは、コンピューターグラフィックスのあらゆるオブジェクトに生命を与えることです。 最も一見無生物にエネルギーと感情を注入する力があります。 コンピューター支援アニメーションとコンピューター生成アニメーションは、コンピューターアニメーションの2つのカテゴリです。 フィルムまたはビデオで表示できます。
アニメーションの背後にある基本的な考え方は、記録された画像を、人間の目をだまして連続的な動きとして解釈するのに十分な速度で再生することです。 アニメーションは、一連の死んだ画像を生き生きとさせることができます。 アニメーションは、エンターテイメント、コンピューター支援設計、科学的視覚化、トレーニング、教育、eコマース、コンピューターアートなど、多くの分野で使用できます。
アニメーションテクニック
アニメーターは、さまざまなアニメーション技術を発明し、使用しています。 基本的に、このセクションでは1つずつ説明する6つのアニメーション手法があります。
従来のアニメーション(フレームごと)
従来、アニメーションのほとんどは手作業で行われていました。 アニメーションのすべてのフレームは手動で描画する必要がありました。 アニメーションの1秒ごとに24フレーム(フィルム)が必要なため、最短の映画でも作成するのに必要な労力は膨大なものになります。
キーフレーム
この手法では、ストーリーボードをレイアウトし、アーティストがアニメーションの主要なフレームを描きます。 メジャーフレームは、顕著な変化が発生するフレームです。 それらはアニメーションの重要なポイントです。 キーフレーミングでは、アニメーターがオブジェクトの重要な位置またはキー位置を指定する必要があります。 コンピューターは、それらの位置をスムーズに補間することにより、欠落しているフレームを自動的に埋めます。
手続き型
手続き型アニメーションでは、オブジェクトはキーフレームではなく手順(一連のルール)によってアニメーション化されます。 アニメーターはルールと初期条件を指定し、シミュレーションを実行します。 ルールは、多くの場合、数学の方程式で表現される現実世界の物理的なルールに基づいています。
行動的
行動アニメーションでは、自律キャラクターは、少なくともある程度まで、独自のアクションを決定します。 これにより、キャラクターは即興で演奏できるようになり、アニメーターはすべてのキャラクターの動きの詳細を指定する必要がなくなります。
パフォーマンスベース(モーションキャプチャ)
別の手法はモーションキャプチャで、磁気または視覚ベースのセンサーが人間または動物の物体の動作を3次元で記録します。 コンピューターはこれらのデータを使用してオブジェクトをアニメーション化します。
この技術により、多くの有名なアスリートがスポーツビデオゲームのキャラクターにアクションを提供できるようになりました。 モーションキャプチャは、主に一般的な人間のアクションの一部を比較的簡単にキャプチャできるため、アニメーターにかなり人気があります。 ただし、対象の形状または寸法とグラフィックキャラクターとの間に重大な矛盾がある場合があり、これは正確な実行の問題につながる可能性があります。
物理ベース(ダイナミックス)
主要なフレーミングや映画とは異なり、シミュレーションでは物理学の法則を使用して写真やその他のオブジェクトの動きを生成します。 シミュレーションを使用すると、物理的なリアリズムを維持しながら、わずかに異なるシーケンスを簡単に作成できます。 第二に、リアルタイムシミュレーションでは、実際の人がシミュレートされたキャラクターのアクションを操作できる高度な双方向性が可能になります。
対照的に、キーフレーミングとモーションに基づくアプリケーションは、モーションの事前計算済みライブラリを形成し、モーションを選択および変更します。 シミュレーションの欠点の1つは、適切な制御システムを手作りするのに必要な専門知識と時間です。
キーフレーミング
キーフレームは、アニメーションの変更を定義するフレームです。 フレームごとのアニメーションを作成するとき、すべてのフレームはキーフレームです。 誰かがコンピューターで3Dアニメーションを作成するとき、通常は、すべてのフレームで特定のオブジェクトの正確な位置を指定しません。 キーフレームを作成します。
キーフレームは、オブジェクトがサイズ、方向、形状、またはその他のプロパティを変更する重要なフレームです。 その後、コンピューターはすべての中間フレームを計算し、アニメーターの時間を大幅に節約します。 次の図は、ユーザーが描いたフレームとコンピューターが生成したフレームを示しています。
ユーザーが描いたキーフレーミング コンピューターが生成したキーフレーム
モーフィング
あるフォームから別のフォームへのオブジェクト形状の変換は、モーフィングと呼ばれます。 これは最も複雑な変換の1つです。
モーフは、2つの画像が非常に滑らかな動きで互いに溶け合っているように見えます。 技術的には、2つの画像は歪んでおり、それらの間でフェードが発生します。