3D レンダリングはthree.js を使用して作成されますか?
three.js を使用すると、Web ページ上にさまざまな 3D 効果を簡単に作成できます。 2D でコンテンツを描画する場合は、キャンバスを使用することをお勧めします。しかし、多くの友人は、私たちが描いてインポートしたグラフィックスにシャドウ効果を追加する方法を知りません。また、すでに作成した 3dmax リソースをインポートする方法さえ知りません。そこで、このチュートリアルでは、3dmax で作成したリソースをインポートする方法と、自分で描いたすべてのグラフィックを含むインポートしたリソースに影を追加する方法を簡単に紹介します。この8部構成のエッセイのような暗号がまったく覚えられないという友人もたくさんいます。実際、コードを書く必要があるときは、コードを暗記する代わりに、公式のケースを参照するだけで済みます。たくさんメイクすれば自然と覚えられます。コンパイルの量が減れば、めったに使用しないコードを覚えるのに多くの時間を費やす必要がなくなります。
まず、3dmax リソースをインポートする方法を紹介します。ここで、私自身のテストの結果、作成した Web ページをローカル ファイルから直接開くと、Google や IE などのブラウザはロードしたリソースを表示できないことに注意してください。その理由は、ファイルを開いた後にファイル プロトコルが使用されるためです。ファイルはローカルにあるため、サーバーを参照すると、セキュリティの問題により、ローカル リソースを読み込むことができなくなります。 Firefox ブラウザは通常どおり開くことができます。したがって、デバッグする場合は Firefox を使用するか、Tomcat や Apache などを使用して最初にローカル サーバーをセットアップし、ドメイン名を介して作成した Web ページにアクセスすることをお勧めします。ブラウザのセキュリティ設定を変更することはお勧めできません。
まず 3dmax を使用してグラフィックを作成し、ここでは独自のティーポットを選択します。インターネット上には 3dmax を使用してティーポットを作成するチュートリアルが多すぎるため、ここでは詳しく説明しません。作り方がわからない人は、チュートリアルを検索するだけで、数ステップで作成できます。 もちろん、作成後はエクスポートすることを忘れないでください。これを mtl ファイルと obj ファイルにエクスポートする必要があります。このステップは、ティーポットを作成するためのほとんどのチュートリアルでも利用でき、マウスを数回クリックするだけで実行できます。教材などについては、ここではあまり考えません。結局のところ、学習は簡単なことから始めるべきです。
上記のように 2 つのファイルをエクスポートした後、公式コードを参照して独自のマテリアルをインポートできます。
まず、three.js ファイルに加えて、three ソース ファイルも導入する必要があります。 1 つは OBJLoader.js、1 つは MTLLoader.js、もう 1 つは DDSLoader.js です。これらは、ローカル リソースをロードするために公式に提供されているライブラリ ファイルであり、公式 Web サイトからダウンロードできます。 このウェブサイトは公式のケースです。必要なファイルもここからダウンロードできます。
以下のコードは、公式と同様に素材をインポートするコードに加えて、影効果も追加しました。
1 var onError = function ( xhr ) { }; 2 THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() ); 3 var mtlLoader = new THREE.MTLLoader(); 4 mtlLoader.setPath( './' ); //设置我们需要加载的mtl文件路径 5 mtlLoader.load( 'lyn.mtl', function( material ) { //这里加载我们需要的文件名 6 material.preload(); 7 var objLoader = new THREE.OBJLoader(); 8 objLoader.setMaterials( material ); //材质,也可自定义 9 objLoader.setPath( './' ); //设置要加载的obj文件的路径 10 objLoader.load( 'lyn.obj', function ( object ) { //加载obj文件 11 object.position.z = 1; //这里设置我们的素材相对于原来的大小以及旋转缩放等 12 object.position.y = -0.5; 13 object.scale.x = 0.2; 14 object.scale.y = 0.2; 15 object.scale.z = 0.2; 16 object1 = object; //这里是对素材设置阴影的操作 17 for(var k in object.children){ //由于我们的素材并不是看上去的一个整体,所以需要进行迭代 18 //对其中的所有孩子都设置接收阴影以及投射阴影 19 //才能看到阴影效果 20 object.children[k].castShadow = true; //设置该对象可以产生阴影 21 object.children[k].receiveShadow = true; //设置该对象可以接收阴影 22 } 23 scene.add( object1 ); 24 25 }, onProgress, onError ); 26 });
以下はスポットライト光源を追加するためのコードです。スポットライト光源は焦点を合わせることができるため、デモンストレーションがより便利になります。友達は自分で他の光源を試すこともできます。必要なのは点光源や指向性光源などの光源であることを思い出してください。環境光は影を生成できません。ただし、周囲をより鮮明に表示したい場合は、点光源と周囲光を同時に追加することもできますが、過度の周囲光が影の通常の表示に影響を与えるのを避けるために、周囲光の強度を弱くする必要があります。
function SpotLight(){ light = new THREE.SpotLight( '#ffffff' ,1); light.castShadow = true; light.distance = 50; light.angle = 0.6; light.decay = 2; light.penumbra = 0.2; light.position.set( 3, 2, 1 ); light.shadow.camera.near = 1; light.shadow.camera.far = 3; light.shadow.camera.visible = true; light.shadow.mapSize.width = 1024; light.shadow.mapSize.height = 1024; light.target = sp; scene.add(light); }
影が見えるように、床に影を落とす床も必要です。前に、receiveShadow 属性について説明しました。マテリアルを追加したシェイプ SP を作成するとします。シャドウを受信できるようにするには、sp.receiveShadow=true を使用する必要があります。 false に設定するとどうなりますか?
は影を生成しません。では、これを true に設定するとどうなるでしょうか?可以看到,已经生成了阴影。所以,如果我们要让一个物体可以产生阴影,需要设置castShadow这个属性为true,而生成了阴影,总需要投射到某个物体上,才能被观察到。所以,接收投影需要将receiveShadow这个属性设置为true。
完整的效果如下
以下是完整代码。其中库文件以及3dmax的素材文件这里不提供,需要自己生成或者自己下载。也可以只学习阴影的生成方法。代码编写略仓促,不过除了各种事件的控制等,其他方面应该还是比较清晰的。欢迎批评之争。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <style> 5 html, 6 body { 7 width: 100%; 8 height: 100%; 9 } 10 11 body { 12 margin: 0; 13 } 14 15 canvas { 16 width: 100%; 17 height: 100% 18 } 19 </style> 20 </head> 21 <body> 22 23 <script src="js/three.min.js?1.1.11"></script> 24 <script src="js/jquery-1.12.4.js?1.1.11"></script> 25 <script src="js/OBJLoader.js?1.1.11"></script> 26 <script src="js/MTLLoader.js?1.1.11"></script> 27 <script src="js/DDSLoader.js?1.1.11"></script> 28 <script> 29 var scene = new THREE.Scene(); 30 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 2000); 31 camera.position.z = 6; 32 camera.position.y = 1; 33 camera.position.x = 2; 34 camera.lookAt(new THREE.Vector3(0, 0, 0)); 35 36 var other = new THREE.Object3D(); 37 other.add(camera); 38 scene.add(other); 39 40 var renderer = new THREE.WebGLRenderer(); 41 renderer.setSize(window.innerWidth, window.innerHeight); 42 document.body.appendChild(renderer.domElement); 43 44 var geometry = new THREE.BoxGeometry(1,1,1); 45 var material = new THREE.MeshPhongMaterial({ 46 color : '#2194ce', 47 specular : '#111111', 48 specular : 10 49 }); 50 var sp = new THREE.Mesh(geometry,material); 51 sp.position.z = -0.5; 52 53 var geometry = new THREE.ConeGeometry( 0.5, 1, 6 ); 54 var material2 = new THREE.MeshPhongMaterial({ 55 color : '#2194ce', 56 specular : '#ffffff', 57 shininess : 100 58 }); 59 var sp2 = new THREE.Mesh(geometry,material2); 60 sp2.position.x = -2.5; 61 sp2.position.z = -1; 62 63 var ball = new THREE.SphereGeometry( 0.5, 32, 32 ); 64 var material3 = new THREE.MeshPhongMaterial({ 65 color : '#2194ce', 66 specular : '#111111', 67 shininess : 100 68 }); 69 var myBall = new THREE.Mesh(ball,material3); 70 myBall.position.z = 1; 71 myBall.position.x = -1; 72 myBall.position.y = -1; 73 myBall.castShadow = true; 74 myBall.receiveShadow = true; 75 76 var light2 = new THREE.SpotLight( '#ffffff' ,1); 77 light2.castShadow = true; 78 light2.distance = 50; 79 light2.angle = 0.3; 80 light2.decay = 2; 81 light2.penumbra = 0.2; 82 light2.position.set( -2, 5, -2 ); 83 light2.shadow.camera.near = 1; 84 light2.shadow.camera.far = 3; 85 light2.shadow.camera.visible = true; 86 light2.shadow.mapSize.width = 1024; 87 light2.shadow.mapSize.height = 1024; 88 light2.target = sp; 89 scene.add(light2); 90 lightHelper2 = new THREE.SpotLightHelper(light2); 91 scene.add(lightHelper2); 92 93 renderer.shadowMap.enabled = true; 94 95 var matFloor = new THREE.MeshPhongMaterial( { color:0x808080 } ); 96 var geoFloor = new THREE.BoxGeometry( 200, 0.1, 200 ); 97 var mshFloor = new THREE.Mesh( geoFloor, matFloor ); 98 var ambient = new THREE.AmbientLight( 0x111111); 99 var lightHelper; 100 101 var light; 102 SpotLight(); 103 lightHelper = new THREE.SpotLightHelper( light ); 104 105 sp.castShadow = true; 106 sp.receiveShadow = true; 107 sp2.castShadow = true; 108 sp2.receiveShadow = true; 109 mshFloor.castShadow = true; 110 mshFloor.receiveShadow = true; 111 mshFloor.position.set( 0, -2, 0 ); 112 113 114 scene.add( mshFloor ); 115 scene.add(sp); 116 scene.add(sp2); 117 scene.add(myBall); 118 scene.add( light ); 119 scene.add(ambient); 120 scene.add(lightHelper); 121 // 0.9854 122 123 //聚光灯光源 124 function SpotLight(){ 125 light = new THREE.SpotLight( '#ffffff' ,1); 126 light.castShadow = true; 127 light.distance = 50; 128 light.angle = 0.6; 129 light.decay = 2; 130 light.penumbra = 0.2; 131 light.position.set( 3, 2, 1 ); 132 light.shadow.camera.near = 1; 133 light.shadow.camera.far = 3; 134 light.shadow.camera.visible = true; 135 light.shadow.mapSize.width = 1024; 136 light.shadow.mapSize.height = 1024; 137 light.target = sp; 138 scene.add(light); 139 } 140 141 //点光源 142 function PointLight(){ 143 light = new THREE.PointLight('#ffffff',1,50,2); 144 light.castShadow = true; 145 light.position.set( 3, 2, 1 ); 146 light.shadow.mapSize.width = 1024; 147 light.shadow.mapSize.height = 1024; 148 scene.add(light); 149 } 150 151 //平行光 152 function DirectLight(){ 153 light = new THREE.DirectionalLight('#ffffff',1); 154 light.castShadow = true; 155 light.position.set( 3, 2, 1 ); 156 light.decay = 2; 157 light.penumbra = 0.2; 158 light.shadow.mapSize.width = 1024; 159 light.shadow.mapSize.height = 1024; 160 scene.add(light); 161 } 162 163 var onProgress = function ( xhr ) { 164 if ( xhr.lengthComputable ) { 165 var percentComplete = xhr.loaded / xhr.total * 100; 166 console.log( Math.round(percentComplete, 2) + '% downloaded' ); 167 } 168 }; 169 170 var onError = function ( xhr ) { }; 171 THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() ); 172 var mtlLoader = new THREE.MTLLoader(); 173 mtlLoader.setPath( './' ); //设置我们需要加载的mtl文件路径 174 mtlLoader.load( 'lyn.mtl', function( material ) { //这里加载我们需要的文件名 175 material.preload();176 var objLoader = new THREE.OBJLoader(); 177 objLoader.setMaterials( material ); //材质,也可自定义 178 objLoader.setPath( './' ); //设置要加载的obj文件的路径 179 objLoader.load( 'lyn.obj', function ( object ) { //加载obj文件 180 object.position.z = 1; //这里设置我们的素材相对于原来的大小以及旋转缩放等 181 object.position.y = -0.5; 182 object.scale.x = 0.2; 183 object.scale.y = 0.2; 184 object.scale.z = 0.2; 185 object1 = object; //这里是对素材设置阴影的操作 186 for(var k in object.children){ //由于我们的素材并不是看上去的一个整体,所以需要进行迭代 187 //对其中的所有孩子都设置接收阴影以及投射阴影 188 //才能看到阴影效果 189 object.children[k].castShadow = true; //设置该对象可以产生阴影 190 object.children[k].receiveShadow = true; //设置该对象可以接收阴影 191 } 192 scene.add( object1 ); 193 194 }, onProgress, onError ); 195 }); 196 197 198 var render = function() { 199 requestAnimationFrame(render); 200 lightHelper.update(); 201 202 other.rotation.y += 0.01; 203 sp2.rotation.x += 0.01; 204 205 renderer.render(scene, camera); 206 } 207 208 render(); 209 210 //设置场景不停旋转 211 var tmp = 0; 212 var timer = setInterval(function(){ 213 if(tmp == 0){ 214 var route = (5 - light.position.y) / 50; 215 light.position.y += route; 216 if(route <= 0.001){ 217 tmp = 1; 218 } 219 }else{ 220 var route = (light.position.y - 1) / 50; 221 light.position.y -= route; 222 if(route <= 0.001){ 223 tmp = 0; 224 } 225 } 226 },15); 227 228 //设置图中的立方体可以旋转 229 var left = false; 230 var right = false; 231 var boxLeft = false; 232 var boxRight = false; 233 var boxUp = false; 234 var boxDown = false; 235 var object1 = ''; 236 setInterval(function(){ 237 if(left){ 238 object1.rotation.y -= 0.02; 239 }else if(right){ 240 object1.rotation.y += 0.02; 241 }else if(boxLeft){ 242 sp.rotation.y -= 0.02; 243 }else if(boxRight){ 244 sp.rotation.y += 0.02; 245 }else if(boxUp){246 sp.rotation.x -= 0.02; 247 }else if(boxDown){248 sp.rotation.x += 0.02; 249 } 250 },25); 251 252 document.onkeydown = function(ev){ 253 var ev = ev || event; 254 if(ev.keyCode == 65) 255 left = true; 256 else if(ev.keyCode == 68) 257 right = true; 258 else if(ev.keyCode == 37) 259 boxLeft = true; 260 else if(ev.keyCode == 38) 261 boxUp = true; 262 else if(ev.keyCode == 39) 263 boxRight = true; 264 else if(ev.keyCode == 40) 265 boxDown = true; 266 else if(ev.keyCode == 80){ 267 scene.remove(light); 268 PointLight(); 269 }else if(ev.keyCode == 83){ 270 scene.remove(light); 271 SpotLight(); 272 }else if(ev.keyCode == 17){ 273 scene.remove(light); 274 DirectLight(); 275 }else if(ev.keyCode == 90){ 276 if(light.intensity < 10) 277 light.intensity += 1; 278 }else if(ev.keyCode == 88){ 279 if(light.intensity > 0) 280 light.intensity -= 1; 281 }else if(ev.keyCode == 67){ 282 scene.remove(sp); 283 geometry = new THREE.BoxGeometry(1,1,1); 284 material = new THREE.MeshPhongMaterial({ 285 color : '#A44A32', 286 specular : '#ffffff', 287 specular : 100 288 }); 289 var sp = new THREE.Mesh(geometry,material); 290 sp.position.z = -0.5; 291 scene.add(sp); 292 }else if(ev.keyCode == 86){ 293 scene.remove(sp); 294 geometry = new THREE.BoxGeometry(1,1,1); 295 material = new THREE.MeshPhongMaterial({ 296 color : '#2194ce', 297 specular : '#111111', 298 specular : 100 299 }); 300 var sp = new THREE.Mesh(geometry,material); 301 sp.position.z = -0.5; 302 scene.add(sp); 303 } 304 } 305 306 document.onkeyup = function(ev){ 307 var ev = ev || event; 308 if(ev.keyCode == 65) 309 left = false; 310 else if(ev.keyCode == 68) 311 right = false; 312 else if(ev.keyCode == 37) 313 boxLeft = false; 314 else if(ev.keyCode == 38) 315 boxUp = false; 316 else if(ev.keyCode == 39) 317 boxRight = false; 318 else if(ev.keyCode == 40) 319 boxDown = false; 320 } 321 322 323 </script> 324 </body> 325 </html>
以上が3D レンダリングはthree.js を使用して作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが
