独自の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つの記事の完全なコード



仕事の一例。



All Articles