Three.jsの探玢第2章Three.jsシヌンが構成する䞻芁コンポヌネントの操䜜

みなさんこんにちは
前の章で、libraryThree.jsの基本を玹介したした。 いく぀かの䟋を芋お、最初の完党なThree.jsシヌンを䜜成したした。 この章では、このラむブラリをさらに深く掘り䞋げ、Three.jsシヌンを構成する䞻芁なコンポヌネントをより詳现に説明しようずしたす。 この章では、次のこずに぀いお孊習したす。
  1. Three.jsシヌンで䜿甚されるコンポヌネント
  2. THREE.Sceneオブゞェクトでできるこず
  3. 盎亀カメラず遠近カメラの違いは䜕ですか

たず、シヌンを䜜成しおオブゞェクトを远加する方法を怜蚎したす。



シヌン䜜成


前の章では、すでにTHREE.Sceneオブゞェクトを䜜成したため、Three.jsラむブラリのこのコンポヌネントに぀いおはすでによく知っおいたす。 たた、通垞のシヌン衚瀺には3぀のコンポヌネントが必芁であるこずがわかりたした。
  1. lightマテリアルに圱響し、シャドり効果を䜜成するために䜿甚されたす
  2. カメラこのコンポヌネントは、シヌンに衚瀺されるものを決定したす
  3. モヌタヌオブゞェクトこれらは、カメラパヌスペクティブに衚瀺される䞻なオブゞェクトです立方䜓、球䜓など。

THREE.Sceneオブゞェクトは、これらすべおのコンポヌネントのコンテナずしお機胜したす。 このオブゞェクト自䜓には、倚くのオプションず機胜はありたせん。

基本的なシヌン機胜

シヌンの機胜を孊ぶ最良の方法は、䟋を芋るこずです。 この章の゜ヌスコヌドchapter-02には、サンプル01-basic-scene.htmlがありたす。 この䟋を䜿甚しお、シヌンの機胜ずオプションを説明したす。 この䟋をブラりザで開くず、次のようなものが衚瀺されたす。



これは、前の章で芋たものず少し䌌おいたす。 シヌンは少し空っぜに芋えたすが、すでにいく぀かのオブゞェクトが含たれおいたす。 次の゜ヌスコヌドを芋るず、 Scene.add(object)オブゞェクトにScene.add(object)関数を䜿甚しおおり、 THREE.Mesh これが衚瀺されおいるプレヌン、 THREE.SpotLight 、 THREE.AmbientLightなどのオブゞェクトを远加しおいるこずがわかりたす。 THREE.AmbientLight THREE.Cameraオブゞェクトは、シヌンをレンダリングするずきにThree.jsラむブラリ自䜓によっお自動的に远加されたすが、必芁に応じお手動で远加するこずもできたす。

 var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); ... var planeGeometry = new THREE.PlaneGeometry(60,40,1,1); var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff}); var plane = new THREE.Mesh(planeGeometry,planeMaterial); ... scene.add(plane); var ambientLight = new THREE.AmbientLight(0x0c0c0c); scene.add(ambientLight); ... var spotLight = new THREE.SpotLight( 0xffffff ); ... scene.add( spotLight ); 

THREE.Sceneオブゞェクトの詳现な怜蚎を始める前に、デモンストレヌタヌで䜕ができるかをお話ししたいず思いたす。それからコヌドを理解し始めたす。 ブラりザヌで䟋を開き、右䞊隅のコントロヌルを芋おください。ここでできるこずは次のずおりです。



実䟋
これらのコントロヌルを䜿甚しお、シヌンにキュヌブを远加し、シヌンから最埌に远加されたキュヌブを削陀し、シヌンに含たれるすべおの芁玠の数を衚瀺できたす。 おそらく、サンプルを実行したばかりの時点で、すでに4぀のオブゞェクトがシヌンに存圚しおいるこずに気づいたでしょう。 これが私たちの飛行機、散乱光の光源、点光源の光源、そしお先に述べたカメラです。 次に、コントロヌルナニットの各コンポヌネントを詳しく芋お、最も単玔なものから始めたす addCube 関数を䜿甚したす。

 this.addCube = function() { var cubeSize = Math.ceil((Math.random() * 3)); var cubeGeometry = new THREE.CubeGeometry(cubeSize,cubeSize,cubeSize); var cubeMaterial = new THREE.MeshLambertMaterial( {color: Math.random() * 0xffffff }); var cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.castShadow = true; cube.name = "cube-" + scene.children.length; cube.position.x=-30 + Math.round((Math.random() * planeGeometry.width)); cube.position.y= Math.round((Math.random() * 5)); cube.position.z=-20 + Math.round((Math.random() * planeGeometry.height)); scene.add(cube); this.numberOfObjects = scene.children.length; }; 

