ホームページ ウェブフロントエンド jsチュートリアル Three.jsソースコード読解メモ(オブジェクトの構成)_基礎知識

Three.jsソースコード読解メモ(オブジェクトの構成)_基礎知識

May 16, 2016 pm 05:45 PM
整理する

Three.jsのソースコード読書メモの3回目の記事です。前の 2 つの記事は主にコア オブジェクトについてでした。これらのコア オブジェクトは主にベクトル Vector3 オブジェクトと行列 Matrix4 オブジェクトを中心に展開し、空間内の 1 つの頂点の位置と変化に焦点を当てました。この記事では主に、Three.js のオブジェクトがどのように編成されるか、つまり頂点、サーフェス、マテリアルを特定のオブジェクトに組み合わせる方法について説明します。
Object::Mesh
このコンストラクターは空間内にオブジェクトを構築します。なぜ「グリッド」と呼ばれるかというと、実際には体積のあるオブジェクトは基本的に「グリッド」としてモデル化されるからです。

コードをコピー コードは次のとおりです。

THREE.Mesh = 関数 (ジオメトリ、マテリアル) ) {
THREE.Object3D.call( this );
this.geometry = geometry;
this.material = ( マテリアル !== 未定義 ) マテリアル : new THREE.MeshBasicmaterial( { color: Math. random() * 0xffffff, Wireframe: true } );
/* このセクションに関係のないその他の内容*/
}

実際には、Mesh クラスには 2 つの属性しかありません。ジオメトリを表す 形状のジオメトリ オブジェクトとマテリアルを表すマテリアル オブジェクト。ジオメトリ オブジェクトは前のブログ投稿で紹介されており、いくつかの派生クラスがこのブログ投稿で紹介されます (これらの派生クラスの構築プロセスを通じて、メッシュ オブジェクトの動作原理をより明確に理解できます)。このノートでは、派生クラスについても説明します。 Mesh オブジェクトのこれら 2 つのプロパティは互いに密接に関連しており、ジオメトリ オブジェクトの face 配列では、マテリアル属性オブジェクトとの一致に各 face オブジェクトのmaterialIndex が使用され、face オブジェクトの vertexUVs 配列が一致に使用されます。配列内の各頂点の値を順番に返します。メッシュは 1 つのマテリアル オブジェクトしか持てないことに注意してください (この設計の目的が何であるかはわかりません)。複数のマテリアルを使用する必要がある場合は、ジオメトリ自体のマテリアル アトリビュートでマテリアルを順番に初期化する必要があります。マテリアルインデックスの。
Geometry::CubeGeometry
このコンストラクターは立方体オブジェクトを作成します。
コードをコピー コードは次のとおりです。

THREE.CubeGeometry = function ( width, height 、深さ、幅セグメント、高さセグメント、深さセグメント) {
THREE.Geometry.call(this);
this.width = width;
>this. 深さ = 深さ;
var width_half = this.width / 2;
var Depth_half = this.width / 2; /
buildPlane( 'z', 'y', - 1, - 1, this. Depth, this.height, width_half, 0 ); // px
/*省略*/
function buildPlane( u , v, udir, vdir, width, height, Depth,materialIndex ) {
/*省略*/
}
this.computeCentroids();
this.mergeVertices();


コンストラクターが行う最も重要なことは buildPlane 内で行われます。この関数で最も重要なことは、スコープの操作です (上記のコード ブロックでは、スコープは this です)。これには、scope.vertices.push(vector) を呼び出して頂点をジオメトリ オブジェクトに追加します。 face) to add サーフェスがジオメトリ オブジェクトに追加され、scope.faceVertexUvs[i].push(uv) メソッドが呼び出されて、頂点に対応するマテリアル座標がジオメトリ オブジェクトに追加されます。コードの大部分は、キューブを生成するロジックに関するもので、理解しやすく、他のタイプのジオメトリ オブジェクトに拡張するのも簡単です。

