<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      從Maya中把模型搬運至網頁的過程

      雖然利用threejs來在網頁中渲染3d模型不是第一次折騰了,但是還是遇到了各種問題。總結下我所遇到的問題,希望能給正在使用threejs的小伙伴一個幫助。

      一、所使用的軟件與開發環境

      1. Maya2014、Blender2.77a

      2. threejs-r82

      3. webpack + gulp

      二、 動畫模型的導入導出

      1、格式的選擇

      threejs支持的動畫模型有Collada(.dae)、mmd(用過MikuMikuDance的應該知道) 、fbx、json。

      Collada里面包含了你場景中所有數據(camera、scene、light),因為手生所有這次沒有采用這種格式。

      fbx雖然網頁中可以加載fbx,但我常用的是從其它軟件中導個fbx給blender用。不過這里值的注意一下,以maya為栗子。

      maya導出fbx的時候會有一個文件格式的選項: 二進制(導出給blender選擇這種編碼)ASCII(導出給threejs直接用選擇這種編碼)如下圖所示:

      2、動畫的分類

      • 變形動畫(threejs中MorphAnimMesh類)

      變形動畫簡單點來說就是通過變形物體來改變物體的樣子,復雜的動畫用這種方法處理就不合試了,因為改變一下所有的頂點都會隨之改變。數據量挺大的。

      在blender中的導出json選擇如下所示:

      • 骨骼動畫(threejs中SkinnedMesh類)

      骨骼動畫也就是蒙皮動畫,通過給物體綁定骨骼來對物體進行操作。

      在blender中的導出json時存在以下兩種情況:

      1、keyframe animation 導出選項以及json代碼如下所示:

      2、skeletal animation 導出選項以及json代碼如下所示:

      3、從maya中導出fbx至blender中

      1. 在maya中導出fbx給blender的時候文件格式選擇二進制

      2. 做模型綁定的時候對模型的數據進行清零(這點很重要,不然blender導出json的會出現錯誤情況)、綁定方法的話按照做游戲的綁定方法就可以了。

      3. 軟邊顯示與硬邊顯示(導出時在maya中選擇軟邊顯示)照理說應該是硬邊顯示才對,瞎猜是blender與maya設置不同吧。在頁面中渲染的情況如下所示:

      三、 模型渲染到網頁中

      1、創建場景

      var camera,scene,renderer
      
      scene = new THREE.Scene();
      
      camera = new THREE.PerspectiveCamera(40, 750 / 1200, 0.1, 10000);
      
      renderer = new THREE.WebGLRenderer({antialias: true, alpha: false, preserveDrawingBuffer: true});
      
      renderer.shadowMap.enabled = true;
      
      renderer.autoClear = true;
      
      var render = function () {
      
      	renderer.render(scene, camera);
      
      } 
      var animate = function () {
      
      	requestAnimationFrame(_that.animate);
          
          render();
      
      }
      
      //一個簡單的場景就寫好了
      
      

      2、創建動畫模型

      這里我導出的是json格式的蒙皮動畫所以我采用了threejs中提供的BlendCharacter()方法來創建我的動畫模型。具體代碼如下所示:

      var createSkinningAnimate = function (model) {
      
          var blendMesh = new THREE.BlendCharacter();
      
          blendMesh.modelId = model.id;
      
          blendMesh.load( model.modelSrc, function(){
      
               blendMesh.name = model.modelName;
      
               blendMesh.scale.set(model.scaleX, model.scaleY, model.scaleZ);
      
               blendMesh.position.set(model.x, model.y, model.z);
      
               blendMesh.frustumCulled = false;
      
               blendMesh.material.transparent =  true;
              //
               blendMesh.material.opacity = 0;
      
              if(model.shadow) {
      
                  blendMesh.castShadow = true;  //表示這個物體是可以產生陰影的
      
              }
      
              if(model.receive) {
      
                  blendMesh.receiveShadow = true;  //表示這個物體是可以接受(顯示)陰影的
      
              }
      
      
              if(model.side) {
      
                  blendMesh.material.side = THREE.DoubleSide;  //解決單雙面顯示問題
      
              }
      
              blendMesh.visible = false;
      
              for(var i = 0, len = model.action.length; i < len; i++) {
      
                  blendMesh.applyWeight( model.action[i].name, model.action[i].weight);
              };
      
              blendModelGroup.add(blendMesh);
      
              loadModelProgress();
      
          });
      
      }
      
      

      創建這個模型的時候我遇到了兩個問題:

      • 模型出現渲染的時候單雙面問題嗎,具體表現如下所示。

      解決方法:

      //設置material的side
      
      blendMesh.material.side = THREE.DoubleSide;  //解決單雙面顯示問題
      
      
      • 當鏡頭拉近的時候模型從視野中消失,具體表現如下所示

      解決方法:

      //設置這個屬性為false時這個bug就好了。
      
      blendMesh.frustumCulled = false;
      
      

      frustumCulled 這個屬性是至今干嘛用的我不太清楚,求告知。

      3、燈光渲染

      場景中利用了兩個燈光全局燈(AmbientLight)與聚光燈(SpotLight)代碼如下:

      _that.ambientLight = new THREE.AmbientLight( 0xffffff);
      
      scene.add(_that.ambientLight);
      
      var spotLight = new THREE.SpotLight(0xffffff);
      
      _that.spotLight = spotLight;
      
      spotLight.angle = 0.74;
      spotLight.position.set(0, 60, -1);
      spotLight.castShadow = true;
      spotLight.penumbra = 0.7;
      spotLight.intensity = 2;
      spotLight.distance = 200;
      spotLight.shadow.camera.near = 50;
      spotLight.shadow.camera.far = 200;
      spotLight.shadow.camera.fov = 35;
      spotLight.shadow.mapSize.height = 1024;
      spotLight.shadow.mapSize.width = 1024;
      
      spotLight.name = 'spotLight';
      
      scene.add(spotLight);
      
      spotLight.target.position.set(-15,0,0);
      
      //scene.add(new THREE.SpotLightHelper( spotLight ));
      
      scene.add(spotLight.target);
      
      

      燈光的調試主要靠guiLightHelper,這兩個東西調試起來非常方便省了不少時間。調試前與調試后如圖所示:

      5、調試技巧

      • gui

      • helper

      • topView

      helper:threejs的相機、燈光都提供了Helper這個方法,在頁面中渲染添加一個參考線。

      topView: 意思就是在頁面中渲染一個頂視圖,如果需要做相機的移動這個方法比較靠譜可以清楚的看見相機是這么運動的。然后發現問題的所在。渲染如下圖所示:

      實現代碼:

      var testW = 750,
          testH = 1200;
      
      var views = {
          left: 0.5,
          bottom: 0,
          width: 0.5,
          height: 0.5,
          eye: [0, 0, 50],
          direction: [-1, 0, 0]
      };
      
      var orthoCam = new THREE.OrthographicCamera(testW / -2, testW / 2, testH / 2, testH / -2, -500, 10000);
      view.orthoCam = orthoCam;
      
      update () {
      	var left   = Math.floor( testW  * 0.0 );
      	var bottom = Math.floor( testH * 0 );
      	var width  = Math.floor( testW  * 1.0 );
      	var height = Math.floor( testH * 1.0 );
      	
      	renderer.setViewport( left, bottom, width, height );
      	renderer.setScissor( left, bottom, width, height );
      	renderer.setScissorTest ( true );
      	
      	camera.updateProjectionMatrix();
      	
      	cameraHelper.update();
      	cameraHelper.visible = false;
      	
      	renderer.render(scene, camera);
      	cameraHelper.visible = true;
      	
      	var view = views;
      	orthoCam = view.orthoCam;
      	orthoCam.left = testW / - 2;
      	orthoCam.right = testW / 2;
      	orthoCam.top = testH / 2;
      	orthoCam.bottom = testH / - 2;
      	orthoCam.position.x = view.eye[ 0 ];
      	orthoCam.position.y = view.eye[ 1 ];
      	orthoCam.position.z = view.eye[ 2 ];
      	orthoCam.rotation.x = view.direction[ 0 ] * Math.PI * 0.5;
      	orthoCam.rotation.y = view.direction[ 1 ] * Math.PI * 0.5;
      	orthoCam.rotation.z = view.direction[ 2 ] * Math.PI * 0.5;
      	orthoCam.updateProjectionMatrix();
      	
      	var left1   = Math.floor( testW  * view.left );
      	var bottom1 = Math.floor( testH * view.bottom );
      	var width1  = Math.floor( testW  * view.width );
      	var height1 = Math.floor( testH * view.height );
      	renderer.setViewport( left1, bottom1, width1, height1 );
      	renderer.setScissor( left1, bottom1, width1, height1 );
      	renderer.setScissorTest ( true );
      	renderer.shadowMap.enabled = true;
      	renderer.render( scene, orthoCam );
      }
      
      

      核心創建一個正交相機OrthographicCamera

      6、兼容判斷

      因為不是所有手機都支持webgl所以需要做一下兼容性的判斷。

      • 在ios8雖然支持webgl但是時間跟蹤clock不支持,但在不報錯。查看源碼的情況下估計是var newTime = ( performance || Date ).now()沒有得到正確的值。因為時間關系沒有過多的深入,所以頁面在ios8直接跳轉至2d版本。

      -getExtension('WEBGL_depth_texture')經過測試在一些安卓上返回為null,所以沒有用這個去做區分。

      兼容代碼如下所示:

      var canvas = document.createElement("canvas");
      var gl =  canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
      if( gl ){
      
        var OES_TextureExtension = gl.getExtension('OES_texture_half_float');
      
        var EXT_TextureExtension = gl.getExtension( 'EXT_texture_filter_anisotropic' );
      }
      
      if(gl && OES_TextureExtension && EXT_TextureExtension&& !(isIos && version < 9)) {
      
      	//..3d code
      
      }else {
      
      	//..2d code
      
      };
      
      

      TODO:

      雖然這個項目上線了,但是還有很多東西需要去細化完善- -!!。

      1. 更好的完成相機的移動

      2. 人物的動畫拆分

      3. 整個場景動畫優化

      之前用threejs做的一個小項目點擊這里查看

      最后附上體驗地址:

      posted @ 2016-12-29 10:42  At丶Sea  閱讀(4775)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 国产精品自拍午夜福利| 果冻传媒一区二区天美传媒| 在线观看热码亚洲AV每日更新| 尚义县| 亚洲成aⅴ人在线电影| 蜜桃视频一区二区三区四| 久草网视频在线观看| 亚洲精品中文字幕二区| 国产福利永久在线视频无毒不卡| 精品无码国产不卡在线观看| 亚洲综合成人一区二区三区| 国产精品大片中文字幕| 亚洲精品免费一二三区| 天堂va欧美ⅴa亚洲va在线| 丝袜美腿视频一区二区三区| 亚洲国产一区二区三区| 国产精品美女久久久久久麻豆| 亚洲五月天综合| 亚洲第一视频区| 人妻饥渴偷公乱中文字幕| 一区二区三区精品不卡| 日韩精品一二区在线观看| 五月天国产成人av免费观看| 日本一道一区二区视频| 亚洲国产精品自产拍久久| 国产SM重味一区二区三区| 国产成人高清亚洲一区91| 欧美人与动欧交视频| 久久亚洲精品无码播放| 丰满高跟丝袜老熟女久久| 99久久婷婷国产综合精品青草漫画| 精品人妻免费看一区二区三区| 亚洲av无码精品色午夜蛋壳| 渭南市| 四虎永久免费影库二三区| 人人人澡人人肉久久精品| 日本免费观看mv免费版视频网站| 国内视频偷拍久久伊人网| 无码av最新无码av专区| 狠狠久久五月综合色和啪| 黄页网址大全免费观看|