このコヌドは、今では非垞に簡単に把握できるはずです。 ここでは倚くの新しい抂念は玹介されおいたせん。 addCubeボタンをクリックするず、 0〜3のランダムサむズの新しいTHREE.CubeGeometryむンスタンスがTHREE.CubeGeometryされたす。 任意のサむズに加えお、キュヌブはシヌンず色のランダムな䜍眮も受け取りたす。
このコヌドの新機胜は、 name属性を䜿甚しおキュヌブにnameです。 その名前は、 cubeずしお指定されおいたす-すでにシヌンにあるキュヌブの数 scene.children.length属性を䜿甚しおscene.children.lengthたす。 したがっお、 cube-1, cube-2, cube-3などの名前が取埗されたす。 この名前はデバッグに圹立ちたすが、シヌン内のオブゞェクトを盎接怜玢するためにも䜿甚できたす。 Scene.getChildByName(name)関数を䜿甚する堎合、オブゞェクトを盎接取埗しお、たずえばその堎所を倉曎できたす。 倉数numberOfObjects 、シヌン内の芁玠数のリストのサむズずしおコントロヌルむンタヌフェむスによっお䜿甚されたす。 したがっお、オブゞェクトを远加たたは削陀するずき、この倉数をシヌン内の新しい芁玠の数に等しい倀に蚭定したす。
コントロヌルむンタヌフェむスから呌び出すこずができる次の関数はremoveCube 。名前が瀺すように、このボタンをクリックするず、最埌に远加されたキュヌブがシヌンから削陀されたす。 以䞋に、この機胜の実装方法を瀺したす。

 this.removeCube = function() { var allChildren = scene.children; var lastObject = allChildren[allChildren.length-1]; if (lastObjectinstanceofTHREE.Mesh) { scene.remove(lastObject); this.numberOfObjects = scene.children.length; } } 

オブゞェクトをシヌンにaddするには、 add 関数を䜿甚したす。 シヌンからオブゞェクトを削陀するには、圓然のこずですが、 remove 関数を䜿甚したす。 このコヌドスニペットでは、 THREE.Scene()オブゞェクトのchildrenプロパティを䜿甚しお、远加された最埌のオブゞェクトを取埗したした。 たた、カメラずラむトの削陀を避けるために、オブゞェクトがMeshオブゞェクトであるこずを確認する必芁がありたす。 オブゞェクトを削陀した埌、シヌン䞊のオブゞェクトの数を衚瀺するコントロヌルむンタヌフェむス芁玠を再床曎新する必芁がありたす。
GUIの最埌のボタンはoutputObjectsずしおマヌクされおいたす 。 おそらく既にクリックしおいるように芋えたすが、䜕も起こらなかったようです。 このボタンが行うこずは、以䞋に瀺すように、珟圚シヌンに衚瀺されおいるすべおのオブゞェクトを印刷し、Webブラりザヌコン゜ヌルに衚瀺するこずです。



コン゜ヌルログに情報を出力するコヌドは、以䞋に瀺すように、組み蟌みのconsoleオブゞェクトを䜿甚したす。

 this.outputObjects = function() { console.log(scene.children); } 

デバッグには非垞に䟿利です。 特にオブゞェクトに名前を付けるずき、シヌン䞊の特定のオブゞェクトの問題を怜玢するずきに非垞に䟿利です。 たずえば、 cube-17ずいう名前のオブゞェクトのプロパティは次のようになりたす。

 __webglActive: true __webglInit: true _modelViewMatrix: THREE.Matrix4 _normalMatrix: THREE.Matrix3 _vector: THREE.Vector3 castShadow: true children: Array[0] eulerOrder: "XYZ" frustumCulled: true geometry: THREE.CubeGeometry id: 20 material: THREE.MeshLambertMaterial matrix: THREE.Matrix4 matrixAutoUpdate: true matrixRotationWorld: THREE.Matrix4 matrixWorld: THREE.Matrix4 matrixWorldNeedsUpdate: false name: "cube-17" parent: THREE.Scene position: THREE.Vector3 properties: Object quaternion: THREE.Quaternion receiveShadow: false renderDepth: null rotation: THREE.Vector3 rotationAutoUpdate: true scale: THREE.Vector3 up: THREE.Vector3 useQuaternion: false visible: true __proto__: Object 

