独自のWebGLエンジン。 記事番号3。 プリミティブ

記事の続きで

最初の記事では、最初のプリミティブをすでに使用していましたが、これは単に「任意の形式」と呼ぶことができます。

プリミティブオブジェクトを説明する前に、システムの2つの主要な要件であるコメントをもう一度繰り返します。


各プリミティブの要件に加えて、 マトリックスを接続できます。 接続後、次の操作を簡単に実行できます。


プリミティブ自体は分割できます。


単純なプリミティブ



平野

説明

このプリミティブは平らな長方形です。 構築するには2つの三角形で十分です。 取得する必要がある入力データの最小値は、フィギュアの中心、その幅と高さです。 出力では、少なくとも2つの配列(頂点の配列、インデックスの配列)を取得する必要があります。 各頂点を中心、幅、および高さから計算するため、左上の頂点はxが中心から幅の半分まで左にオフセットされ、yが高さの半分まで上にあり、zはシフトしません。図はフラットです。 同様に、他のすべての頂点を見つけます。
[this.frontCenter[0] - width / 2, this.frontCenter[1] + height / 2, this.frontCenter[2], /*   - 0*/ this.frontCenter[0] + width / 2, this.frontCenter[1] + height / 2, this.frontCenter[2], /*   - 1*/ this.frontCenter[0] + width / 2, this.frontCenter[1] - height / 2, this.frontCenter[2], /*   - 2*/ this.frontCenter[0] - width / 2, this.frontCenter[1] - height / 2, this.frontCenter[2]]; /*   - 3*/ 

インデックスの配列で、ポイントの結合方法を決定します。 このプリミティブには2つの三角形があります
左上の点、右上の点、左下の点。 頂点の配列では、これらは要素です-0,1,3
右上点、右下点、左下点。 頂点の配列では、これらは要素です-1,2,3
したがって、インデックスの配列は次のとおりです。
[0,1,3,1,2,3、];
インデックスの順序は変更されませんが、頂点にいくつかの変更がある場合があります。 プリミティブで簡単に操作できるように、頂点の配列を行列に変換します。
 this.matrix = new botuMatrix(this.vertex,3); 

プリミティブ操作

マトリックスを操作すると、入力パラメーターとして渡された配列、この場合は頂点の配列が変更されます。 マトリックスを説明するときに、 マトリックスで可能な操作が示されました。 操作データをプリミティブに接続します。
  moveByX:function(value){ this.matrix.move(value,0); }, moveByY:function(value){ this.matrix.move(value,1); }, moveByZ:function(value){ this.matrix.move(value,2); }, testToPoint:function(value){ this.matrix.toPoint(value); }, rotateAroundCenter:function(angle,xyzType) { this.matrix.rotate(angle,this.matrix.center,xyzType); }, rotateAroundMaxPoint:function(angle,xyzType) { this.matrix.rotate(angle,this.matrix.maxval,xyzType); }, rotateAroundPoint:function(angle,point,xyzType) { this.matrix.rotate(angle,point,xyzType); }, 


これらの操作はプリミティブに依存しないため、今後はコメントなしで接続します。

カブ

このプリミティブは六面体です。 ほぼ立方体で、面のみが正方形または長方形のいずれかです。
説明は長方形の説明と同じになりますが、別の入力パラメーター-depthのみを追加します。
立方体は、遠くと近くの長方形のように8つの頂点を持ちます。 上記の単純な長方形との違いは、Z座標の計算にあり、近くの長方形では深さの半分だけ減少し、遠くの長方形では深さの半分だけ増加します。
これを行うには、2つのセンターを取るだけです
  this.frontCenter=[centerPoint[0],centerPoint[1],centerPoint[2] - depth / 2]; this.backCenter=[centerPoint[0],centerPoint[1],centerPoint[2] + depth / 2]; 

そして、配列に2つの長方形を作成します。最初の長方形は中央のfrontCenterで、2番目の長方形は中央のbackCenterです。
  /* */ this.frontCenter[0] - width / 2, this.frontCenter[1] + height / 2, this.frontCenter[2], /* - 0*/ this.frontCenter[0] + width / 2, this.frontCenter[1] + height / 2, this.frontCenter[2],/* - 1*/ this.frontCenter[0] + width / 2, this.frontCenter[1] - height / 2, this.frontCenter[2],/* - 2*/ this.frontCenter[0] - width / 2, this.frontCenter[1] - height / 2, this.frontCenter[2],/* - 3*/ /* */ this.backCenter[0] - width / 2, this.backCenter[1] + height / 2, this.backCenter[2],/* - 4*/ this.backCenter[0] + width / 2, this.backCenter[1] + height / 2, this.backCenter[2],/* - 5*/ this.backCenter[0] + width / 2, this.backCenter[1] - height / 2, this.backCenter[2],/* - 6*/ this.backCenter[0] - width / 2, this.backCenter[1] - height / 2, this.backCenter[2]/* - 7*/ 


インデックスのトップについて。 立方体には6つの面があり、それぞれ2つの三角形で構成されています。
/ *私たちに最も近い長方形、キューブを操作する前に表示される唯一の長方形* /
0、1、3
1,2,3

/ *左側* /
0.4.7
0.3.7

/ *結論* /
3,7,6
6.3.2

/ *右側* /
2.6.1
1,5,6

/ *上面* /
0.4.5
0,5,1

/ *裏面* /
7.4.5
7,5,6

複雑な複合プリミティブ


単純なプリミティブ。 作成した三角形は三角形で構成されており、このプリミティブを作成する前に、精神的に三角形に分割しました。 複雑なプリミティブは、他の幾何学的な2次元図形で構成されます。 この記事では、唯一の「複雑なプリミティブ」、つまりボールについて検討します。 これは長方形で構成されます。
ボール

ボールを描くために知っておくべきこと-座標と半径? はい しかし、もう1つの小さなパラメーター-詳細を追加します。
これは同じ円で、同じ半径で、詳細が異なるだけです。 プリミティブの説明で詳細として理解されるという事実-少し後で。
画像
詳細設計-35
画像
詳細設計-10
アルゴリズム:


このアルゴリズムを実装するには



詳細なコメント付きの最初の3つの記事の完全なコード


仕事の一例。

Source: https://habr.com/ru/post/J227415/


All Articles