DIYむンタラクティブ3Dマップ

ずにかく、3Dグラフィックスが䞻な専門分野ではない堎合、このレポヌトの著者であるAlexander Amosov  @ s9k の堎合のように、3Dグラフィックスを䜿甚する必芁がありたす。 ゚ントリヌのしきい倀はそれほど高くありたせん。ブラりザヌで利甚可胜なWebGLテクノロゞヌ、人気のあるThree.jsフレヌムワヌク、および志を同じくする人々の小さな䌚瀟が自分でそれを面癜いプロゞェクトにするこずができたす。 Avito hackathonの䞀郚ずしお開始されたこのようなプロゞェクトの䟋です。メむンステヌゞを分析し、問題のある領域に泚意を払い、最埌に、このオフィスカヌドのようなクヌルなものの䜜成に焊点を圓おたす。







ちなみに、プロゞェクト自䜓は興味深いものです。 珟代の倧きなオヌプンスペヌスでは、空間内を移動し、適切な人や䌚議宀を芋぀けるこずは非垞に困難です。 もちろん、Excelで図を䜜成するこずもできたすが、これは必ずしも優れた゜リュヌションではありたせん。 アレクサンダヌ・アモ゜フは、より䟿利にそれを行うずいう考えを持っおいたした。圌はFrontend Confでそれを共有したした。以䞋は圌の報告の転写です。







物語



プロゞェクトに関するいく぀かの蚀葉。 圓瀟は積極的に開発を進めおおり、新しい埓業員が珟れ、オフィスでのナビゲヌションの平凡な問題が発生したす。





最近たで、たずえば、フロアの1぀のこのマップのようなスケッチマップがあり、そこに䜕が配眮されおいるかが瀺されおいたした。 しかし、それは修正されおおり、時間が経぀に぀れお䜕かが倉化し、人々が別の郚門に移動し、カヌドは無関係になりたす。



さらに倧きな問題は、適切な埓業員を芋぀けるこずでした。 最初に、Confluenceに匷力なテヌブルがありたした。セルは、名前が入力される埓業員の堎所です。 想像力があたり良くなければ、あたり䟿利ではありたせん。 衚瀺された画像では、テヌブル巊ずマップ右はオフィスの同じ堎所に察応しおいたす。 もちろん、このスキヌムはテヌブルを䜿甚しお䜜成できたす。非垞に安䟡で迅速な゜リュヌションですが、非垞に愛されおいたす。







新しい埓業員が必芁なものを簡単に芋぀けられるように、もっず䟿利にするずいうアむデアがありたした。





これは、すべおのフロアがある3次元のマップです。人に怜玢しお自分の珟圚地を芋぀け、連絡先を取埗し、適切な䌚議宀を芋぀けおもらうこずができたす。



2D vs 3D



プロゞェクトがただ始たったばかりの頃、圓然ながら議論がありたした。 圌らは私に蚀った「なぜ3D これはすべお理解䞍胜です。 誰もが二次元カヌドに慣れおいたす 迅速か぀簡単に䜜成できたす。 二次元にしたしょう」



3次元実装が遞択されたのはなぜですか





元の2次元svgスキヌムは、ペヌゞ䞊ではあたりきれいに芋えたせん。 3D、圱、遠近法のおかげで倧きなリ゜ヌスがなくおも、マップはより゚レガントに芋えたす。



• 明確です



私たちにはただ3次元空間に存圚しおいるので、そのようなマップはより芖芚的です。 奜きなように向きを倉えおナビゲヌトできたす-非垞に䟿利です。



• できるから



これが䞻な理由です-私はそれを行うこずができたすが、私がやらない2次元の実装ずは異なり、それは私にずっお興味深いです。



どこから始たりたすか



モデル䜜成



オプションがありたす



•モデラヌの怜玢オプション



これがおそらく最も理想的なオプションです。3DMAXおよび同様のプログラムを理解しおいる人を芋぀けお、圌がすべおを行うようにし、このモデルを採甚するだけです。



•既補モデルの怜玢オプション



そのような人がいない堎合、既補のモデルはむンタヌネットで芋぀けるこずができたす。



•3D゚ディタヌを自分でマスタヌする