これたで、シヌンの次の関数を芋おきたした。
  1. Scene.Add() このメ゜ッドは、オブゞェクトをシヌンに远加したす
  2. Scene.Remove( このメ゜ッドは、シヌンからオブゞェクトを削陀したす
  3. Scene.children() このメ゜ッドは、シヌンオブゞェクトのすべおの子のリストを取埗したす
  4. Scene.getChildByName() このメ゜ッドは、name属性によっおシヌンから特定のオブゞェクトを取埗したす

これらは、非垞に頻繁に䜿甚する最も重芁なシヌン関数です。 ただし、䟿利なヘルパヌ関数がいく぀かあり、キュヌブの回転を凊理するコヌドを䜿甚しおそれらを玹介したいず思いたす。
前の章で芋たように、シヌンをレンダリングするためにrender関数内でルヌプを䜿甚したした。 この䟋の同じコヌドスニペットを芋おみたしょう。

 function render() { stats.update(); scene.traverse(function(e) { if (e instanceofTHREE.Mesh&& e != plane ) { e.rotation.x+=controls.rotationSpeed; e.rotation.y+=controls.rotationSpeed; e.rotation.z+=controls.rotationSpeed; } }); requestAnimationFrame(render); renderer.render(scene, camera); } 

ここでは、 THREE.Scene.traverse()関数が䜿甚されおいるこずがわかりたす。 関数ぞの匕数ずしお関数を枡すこずができたす。 これは関数に枡され、シヌン内の各子に察しお呌び出されたす。 render 関数では、 traverse 関数を䜿甚しお、各cubeむンスタンスの回転を曎新したすメむンプレヌンを明瀺的に無芖したす。 これを行うには、 forルヌプのchildrenプロパティで配列のすべおの芁玠を列挙forたす。
MeshおよびGeometryオブゞェクトの詳现に入る前に、シヌンオブゞェクトに蚭定できる2぀の興味深いプロパティ、 fogずoverrideMaterialを玹介しoverrideMaterial 。

プレヌンにフォグ効果を远加したす。

fogプロパティを䜿甚するず、シヌンにフォグ効果を远加できたす。 オブゞェクトが遠ければ遠いほど、オブゞェクトは衚瀺されなくなりたす。 次のスクリヌンショットは、その倖芳を瀺しおいたす。



実䟋
Three.jsラむブラリで発生するフォグプロパティの有効化は非垞に簡単です。 シヌンを定矩した埌、次のコヌド行を远加するだけです。

 scene.fog=new THREE.Fog( 0xffffff, 0.015, 100 ); 

ここでは、霧の色を癜0xffffffずしお定矩したした。 最埌の2぀の匕数は、フォグが衚瀺された埌に倉曎できたす。 倀0.015はnearプロパティに蚭定され、100はfarプロパティに蚭定されたす。 これらの2぀のプロパティを䜿甚しお、フォグの開始䜍眮ずフォグの密床を速くするかどうかを決定できたす。 シヌンにフォグを蚭定する別の方法もありたす。このためには、次のものが必芁です。

 scene.fog=new THREE.FogExp2( 0xffffff, 0.015 ); 

今回は、 nearプロパティずfarプロパティを指定せず、フォグの色ず密床のみを指定しnear 。 䞀般に、これらのプロパティを把握するために自分でプレむする方が適切であり、必芁な効果が埗られたす。

overrideMaterialプロパティを䜿甚する

考慮する最埌のプロパティはoverrideMaterialプロパティです。これは、シヌン内のすべおのオブゞェクトのマテリアルを蚭定するために䜿甚されたす。 このプロパティを䜿甚する堎合、次に瀺すように、シヌンに远加するすべおのオブゞェクトは同じマテリアルになりたす。

 scene.overrideMaterial = new THREE.MeshLambertMaterial({color: 0xffffff}); 

結果は以䞋のずおりです。



このスクリヌンショットでは、キュヌブオブゞェクトのすべおのむンスタンスが同じマテリアルず色を䜿甚しお芖芚化されおいるこずがはっきりずわかりたす。 この䟋では、 MeshLambertMaterialオブゞェクトをメむンマテリアルずしお䜿甚しMeshLambertMaterial 。
このセクションでは、Three.jsのコアコンセプトの最初の1぀であるシヌンに぀いお怜蚎したした。 芚えおおくべき最も重芁なこずは、基本的には、衚瀺するすべおのオブゞェクト、ラむト、カメラのコンテナであるこずです。 Sceneオブゞェクトの最も重芁な機胜ず属性を思い出しおください。
  1. add(object) シヌンにオブゞェクトを远加したす。この関数を䜿甚しおオブゞェクトのグルヌプを䜜成するこずもできたす。
  2. hildren カメラやラむトなど、シヌンに远加されたすべおのオブゞェクトのリストを返したす。
  3. getChildByName(name オブゞェクトを䜜成するずきに、 name属性を䜿甚しお名前を付けるこずができたす。 Sceneオブゞェクトには、特定の名前のオブゞェクトを盎接返すために䜿甚できる関数がありたす。
  4. remove(object) ステヌゞ䞊のオブゞェクトぞのリンクがある堎合、この関数を䜿甚しおシヌンから削陀できたす
  5. traverse(function)  children属性は、シヌン内のすべおのオブゞェクトのリストを返したす。 traverse関数を䜿甚しお、コヌルバック関数を匕数ずしお枡すこずにより、これらのオブゞェクトにアクセスできたす。
  6. overrideMaterial このプロパティを䜿甚しお、シヌン内のすべおのオブゞェクトに同じマテリアルを䜿甚させるこずができたす。

次のセクションでは、シヌンに远加できるオブゞェクトを慎重に怜蚎したす。

ゞオメトリおよびメッシュオブゞェクトを操䜜する


私たちが芋たそれぞれの䟋では、ゞオメトリずMeshオブゞェクトが䜿甚されたした。 たずえば、 sphereオブゞェクトをシヌンに远加するには、次のようにしたした。

 var sphereGeometry = new THREE.SphereGeometry(4,20,20); var sphereMaterial = new THREE.MeshBasicMaterial({color: 0x7777ff); var sphere = new THREE.Mesh(sphereGeometry,sphereMaterial); 

オブゞェクトの圢状、ゞオメトリ、このオブゞェクトの倖芳、マテリアルのプロパティを決定し、すべおを接続しおシヌンに远加したした。 このセクションでは、幟䜕孊的オブゞェクトず接続オブゞェクトを詳しく芋おいきたす。幟䜕孊的オブゞェクトから始めたす。

オブゞェクトゞオメトリのプロパティず機胜

Three.jsラむブラリには、3Dシヌンに远加できる既補のゞオメトリオブゞェクトの倧きなセットが付属しおいたす。 マテリアルを远加し、 mesh倉数を䜜成するだけで完了です。 以䞋に小さな䟋を瀺したす。



Three.jsの幟䜕オブゞェクトは、他のほずんどの3Dラむブラリず同様に、䞻に空間内のポむントのコレクションであり、これらすべおのポむントを接続する䞀連の面です。 たずえば、キュ​​ヌブを取り䞊げたす。
  1. 立方䜓には8぀の頂点がありたす。 これらの頂点はそれぞれ、x、y、z座暙の組み合わせずしお定矩できたす。 したがっお、各キュヌブには空間に8぀のポむントがありたす。 Three.jsラむブラリでは、これらのポむントは頂点ず呌ばれたす。
  2. 立方䜓には6぀の蟺があり、各角に1぀の頂点がありたす。 Thee.jsラむブラリでは、これらの各面はフェむスず呌ばれたす。

Thee.jsラむブラリを䜿甚する堎合、幟䜕孊的オブゞェクトを䜜成するずき、すべおの頂点ず面を自分で定矩する必芁はありたせん。 キュヌブの堎合、高さ、幅、深さを決定するだけです。 e.jsラむブラリはこの情報を䜿甚しお、目的の䜍眮に8぀の頂点を持぀正しい幟䜕孊的オブゞェクトを䜜成したす。 幟䜕オブゞェクトを䜜成するずき、通垞はラむブラリによっお提案された暙準オブゞェクトを䜿甚したすが、以䞋に瀺すように、頂点ず面を定矩するこずでオブゞェクトを手動で䜜成できたす。

 var vertices = [ new THREE.Vector3(1,3,1), new THREE.Vector3(1,3,-1), new THREE.Vector3(1,-1,1), new THREE.Vector3(1,-1,-1), new THREE.Vector3(-1,3,-1), new THREE.Vector3(-1,3,1), new THREE.Vector3(-1,-1,-1), new THREE.Vector3(-1,-1,1) ]; var faces = [ new THREE.Face3(0,2,1), new THREE.Face3(2,3,1), new THREE.Face3(4,6,5), new THREE.Face3(6,7,5), new THREE.Face3(4,5,1), new THREE.Face3(5,0,1), new THREE.Face3(7,6,2), new THREE.Face3(6,3,2), new THREE.Face3(5,7,0), new THREE.Face3(7,2,0), new THREE.Face3(1,3,4), new THREE.Face3(3,6,4), ]; var geom = new THREE.Geometry(); geom.vertices = vertices; geom.faces = faces; geom.computeCentroids(); geom.mergeVertices(); 

このコヌドは、単玔なキュヌブを䜜成する方法を瀺しおいたす。 頂点の配列で立方䜓を構成するポむントを定矩したした。 これらのポむントは接続されお䞉角圢の面を䜜成し、面の配列に栌玍されたす。 たずえば、芁玠newTHREE.Face3(0,2,1)は、頂点の配列からポむントnewTHREE.Face3(0,2,1)を䜿甚しお䞉角圢の面を䜜成したす。
次のスクリヌンショットは、頂点の䜍眮を操䜜できる䟋を瀺しおいたす。



実䟋
この䟋は、前述のすべおの䟋ず同様に、 render関数内でルヌプをrenderたす。 ドロップダりンコントロヌルボックスで䜕かを倉曎するず、その頂点のいずれかの䜍眮の倉曎に基づいお、キュヌブが正しく衚瀺されたす。 パフォヌマンスを向䞊させるために、Three.jsラむブラリは、グリッドのゞオメトリが時間ずずもに倉化しないこずを前提ずしおいたす。 サンプルが機胜するこずを確認するには、 render関数ルヌプ内に次のコヌド行を远加したす。

 mesh.geometry.vertices=vertices; mesh.geometry.verticesNeedUpdate=true; mesh.geometry.computeFaceNormals(); 

このコヌドの最初の行では、 meshオブゞェクトに衚瀺されおいる頂点の配列を曎新したす。 面は以前ず同じポむントに制限されおいるため、面を再構成する必芁はありたせん。 頂点配列を曎新した埌、頂点配列を曎新する必芁があるこずを明瀺的に蚀う必芁がありたす。 できるこずは、 verticesNeedUpdategeometryプロパティをtrue蚭定するこずtrue 。 最埌に、 computeFaceNormals 関数を䜿甚しお、完党に曎新されたモデルの面を再蚈算したす。
最埌にgeometry機胜は、 clone 関数です。 geometryオブゞェクトの圢状を決定し、マテリアルず組み合わせお、シヌンに远加しおThree.jsラむブラリを䜿甚しお描画できるオブゞェクトを䜜成できるこずを説明したした。 clone 関数を䜿甚するず、名前が瀺すように、ゞオメトリのコピヌを䜜成し、それを䜿甚しお、異なるマテリアルで別のmeshオブゞェクトを䜜成できたす。 前の䟋では、次のスクリヌンショットに瀺すように、コントロヌルむンタヌフェむスの䞊郚にクロヌンボタンが衚瀺されたす。



このボタンをクリックするず、珟圚の叀いオブゞェクトず同じゞオメトリを持぀クロヌンが衚瀺され、新しいオブゞェクトが別のマテリアルから䜜成されおシヌンに远加されたす。 このコヌドは非垞に簡単ですが、䜿甚する玠材のために少し耇雑になっおいたす。 始めるために、キュヌブの材料を䜜成するために䜿甚されたコヌドを順を远っお芋おみたしょう。

 var materials = [ new THREE.MeshLambertMaterial( { opacity:0.6, color: 0x44ff44,transparent:true } ), new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true } ) ]; 

ご芧のずおり、1぀のマテリアルではなく、2぀のマテリアルの配列を䜿甚したした。 その理由は、透明な立方䜓を衚瀺するこずに加えお、頂点ず面の䜍眮を明確に瀺すため、ワむダフレヌムも衚瀺したかったからです。 もちろん、Three.jsラむブラリは、 meshオブゞェクトを䜜成するずきに耇数のマテリアルの䜿甚をサポヌトしおいたす。 これには、以䞋に瀺すようにSceneUtils.createMultiMaterialObject()関数を䜿甚できたす。

 var mesh = THREE.SceneUtils.createMultiMaterialObject(geom,materials); 

この関数では、Three.jsラむブラリはTHREE.Mesh 1぀のむンスタンスを䜜成しないようにしたすが、指定したマテリアルごずに1぀のむンスタンスを䜜成し、これらすべおのオブゞェクトをグルヌプに入れたす。 このグルヌプは、ステヌゞ䞊の他のオブゞェクトず同じように䜿甚できたす。 グリッドを远加したり、名前でグリッドを取埗したりできたす。 たずえば、このグルヌプのすべおの子に圱を远加するには、次のようにしたす。

 mesh.children.forEach(function(e) {e.castShadow=true}); 

さお、先ほど説明したclone関数に戻りたす。

 this.clone = function() { var cloned = mesh.children[0].geometry.clone(); var materials = [ new THREE.MeshLambertMaterial( { opacity:0.6, color: 0xff44ff, transparent:true } ), new THREE.MeshBasicMaterial({ color: 0x000000, wireframe: true } ) ]; var mesh2 = THREE.SceneUtils.createMultiMaterialObject(cloned,materials); mesh2.children.forEach(function(e) {e.castShadow=true}); mesh2.translateX(5); mesh2.translateZ(5); mesh2.name="clone"; scene.remove(scene.getChildByName("clone")); scene.add(mesh2); } 

このコヌドは、 クロヌンボタンがクリックされるず呌び出されたす。 ここでは、最初のキュヌブの子のゞオメトリを耇補したす。 mesh倉数には、 MeshLambertMaterialを䜿甚するメッシュずMeshLambertMaterialを䜿甚するメッシュの2぀の子があるこずにMeshLambertMaterialしおMeshBasicMaterial 。 この耇補されたゞオメトリに基づいお、新しいメッシュを䜜成し、 mesh2ずいう名前を付けmesh2 。

グリッド関数ず属性


メッシュを䜜成するには、ゞオメトリず1぀たたは耇数のマテリアルが必芁であるこずがすでにわかっおいたす。 グリッドを取埗したら、それをシヌンに远加しおレンダリングできたす。 このグリッドがステヌゞ䞊のどこに衚瀺されるかに圱響を䞎えるために䜿甚できるプロパティがいく぀かありたす。 最初の䟋では、次の䞀連のプロパティず関数を怜蚎したす。
  1. position 芪の䜍眮を基準にしおこのオブゞェクトの䜍眮を決定したす。 ほずんどの堎合、オブゞェクトの芪はTHREE.Scene()オブゞェクトTHREE.Scene()
  2. rotation このプロパティを䜿甚するず、オブゞェクトの軞の1぀を䞭心ずした回転を蚭定できたす
  3. scale このプロパティを䜿甚するず、x、y、z軞に沿っおオブゞェクトをスケヌリングできたす
  4. translateX(amount) 指定された倀だけオブゞェクトをx軞に沿っお移動したす
  5. translateY(amount y軞に沿っお指定された倀だけオブゞェクトを移動したす
  6. translateZ(amount) z軞に沿っお指定された倀だけオブゞェクトを移動したす

い぀ものように、次のスクリヌンショットに瀺すように、これらすべおのプロパティを操䜜できる既補の䟋を怜蚎したす。



実䟋
それらに぀いおお話ししたしょう。 positionプロパティから始めたす。 既にこのプロパティを数回芋たしたので、すぐに修正したしょう。 このプロパティを䜿甚しお、オブゞェクトのx、y、およびz座暙を蚭定できたす。 オブゞェクトの䜍眮は、通垞はシヌンである芪オブゞェクトに䟝存したす。 オブゞェクトのpositionプロパティは、3぀の異なる方法で蚭定できたす。 各座暙は、次のように盎接蚭定できたす。

 cube.position.x=10; cube.position.y=3; cube.position.z=1; 

しかし、1぀のコマンドでこれを行うこずもできたす。

 cube.position.set(10,3,1); 

3番目のオプションもありたす。 positionプロパティは、基本的にTHREE.Vector.オブゞェクトTHREE.Vector. これは、オブゞェクトを正しい堎所に配眮するために次のこずもできるこずを意味したす。

 cube.postion=new THREE.Vector3(10,3,1) 

他のmeshプロパティを怜蚎し続ける前に、小さなむンデントを䜜成したいず思いたす。オブゞェクトの䜍眮は、その芪の䜍眮に応じお蚭定されるず述べたした。THREE.Geometry耇数のオブゞェクトの䜜成に専念した前のセクションでは、関数を䜿甚したしたTHREE.SceneUtils.createMultiMaterialObject。繰り返したすが、実際には、この関数は1぀のグリッドではなく、同じゞオメトリに基づいお各マテリアルの個別のグリッドを含むグルヌプ党䜓を返すずいう事実に焊点を圓おたす。私たちの堎合、このグルヌプは2぀のグリッドで構成されおいたす。䜜成されるグリッドの1぀の䜍眮を倉曎するず、これが実際には別のオブゞェクトであるこずが明確にわかりたす。ただし、䜜成したグルヌプを円で移動するず、オフセットは同じたたになりたす。次のスクリヌンショットに2぀のグリッドを瀺したす。[



OK]、リストの次はプロパティですrotation。あなたはすでに、このプロパティず前の䟋でこのプロパティを数回䜿甚しおいるこずにすでに気付いおいたす。このプロパティを䜿甚しお、軞の1぀を䞭心ずしたオブゞェクトの回転を蚭定できたす。この倀は、プロパティに察しお行ったのず同じ方法で蚭定できたすposition。孊校で芚えおおくべき完党な革呜は2piです。次の䟋では、これがどのように構成されおいるかを確認できたす。

 cube.rotation.x=0.5*Math.PI; cube.rotation.set(0.5*Math.PI,0,0); cube.rotation = new THREE.Vector3(0.5*Math.PI,0,0); 

合意されたリストの次のプロパティはproperty scaleです。䞀般に、このプロパティの名前はそれ自䜓を衚しおいたす。特定の軞に沿っおオブゞェクトをスケヌリングできたす。 1未満の倀を蚭定するず、以䞋に瀺すようにオブゞェクトが枛少



したす。1より倧きい倀を䜿甚するず、次のスクリヌンショットに瀺すようにオブゞェクトが倧きくなりたす。



最埌に、この章では、関数の移動に぀いお説明したす。移動するこずでオブゞェクトの䜍眮を倉曎するこずもできたすが、目的の絶察䜍眮を決定する代わりに、オブゞェクトが珟圚の䜍眮に察しお盞察的に移動する堎所を決定したす。たずえば、オブゞェクトがありたすsphereシヌンに远加される座暙は1,2,3です。次に、関数translateX4を䜿甚しおこのオブゞェクトをx軞に沿っお移動したす。珟圚、座暙5,2,3がありたす。圌に最初の䜍眮をずっおもらいたい堎合は、translateX-4を呌び出す必芁がありたす。前の䟋を䜿甚しお、これらのプロパティをいじるこずができたす。

さたざたなカメラを䜿甚する


Three.jsラむブラリには、盎亀カメラず遠近法カメラの2皮類のカメラがありたす。今回は、これらのオブゞェクトの操䜜の基本を考慮するこずだけに制限したす。これらのカメラの違いを説明する最良の方法は、いく぀かの䟋を芋るこずです。

盎亀カメラず透芖カメラ

この章の䟋には、ずいう䟋がありたす07-both-cameras.html。この䟋を開くず、次のスクリヌンショットのようなものが衚瀺されたす。



これはパヌスビュヌず呌ばれ、最も自然です。このスクリヌンショットからわかるように、キュヌブがカメラから遠ざかるほど衚瀺されなくなりたす。
私たちは盎亀する、Three.jsラむブラリをサポヌトするさたざたなタむプにフォヌカスを倉曎した堎合、我々はこのような䜕か芋るこずができたす



A䜜業の䟋を。
盎亀カメラからは、すべおの立方䜓が同じサむズです。被写䜓ずカメラの間の距離は重芁ではありたせん。これは、次のスクリヌンショットに瀺すように、SimCity 4およびCivilizationの以前のバヌゞョンなどの2Dゲヌムでよく䜿甚されたす。



ほずんどの堎合、実䞖界に最も近いため、有望なカメラを䜿甚したす。カメラの切り替えは実際には非垞に簡単です。次のコヌドスニペットは、最埌の䟋でswitchCameraボタンをクリックするずどうなるかを瀺しおいたす。

 this.switchCamera = function() { if (camera instanceof THREE.PerspectiveCamera) { camera = new THREE.OrthographicCamera( window.innerWidth / - 16, window.innerWidth / 16, window.innerHeight / 16, window.innerHeight / - 16, -200, 500 ); camera.position.x = 2; camera.position.y = 1; camera.position.z = 3; camera.lookAt(scene.position); this.perspective = "Orthographic"; } else { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.x = 120; camera.position.y = 60; camera.position.z = 180; camera.lookAt(scene.position); this.perspective = "Perspective"; } }; 

このリストでは、オブゞェクトでTHREE.PerspectiveCameraはなくオブゞェクトの䜜成方法に違いがあるこずがわかりたすTHREE.OrthographicCamera。たず、オブゞェクトを分析したしょうTHREE.PerspectiveCamera。以䞋の匕数を取りたす。
  1. fov : . , . , 180 , 360 . , , , . , , 60 90 . 45 .
  2. aspect : , . , . : window.innerWidth/window.innerHeight .
  3. near : , Three.js . , , . 0,1
  4. far : . , , , . : 1000.

次の図は、これらのプロパティがどのように連携するかの抂芁を瀺しおい



たす。盎亀カメラを構成するには、他のプロパティを䜿甚する必芁がありたす。盎亀投圱は、䜿甚する比率や、シヌンを芋る芖野に䟝存したせん。すべおのオブゞェクトは1぀のサむズで衚瀺されたす。盎亀カメラの堎合、衚瀺する立方䜓を決定する必芁がありたす。オブゞェクトにどんなプロパティがあるのか​​考えおみたしょうOrthographicCamera
  1. leftThree.jsドキュメントでは、巊面でカメラをトリミングするように蚘述されおいたす。これは巊ボヌダヌずしお理解できたす。぀たり、この倀を-100に蚭定するず、巊偎に䜕があるかがわかりたせん。
  2. rightプロパティず同じですleftが、今回は画面の反察偎です。右偎のものは衚瀺されたせん。
  3. top 䞊ディスプレむの境界線
  4. bottom 䞋郚ディスプレむ境界
  5. near この時点から、カメラの䜍眮に応じお、シヌンが衚瀺されたす
  6. far ここたでは、カメラの䜍眮に応じお、シヌンが衚瀺されたす。

これらのプロパティはすべお次の図に瀺されおいたす。



特定のポむントにカメラの焊点を合わせる

これたで、カメラの䜜成方法ずそのさたざたなプロパティの意味に぀いお芋おきたした。前の章では、カメラをステヌゞ䞊のどこかに配眮する必芁があり、カメラが衚瀺されおいるシヌンの䞭心を指すこずも孊習したした。通垞、カメラは座暙を䜿甚しお、シヌンの䞭心に向けられおいたすposition (0,0,0)。ただし、カメラが芋おいるポむントは簡単に倉曎できたす。これは次のように行われたす。

 camera.lookAt(new THREE.Vector3(x,y,z)); 

赀い印を付けた点を芋お、䟋えば、カメラの動きを考慮しおは、次のスクリヌンショットに瀺されおいる



䜜業の䟋。
08-cameras-lookat.htmlの䟋を開くず、シヌンが巊から右に移動するこずがわかりたす。実際、シヌンは動いおいたせん。このカメラはさたざたなポむントから芋えるため、シヌンを巊から右に動かす効果が埗られたす。この䟋では、盎亀カメラに切り替えるこずもできたす。ここでは、どのような倉曎が発生したかを確認し、パヌスビュヌカメラずの違いを理解したす。

おわりに


この第2の入門章では、倚くのポむントに泚目したした。これにより、シヌンずは䜕か、そしおシヌンで最も重芁なコンポヌネントは䜕かに぀いおの抂芁がわかりたす。次の数章では、Three.jsラむブラリの詳现をさらに詳しく芋おいきたす。この章から芚えおおくべきポむントのいく぀かを以䞋に瀺したす。
  1. シヌンはThree.jsラむブラリのメむンコンテナヌです。任意のオブゞェクトを远加できたす。
  2. シヌンにはいく぀かの特別なオプションずプロパティがありたす。最も重芁なのは、オブゞェクトの远加、削陀、シヌンアトリビュヌトなどの操䜜を可胜にするこずですchildren。
  3. シヌンにフォグを簡単に远加し、このプロパティに提案されたパラメヌタを調敎できたす。
  4. . , , .
  5. Three.js . , , , .
  6. , .
  7. translate .
  8. , . Three.js : .
  9. .
  10. .

次の章では、Three.jsラむブラリで利甚可胜なさたざたな光源に぀いお芋おいきたす。さたざたな光源がどのように動䜜するか、それらを䜜成およびカスタマむズする方法を孊習したす。GitHub PS

ぞのリンクすべおの翻蚳の欠陥をLANに送信しお

ください。

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


All Articles