コンストラクターのパラメーターには、長さ、幅、高さ、および 3 方向のセグメントの数が含まれます。いわゆるセグメンテーションとは、widthSeqments などの 3 つのパラメータがすべて 2 に設定されている場合、各面は 2×2=4 つの面として表現され、立方体全体がまさにグリッドのように 24 個の面で構成されることを意味します。



コードをコピー
コードは次のとおりです:

function buildPlane( u, v, udir, vdir, width, height, Depth,materialIndex ) {
var w, ix, iy,
gridX =scope.widthSegments,
gridY = scope.heightSegments、
width_half = 幅 / 2、
height_half = 高さ / 2、
offset =scope.vertices.length;
if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) {w = 'z';}
else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) {w = 'y'; GridY =scope. DepthSegments;} else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) {w = 'x';gridX =scope. DepthSegments;}
var GridX1 = グリッド X 1、
gridY1 = グリッド Y 1、
segment_width = 幅 / グリッド X、
segment_height = 高さ / グリッド Y、
通常= 新しい THREE.Vector3();
通常[ w ] = 深さ > 0 ? 1 : - 1;
for ( iy = 0; iy for ( ix = 0; ix var Vector = new THREE.Vector3();
vector[ u ] = ( ix * セグメント幅 - 幅半 ) * udir;
vector[ v ] = ( iy * セグメントの高さ - 高さの半分 ) * vdir;
ベクトル[ w ] = 深さ;
scope.vertices.push(vector);
}
}
for ( iy = 0; iy < GridY; iy ) {
for ( ix = 0; ix < GridX; ix ) {
var a = ix GridX1 * そうです;
var b = ix GridX1 * ( iy 1 );
var c = ( ix 1 ) GridX1 * ( iy 1 );
var d = ( ix 1 ) グリッドX1 * iy;
var face = new THREE.Face4( a オフセット, b オフセット, c オフセット, d オフセット );
face.normal.copy(normal);
face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone(),normal.clone());
face.materialIndex = マテリアルインデックス;
scope.faces.push(face);
scope.faceVertexUvs[ 0 ].push( [
new THREE.UV( ix / GridX, 1 - iy / GridY ),
new THREE.UV( ix / GridX, 1 - ( iy 1 ) /gridY )、
new THREE.UV( ( ix 1 ) /gridX、1- ( iy 1 ) /gridY )、
new THREE.UV( ( ix 1 ) /gridX、1 - iy /gridY )
] );
}
}
}

大部分のオブジェクトにある clone() メソッドを除き、CubeGeometry 以外のメソッド、他の XXXGeometry オブジェクトもこのように適用されます。このオブジェクトがデータを構成して保存し、これらのデータをどのように利用して 3 つのシーンとアニメーションを生成するかを説明します。
Geometry::CylinderGeometry
の名前考えこの建造物
代打代打次のように:

THREE .CylinderGeometry = function ( radiusTop, radiusBottom, height, radiusSegments, heightSegments, openEnded ) {
/* 略 */
}

有了CubeGeometry构造関数数的基础,自己也应当円柱のジオメトリを実現できますが、次の構成関数の各パラメータの意味に注意する必要があります。radiusTop と RadiusBottom は頂部と底部の半径を示し、高さは高さを示します。 heightSegments は、全体の高さをどのように分割する必要があるか、openEnded で上面と下面を生成するかどうかを指定します。重心の種類、つまり、上円面の高さ(y軸値)は高さ/2、下円面は-高さ/2であり、この点では円柱体には差はありませんが、上下半径は異なります。違いは、このモデルの頂面と床面には face3 タイプの表面が使用され、側面には face4 タイプの表面が使用されるという点です。


复制代

各パラメータの意义:radius 半径指定、widthSegments 表示“经度”分带数目、heightSegments 表示「角度」の分割数。次の 4 つのパラメータは任意であり、角度の開始値と強度の開始値を示します。この 4 つの数値の許容値はそれぞれ 0、2π、0、π であり、値を変更することにより、残余の球面を作成できます(ただし、残余の球面は鋼球の形状を調整する必要があります)。