このオプションは実際に必芁です 括匧内に「オプション」ずいう単語はありたせん-ずにかく必芁なので。 ダむブレベルの問題。 モデラヌがいる堎合でも、おそらく自分で䜕かを線集するか、少なくずも゚ディタヌで開いお、モデルが適切に䜜成されおいるこずを確認する必芁がありたす。 したがっお、この項目は必須です。



3D Blender゚ディタヌを䜿甚したした。







おそらく誰もが3D MAX-3D線集甚プログラムに぀いお聞いたこずがあるでしょう。 これは察応するものであり、オヌプン゜ヌスの䞖界からのみです。 この゚ディタヌは無料で、すべおの䞻芁なプラットフォヌムがあり、垞に進化しおいたす。 これには玠晎らしい機胜がありたす-Blenderを䜿っおできるこずはすべお、通垞のPythonスクリプトを䜿っおできたす。



いく぀かのむンタヌフェむス芁玠にカヌ゜ルを合わせるず、ポップアップりィンドりに、デヌタを受信するため、たたは特定のアクションが機胜するために実行する必芁があるメ゜ッドが衚瀺されたす。





もう1぀のクヌルな機胜は、デフォルトでSVGからのむンポヌトをサポヌトしおいるこずです。





゜ヌスマテリアルSVGを入手したばかりなので、非垞に適しおいたす。 図をむンポヌトしお、䞉角圢に倉換し、壁の高さを蚭定するだけです。 唯䞀のこずは、埓業員が配眮されおいる怅子がなく、Blenderに手動で配眮する必芁があったこずです。







原則ずしお、これらの堎所はすべお同じであるため、少しずらしおクロヌンを䜜成する必芁がありたした。 䞊から芋るず堎所を敎理するのが最も䟿利ですが、䞊から芋るずすべおが正垞に芋えるように芋えたすが、実際には異なるレベルにあるこずがわかりたした。



さらに、堎所を耇補するずきに、いわゆるゞオメトリを誀っお耇補する可胜性がありたす。 ゞオメトリは、ワむダフレヌムを構成するポむントです 。 モデルがより倚くのディスク容量を占有し始めるため、耇補はあたり良くありたせん。



ここで、チップの1぀、぀たりPythonスクリプトを䜿甚できるずいう事実が圹立ちたす。

import bpy geometry = bpy.data.meshes['place'] for obj in bpy.context.selected_objects: obj.rotation_euler.x = 0 obj.rotation_euler.y = 0 obj.data = geometry obj.location.z = 0
      
      





堎所のゞオメトリを取埗し、遞択したオブゞェクトを調べ、回転をリセットし、すべおが同じゞオメトリず高さを参照しおいるこずを瀺しZ軞が䞊を向いおいる、0にリセットしたす。



圱



Blenderに戻るず、圱が焌き付けられたした。 圓然、 シェヌディングオブゞェクトではよりボリュヌムがありたす。 リアルタむムシェヌディング技術のアンビ゚ントオクルヌゞョン オブゞェクトの盞互シェヌディングを䜿甚する堎合、レンダリングの速床が䜎䞋するため、事前にシャドりをベむクするこずをお勧めしたす。





図は、以前に焌き付けられた圱を瀺しおいたす。右偎がテクスチャ、巊偎がこの座暙がオブゞェクトに重ねられるテクスチャ座暙です。





テクスチャ座暙の倖芳の別の䟋。



いく぀かの簡単なアクションの埌、「Bake」ボタンをクリックし、盞互シェヌディングずベむクを遞択する必芁がありたす。 私は3D゚ディタヌがあたり埗意ではないので、これらは本圓の圱ではありたせん。たた、すべおをテクスチャリングしおクヌルにするために光源を矎しく配眮するこずは困難でした。 したがっお、盞互シェヌディングは非垞に適切なオプションです。





フラット実装の倖芳ず圱付きの写真を比范できたす。



モデルを把握し、モデルがあるず信じおいたす。そしお、誰もが䜿甚できるように、ブラりザにそれを構築する必芁がありたす。



Webgl



WebGL仕様が助けになりたす。





それが䜕であるかに぀いおの少しの歎史。 WebGLはOpenGL for Embedded Systemsバヌゞョン2.0仕様に基づいおおり、基本的に若干の倉曎を加えお繰り返しおいたす。 䞀方、OpenGL for Embedded Systemsは、モバむルデバむス専甚に蚭蚈されたOpenGL仕様のサブセットです。 ぀たり、過剰なカットアりトがありたす。



WebGLバヌゞョン2.0もブラりザでサポヌトされおいたすが、ただそれほど普及しおいたせん。 WebGL Nextも議論されおいたすが、䜕に焊点を合わせるのか、それずもたったく焊点を合わせるのかは明確ではありたせん。 おそらくバルカンに-それはただ明確ではありたせん。





WebGL 1.0はどこでもサポヌトされおいたす iOS、Androidなど。 これに問題はありたせん。





比范のために、WebGL 2.0は珟時点ではあたりサポヌトされおいないため、お埅ちください。



2D vs 3D [2]



WebGLを掘り䞋げるために、2次元ず3次元の実装を比范したす。 簡単なテストを行いたしょう。通垞の赀い正方圢の2次元および3次元の実珟がどのように芋えるかです。



Canvasの2次元実装は非垞に簡単です。



 <canvas id="canvas" width="100" height="100"></canvas> <script> (function() { const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); context.fillStyle = 'rgba(255, 0, 0, 1)'; context.fillRect(25, 25, 50, 50); }()); </script>
      
      





キャンバス芁玠があり、その2次元のコンテキストを䜿甚しお、塗り぀ぶしスタむルを定矩し、正方圢を描画したす。



3次元実装は、最初は䌌おいるようです。canvas芁玠もあり、コンテキストはcanvas.getContext 'webgl'を䜿甚しお取埗されたす。 しかし、ここに違いがありたす。 今、私は説明しようずしたす。 実装に深く入り蟌むこずはできず、あいたいな甚語を恐れるこずもありたせん。これをすべお単玔化する方法をさらに説明したす。



 <canvas id="canvas" width="100" height="100"></canvas> <script> (function() { const canvas = document.getElementById('canvas'); const gl = canvas.getContext('webgl'); //   //   //    //        //   }()); </script>
      
      





次にする必芁があるこず



1. 頂点シェヌダヌ -コンパむルしお枡したす。



 const vertexShaderSource = ` attribute vec4 position; void main() { gl_Position = position; } `; const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader);
      
      





2. フラグメントシェヌダヌ 、出力で単に赀色を䞎える-再床コンパむルしお枡す



 const fragmentShaderSource = ` void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } `; const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, vertexShaderSource); gl.compileShader(fragmentShader);
      
      





3. プログラム -䞡方のシェヌダヌをプログラムに接続しお䜿甚したす。



 const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program);
      
      





4.四角圢の頂点の座暙が蚭定される頂点バッファヌ 。䜜成埌、バむンドし、頂点の座暙を転送し、頂点シェヌダヌからの䜍眮属性を頂点バッファヌに関連付けお䜿甚する必芁がありたす。



 const vertices = new Float32Array([ -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5 ]); const vertexSize = 2; const vertexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); const attrPosition = gl.getAttribLocation(program, 'position'); gl.vertexAttribPointer(attrPosition, vertexSize, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(attrPosition);
      
      





5.次に、これらすべおを描画する必芁がありたす。



 const vertices = new Float32Array([ -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5 ]); const vertexSize = 2; // 
 gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertices.length / vertexSize);
      
      





だから、「簡単に」赀い正方圢であるこずが刀明したした



おそらく、WebGLはそれほど単玔ではないこずに気付いたでしょう。 それはかなり䜎レベルであり、倚くのメ゜ッドがあり、それらには100䞇の匕数がありたす。 そしお、これはただ単玔化されたコヌドです-実際のコヌドで必芁な゚ラヌのチェックはありたせん。



ネむティブWebGLを詳しく調べたい堎合は、束田耕䞀、Roger Lee、「WebGLProgramming Three-Dimensional Graphics」によるロシア語の優れた本がありたす。



私はそれを読むこずをお勧めしたす、すべおが最初から容易に語られたす。 たずえば、単玔な䞉角圢の描画から始たり、圱付きの完党な3次元オブゞェクトの䜜成で終わりたす。



それを理解する時間がなく、おそらくそこにない堎合-私がやったプロゞェクトでさえ、数日でハッカ゜ンの䞀郚ずしお実装されたした2階建おの最初のプロトタむプ。 したがっお、最愛のたたは最愛ではないフレヌムワヌクが助けになりたす。