ソース コードでは、北極と南極を除く極内部の領域は face3 型の表面であり、その他の部位はすべて face4 型の表面です。

Geometry ::PlaneGeometry

この構造関数は平面を作成します。

THREE.PlaneGeometry = function (width, height, widthSegments, heightSegments){
/* わずかに*/
}

各パラメーターの意味: width、高さ、幅セグメントの数、および高さセグメントの数。読者は、この「グリッド」の構築方法に精通している必要があります。
その他の情報はソース コードから取得されます。平面は X-Y 平面上に構築され、原点は長方形の中心点です。
Geometry::ExtrudeGeometry
このオブジェクトは現在、一般的な幾何学的形状を構築するメソッドですが、通常はモデル化されたオブジェクトを特定の形式でファイルに保存し、ローダーを通じてロードします。 , そのため、この機能を直接使う機会は少ないと思われます。しかもこの機能は中途半端な設定がオプションオブジェクトに山積みになっているようで、よく調べていませんでした。
マテリアル::マテリアル
マテリアル オブジェクトは、他のすべての種類のマテリアルのプロトタイプ オブジェクトです。
コードをコピー コードは次のとおりです。

THREE.material = function () {
THREE .materialLibrary.push( this );
this.id = THREE.materialIdCount;
this.side = THREE.FrontSide = 1;
this.transparent = false;
this.blendSrc = THREE.SrcAlphaFactor;
this.blendEquation = THREE;
this. DepthTest = true;
this.polygonOffsetFactor = 0;
this.alphaTest = 0;
this.overdraw = false; // CanvasRenderer のアンチエイリアス ギャップを修正するためのブール値
this.visible = true;
this.needsUpdate = true;


より重要な属性のいくつかを見てみましょう:
属性の不透明度は、透明度を示す 0 ~ 1 の範囲の値です。属性 transparent は、値が true の場合にのみ、透明度を使用するかどうかを指定します (transparent は、ピクセルをレンダリングするときに、レンダリングされる値と既存の値が連携してレンダリング後のピクセル値を計算することを意味します)。ミキシング効果)。

属性 Blending、blendSrc、blendDst、blendEquation は、ブレンド元 Src とブレンド画素の既存画素値 Dst のブレンド方法と重み指定方法を指定します。デフォルト (コンストラクターで割り当てられたデフォルト値など) では、新しいピクセル値は、新しい値 × アルファ古い値 × (1-アルファ) に等しくなります。

テクスチャ イメージのプロパティを表すマテリアル クラスに、最も重要なオブジェクトが存在しないのはなぜなのか、私は混乱していました。後でわかったのですが、実はマテリアルとテクスチャには違いがあるのです。あるマテリアルにはテクスチャがあるとしか言えませんが、テクスチャがないマテリアルもあります。マテリアルは形状全体のレンダリング効果に影響します。例: 「線を幅 5 ピクセル、両端を正方形、不透明な赤でレンダリングする」 この説明はマテリアルと見なすことができ、テクスチャは含まれません。
多くの Geometry オブジェクトと同様、マテリアル オブジェクトには、一般的な clone()、dellocate()、setValues() メソッド以外のメソッドはありません。以下は 2 つの最も基本的なマテリアル オブジェクトです。

material::LineBasicmaterial

このコンストラクターは、線形形状をレンダリングするためのマテリアルを作成します。




コードをコピー
コードは次のとおりです。
THREE.LineBasicmaterial = function (parameters) { THREE.material.call( this ); this.color = new THREE.Color( 0xffffff ); this.linecap = 'round'; this.linejoin = 'round'; this.vertexColors = false; this.setValues(パラメータ);属性の色と 名前が示すように、線幅は線の色と線の幅を指します (線には幅がありません。ここでの幅はレンダリングに使用されます)。
属性 linecap と linejoin は、線の端点と接続点のスタイルを指定します。
属性フォグは、このマテリアルがフォグの影響を受けるかどうかを指定します。

material::MeshBasicmaterial

このコンストラクターは、メッシュ サーフェスのレンダリングに使用されるマテリアルを作成します。




コードをコピー

コードは次のとおりです:

THREE.MeshBasicMaterial = function ( parameters ) {
THREE.Material.call( this );
this.color = new THREE.Color( 0xffffff ); // emissive
this. map = null;
this.lightMap = null;
this.specularMap = null;
this.envMap = null;
this.combine = THREE.MultiplyOperation;
this.reflectivity = 1 ;
this.refractionRatio = 0.98;
this.fog = true;
this.shading = THREE.SmoothShading;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.vertexColors = THREE.NoColors;
this.skinning = false;
this.morphTargets = false;
this.setValues( parameters );
};

The most important texture attributes appear here, including map, lightMap and specularMap, they are all texture type objects.
The attribute wireframe specifies whether the boundary line of the surface is rendered. If it is rendered, the following attributes starting with wireframe indicate how it will be rendered if the boundary line is rendered.
Texture::Texture
This constructor is used to create texture objects.
Copy code The code is as follows:

THREE.Texture = function (image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
THREE.TextureLibrary.push( this );
this.id = THREE.TextureIdCount ;
this.name = '';
this .image = image;
this.mapping = mapping !== undefined ? mapping : new THREE.UVMapping();
this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping;
this .wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping;
this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter;
this.minFilter = minFilter !== undefined ? minFilter : THREE .LinearMipMapLinearFilter;
this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
this.format = format !== undefined ? format : THREE.RGBAFormat;
this.type = type !== undefined ? type : THREE.UnsignedByteType;
this.offset = new THREE.Vector2( 0, 0 );
this.repeat = new THREE.Vector2( 1, 1 );
this.generateMipmaps = true ;
this.premultiplyAlpha = false;
this.flipY = true;
this.needsUpdate = false;
this.onUpdate = null;
};

The most important attribute is image, which is a JavaScript Image type object. The first parameter passed in is the object. How to create the object will be described later. The objects following

are all optional. If left out, the default value will be filled in, and the default value is often filled in.
The attributes magFileter and minFileter specify the filtering method of the texture when zooming in and out: nearest neighbor point, bilinear interpolation, etc.
To generate a texture from the URL, you need to call Three.ImageUtils.loadTexture(paras). This function returns a texture type object. The THREE.ImageLoader.load(paras) function is called inside the function, and the THREE.Texture() constructor is called inside this function to generate the texture.
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

8見事なjQueryページレイアウトプラグイン 8見事なjQueryページレイアウトプラグイン Mar 06, 2025 am 12:48 AM

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

独自のAjax Webアプリケーションを構築します 独自のAjax Webアプリケーションを構築します Mar 09, 2025 am 12:11 AM

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

Ajaxを使用して動的にボックスコンテンツをロードします Ajaxを使用して動的にボックスコンテンツをロードします Mar 06, 2025 am 01:07 AM

このチュートリアルでは、Ajaxを介してロードされた動的なページボックスの作成を示しており、フルページのリロードなしでインスタントリフレッシュを可能にします。 JQueryとJavaScriptを活用します。カスタムのFacebookスタイルのコンテンツボックスローダーと考えてください。 重要な概念: ajaxとjquery

10 jQueryの楽しみとゲームプラグイン 10 jQueryの楽しみとゲームプラグイン Mar 08, 2025 am 12:42 AM

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

JavaScript用のクッキーレスセッションライブラリを作成する方法 JavaScript用のクッキーレスセッションライブラリを作成する方法 Mar 06, 2025 am 01:18 AM

このJavaScriptライブラリは、Cookieに依存せずにセッションデータを管理するためにWindow.nameプロパティを活用します。 ブラウザ全体でセッション変数を保存および取得するための堅牢なソリューションを提供します。 ライブラリは、セッションの3つのコア方法を提供します

jQuery Parallaxチュートリアル - アニメーションヘッダーの背景 jQuery Parallaxチュートリアル - アニメーションヘッダーの背景 Mar 08, 2025 am 12:39 AM

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

See all articles