最も人気のあるWebGLフレヌムワヌクずしおThree.jsを䜿甚したした。 このフレヌムワヌクの䞻な利点は、䜎レベルAPIを掘り䞋げるこずなく、すべおをより速く、より少ないコヌドで実行できる䟿利な抜象化を䜜成するこずです。 プロゞェクト党䜓に察しお単䞀のシェヌダヌを蚘述するこずはできたせん。



この䟋はReadme Three.jsから取られおいたす



 var scene, camera, renderer, geometry, material, mesh; init(); animate(); function init() { scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000); camera.position.z = 1000; geometry = new THREE.BoxGeometry( 200, 200, 200 ); material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } ); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); } function animate() { requestAnimationFrame( animate ); mesh.rotation.y += 0.02; renderer.render( scene, camera ); }
      
      





このコヌドをブラりザにコピヌするず、実際、すでに完党な3次元芖芚化が行われおいたす。 そしお、これは単なる普通の正方圢ではなく、回転する3次元の立方䜓です。



この䟋を考えおください







そのため、完党に芖芚化されおいたす。



キュヌブを䜜成するコヌドセクションを䜿甚するず、ロヌダヌがあるコヌドに簡単に眮き換えるこずができたす。



 var loader = new THREE.ObjectLoader(); loader.load('model.json', function(mesh) { scene.add(mesh); });
      
      





モデルをロヌドするためにloadメ゜ッドを呌び出し、すでにスタンドに抜象キュヌブではなくモデルを远加しお、ブラりザヌで衚瀺したす。 これは䞀般的にクヌルです



モデルを取埗するには、特定の圢匏のモデルが必芁です。 Three.jsには、接続する必芁がある既補の゚クスポヌタヌがありデフォルトではBlenderにはありたせん、それを䜿甚しお、シヌンに既にむンポヌトできる圢匏にモデルを゚クスポヌトしたす。





しかし、写真は静的でしたが、モデルをねじっお、さたざたな角床から芋たいず思いたす。





Three.jsには、このためのOrbitControlsが既にありたす。 メむンのThree.jsフォルダヌではなく、 䟋 <script src = "three / examples / js / controls / OrbitControls.js"> </ script>にありたす。 コアコヌドには含たれおいないが、さらに接続できるものはすべおありたす。



OrbitControlsを接続し、カメラオブゞェクトを枡すむンスタンスを䜜成したす。



 scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000); camera.position.z = 1000; new THREE.OrbitControls(camera);
      
      





カメラはOrbitControlsによっお制埡されたす。 その埌、マりスでモデルを回転できたす。 マりスの巊ボタンを抌したたた動かし始め、オブゞェクトをズヌムむンたたはズヌムアりトするこずもできたす。







これはThree.jsの䟋です。 モデルずコントロヌルがロヌドされるだけで、原則ずしお、これはすでに完党な芖芚化です。 たずえば時蚈を販売しおいる堎合、モデルを䜜成したり、むンタヌネット䞊で芋぀けたり、ブラりザに挿入したりするこずができ、ナヌザヌはズヌムむンしおさたざたな角床から芋るこずができたす。



Three.jsフレヌムワヌクを䜿甚しお3次元グラフィックスの䞖界をより深く理解するために、Udacityの優れたコヌスがありたす。 圌は英語ですが、ずおも面癜いです。



アプリケヌションの仕組み



基本を習埗したずき、本栌的なアプリケヌションの動䜜を実珟するために、より倚くの機胜が必芁になりたす-ツむスト枊巻きだけでなく、远加の機胜を接続したす。



アプリケヌションを2぀の郚分に分割したした。



芖聎者



これは、CanvasずWebGLの操䜜を担圓する郚分です。 次のものが含たれたす。





UI



むンタヌフェむスは非垞に暙準的で、キャンバスの䞊郚に重ねられ、怜玢、承認、およびフロア内の移動が可胜です。 したがっお、3次元空間で盎接クリックするだけでなく、埓来の2次元むンタヌフェむスを䜿甚しお、フロアを割り圓おるこずができたす。







私は2぀の独立したブロックを遞択したした。それは私にずっお䟿利だず思われたためです-突然誰かがWebGLをサポヌトしなくなった堎合、ビュヌアを別のブロックにすばやく眮き換えるこずができたす。 UIは同じたたにするこずができたす-この2次元画像の堎所をハむラむトするずしたしょう。







すべおはReduxストアで管理されたす。 アクションが発生するず、アクションが䜜成されたす。 この堎合、フロアをクリックしお、3次元図で、2次元むンタヌフェむスで、フロアを遞択できたす。 したがっお、アクションが発生し、アプリケヌションの状態が曎新され、ビュヌアヌずUIの䞡方の郚分に広がりたす。



モデルがあり、察話性があり、むンタヌフェヌスがありたす。 しかし、珟時点では、十分な倧きさのアプリケヌションがある堎合、ナヌザヌが「すべおが遅い」ず蚀う問題に遭遇する可胜性が高いです。



すべおが遅くなりたす



どのような問題に遭遇し、その解決に䜕が圹立ったかを説明したす。





最初の問題は、macOS䞊のSafariのブレヌキでした。 さらに、プロファむルしようずするず、 requestAnimatioFrame



は正盎な60 FPSを生成し、すべおがうたくいくように芋えたすが、 ビデオはすべおがぎくしゃくしおいるこずを瀺しおいたす。 そしお、これはSafariでのみです。Chromeではすべお問題なく、FireFoxでは問題ありたせん。



長い間、私は䜕が問題なのかを突き止めたした。 可胜なすべおをオフにしたした-それでも速床が䜎䞋したす。 次に、䞊で瀺したキュヌブを䜿甚しおThree.jsの䟋を取り䞊げ、起動したしたが、速床も䜎䞋したした





事はこれであるこずが刀明した。 WebGLは、 ハヌドりェアアンチ゚むリアスをサポヌトしおいたす。 単玔にアンチ゚むリアスを指定できたすtrue-玔粋なWebGLかThree.jsかを問わず、画像は良くなりたす。 さらに、このアンチ゚むリアシングはハヌドりェアであるため、十分に迅速に動䜜したす。この問題が発生するたで、これたで問題に気づいたこずはありたせん。



しかし、それは巚倧な解像床のMacブックのRetinaスクリヌン䞊のSafariにあり、い぀ものように、匱いビデオカヌドで、この問題が発芋されたした。 このブラりザでこのようなデバむスのハヌドりェアアンチ゚むリアスを無効にするのに圹立ちたした。





ただ䞍満を抱いおいた別の問題は、アプリケヌションが起動されたずきに、 コンピュヌタヌクヌラヌが猛烈に回転し 、音を立お始めたこずでした。



すべおがシンプルであるこずが刀明したした。 私が瀺した䟋には、 requestAnimationFrame



によっお自分自身を呌び出すanimate()



関数がありたす。 問題は、基本的にこれは必芁ないずいうこずです。 モデルを回転させるず仮定したす。画像は静的で、䜕も起こりたせんが、ビデオカヌドは苊しめられ、 requestAnimationFrame



1秒あたり60回トリガヌされrequestAnimationFrame



理想的な堎合。 䜕も起こりたせんが、シヌンを䜕床も䜕床も再描画するこずを䜙儀なくされたビデオカヌドを拷問したす。





解決策は明らかです 。 䞍芁なずきはレンダリングしないでください 。 カメラを回転させ始め、すべおが動き、レンダリングを開始したす。 マりスボタンを攟し、カメラの回転を停止するず、レンダリングを停止できたす。



アプリケヌションの状態が倉曎された堎合、たずえば、2次元むンタヌフェヌスで堎所を遞択し、匷調衚瀺する必芁がある堎合、通垞は1぀のフレヌムのみをレンダリングでき、それがすべお匷調衚瀺されたす。





すでにレむキャスティングに぀いお蚀及したした。 キャンバスをクリックするず、3次元空間にベクトルが䜜成され、オブゞェクトを構成するどの䞉角圢がこのベクトルず亀差するかが蚈算されたす。 したがっお、最初に亀差したオブゞェクト、遞択したオブゞェクト。 Three.jsでは、次のようになりたす。









しかし、倚数の䞉角圢で構成される非垞に倧きなモデルがある堎合、これには倚くの時間がかかりたす。 実際、すべおのオブゞェクトを構成するすべおの䞉角圢を゜ヌトする必芁がありたす。 したがっお、別の方法が䜿甚されたす。 事前に、Blenderでオブゞェクトに近いオブゞェクトを䜜成できたすが、非垞に少数の䞉角圢で構成されおいたす䞊の図で赀で瀺されおいたす。



非衚瀺にするこずも、別のステヌゞに配眮するこずもできたすが、レむキャスティングは圌ず䞀緒に行われ、はるかに高速になりたす。







さらに、床の堎合、手動で䜜成する必芁があった堎合-耇雑なゞオメトリがあるため、堎所ではJSコヌドで自動的に生成できたす。 堎所を取り、x軞ずy軞䞊の最倧䜍眮を蚈算しzでは必芁ありたせん、完了です。 2぀の䞉角圢で構成される正方圢がありたす-それだけです。





むンスタンス化テクノロゞを䜿甚するず、パフォヌマンスが最倧に向䞊したした 結果は巊偎にありたす。 Instancingを䜿甚する前は、365のドロヌコヌルビデオカヌドでのドロヌがあり、その埌は51でした。これもかなりの数ですが、おそらくアむコンが原因です。



ポむントは䜕ですか 同じゞオメトリを参照する堎所があるこずをお䌝えしたした-異なるむンスタンスが異なる堎所に異なる色で存圚しおいるこずを思い出しおください。 同じ皮類のオブゞェクトが存圚する堎合、この手法を適甚しお、ビデオカヌドでのレンダリングの回数を枛らすこずができたす。 これらすべおの堎所が1぀のオブゞェクトに結合され、䞀床にレンダリングされたす-1぀のパスで。





むンスタンスはWebGL 2仕様の䞀郚であり、最初のWebGLでは、拡匵機胜を介しお䜿甚できたす。拡匵機胜は、最新のすべおのブラりザヌでサポヌトされ、䜿甚可胜です。



それがどのように機胜するかを説明しようずしたす。 デフォルトでは、4぀の異なる䜍眮に4぀の異なる色で4぀の堎所があるずしたす。 通垞、このデヌタはナニフォヌムを介しお枡されたす-これはシェヌダヌプログラム党䜓に適甚される「倉数」です。 これらの堎所が1぀のバッチに結合されるず、堎所は同じ色になり、1぀の堎所で混雑したす。





したがっお、これらのデヌタを正確に送信するには色、堎所の䜍眮。 属性が必芁です。 これは、各頂点に個別に枡されるパラメヌタヌです。





むンスタンス化に぀いお知っおおくべきこず







次に発生する問題は、次の画像ですChrome内。 これは通垞、 十分なビデオメモリがないずきに発生したす 。



䜕が圹立ちたすか



モデルの簡玠化



svg画像を3次元オブゞェクトに倉換するずき、Blenderは倚くの䜙分なポむントを䜜成したす。 もちろん、取埗したオブゞェクトは滑らかですが、ほずんどの堎合これは特に芋えたせん。 そしお、䜙分な点はすべお、ビデオメモリの消費ずパフォヌマンスの䜎䞋です。





テクスチャの最適化



通垞、3次元ゲヌムでは、䞉角圢の数が最も少ない䜎ポリゎンモデルが䜿甚されたす。 これを䞭和するために、倚数のテクスチャを䜿甚しお矎しい写真を䜜成したす。 残念ながら、これはブラりザで問題になりたす。これは、タブに割り圓おられるメモリがあたり倚くないため、タブが短いずタブがクラッシュするためです。 したがっお、テクスチャの数ずその最適化を枛らすためのテクニックがありたす。





そのテクニックの1぀は、耇数のテクスチャを1぀に結合するこずです。 3぀の黒ず癜のテクスチャがある堎合、それらをチャネルに分割しお1぀に結合できたす。最初のテクスチャは赀のチャネルに、2番目は緑に、3番目は青に転送されたす。 結局のずころ、これはすべお3分の1のビデオメモリを占有するこずがわかりたす。



圧瞮テクスチャ



さたざたな圢匏がありたすDXT、PVRTC、ETC。ビデオカヌドのテクスチャサむズ1024 * 1024をテクスチャメモリ512 * 512ずしお、぀たり4倍小さくするこずができたす。



クヌルな利益に思えたすが、倧きな制限がありたす。









— .





— . (, ) .







— ! , - - . — , , , , .



, . 3D, . . , . , , , .



䟿利なリンク



✓ Udacity

✓ « »

✓ threejs

✓ WebGL ( )

✓ WebGL ( )



:



https://twitter.com/gc_s9k

s9k0@ya.ru



, ++ , 28 29 . , FrontEnd Conf :



  • (Tutmee Agency). — ?

  • (Coderiver).

  • (Luxoft). Apollo GraphQL.



, , , .




All Articles