亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2MEMobile3D入門教程系列文章之二

2019-11-18 16:05:06
字體:
來源:轉載
供稿:網友

  在這里我首先感謝大家對上一篇文章J2ME Mobile 3D入門教程系列文章之一的支持,也正是有了大家的支持,我決定把我的Mobile3D學習過程拿出來和大家共享,希望大家能一起來討論Mobile3D。
  
  在上一次的教程中我為您詳細的介紹了,在Moble3D中通過及時運算建立3D圖形,并且對從*.m3g文件中導入模型做了一個簡單的介紹,這次我想在這里通過*.m3g文件的使用簡單的介紹一下Mobile3D對動畫的控制,以及對模型的一些操作。
  
  首先我來簡單的說一下m3g文件的建立,這個其實很簡單,你只需要選擇一種你所熟悉的3D圖形制作軟件,并安裝對應的插件即可,在這里我使用的軟件是Maya和3DS MAX,插件使用的是H3T EXPort Plugin,該插件有maya和3ds max的,同時還需要下載一個軟件M3G Tools kit。
  
  這些都可以從Sony EriCSSon的網站上找到連接。插件的安裝應該都沒問題吧。插件安裝完成后,就可以建立模型、設置材質帖圖、設置攝影機、設置關鍵幀等等了,最后只要輸出成H3T文件即可。然后再打開M3G Tools kit將h3t文件輸出成m3g文件就可以了。在使用m3g文件之前最好用M3G Tools kit瀏覽一下該文件,為的是記錄對應的信息,例如userid和該場景的樹狀結構等信息,這些都是非常重要的。如果你這樣做了,你會發現這樣導出的m3g文件中camera并沒有在world樹下,而是和world樹是平級的。
  
  其實上一篇文章中我也說過,camera和渲染信息可以不被放在world樹下,但是所有的模型信息必須被放到樹下。當我們看m3g文件的時候比較重要的是看清楚world節點所在的位置,以及需要我們操作的模型的userid。
  
  準備工作差不多了,現在來看Mobile3D吧,在上一文章中我說過m3g文件使用通過javax.microedition.m3g.Loader.load(String url)載入的,而且該方法返回的是javax.microedition.m3g.Object3D的數組,也許有人要問既然world是根節點,那么為什么不直接返回一個World呢?
  
  剛才讓大家看m3g文件的結構的時候就已經說明了攝影機和動畫設定等等并沒有被放到World為節點的書中,而是和World節點同級的。而World節點是場景的根節點才對。那么我們如何才正確的取出World節點呢?方法有兩個:
  
  1、遍歷該Object3D數組,并比較每個元素的userid如果正式World節點的useid將該元素取出。
  
  2、遍歷該Object3D數組,并比較每個元素是不是World類的實例,那么既然World節點是場景的根節點,那么在該Object3D數組中也應該只有一個World類的實例對象。
  
  第一個方法比較簡單,我在這里只給出第二個方法的片斷代碼。(其實是一樣的)
  
  PRivate void loadWorld(){
  System.out.println("now loading...");
  try{
  buffer=Loader.load("/img/TmpMicroFile.m3g");
  for(int i=0;i  if(buffer[i] instanceof World){
  world=(World)buffer[i];
  return ;
  }
  }
  }catch(Exception e){
  buffer=null;
  System.out.println("thorw a exception when loading");
  e.printStackTrace();
  }
  }
  
  然后我們設置攝影機,不同的是,這次我們從World中獲得攝影機信息,獲取后我們可以對其進行一些基本的設置這里不細說了。下面著重的說一下動畫的部分。
  
  在我們導入這個m3g文件時候我們其實已經有了動畫的信息了,并且這些動畫信息有可能是很復雜的,我測試了連桿兩軸的運動可以沒問題,從一些資料上看到的IK反向運動也沒有問題。也許你已經著急了,怎么還不說如何控制動畫的播放呢?
  簡單的說World.animate()來更新動畫信息,這個方法需要傳進去一個int類型的參數,當你第一次調用該方法的時候,系統會記錄下這個數值,后面每次調用的時候都會和這個數值相比較,然后系統替我們計算出動畫更新到什么位置,同時該方法會返回一個int類型的參數,這個參數表示的下一次更新的一個建議的數值(是以毫秒為單位的)。
  
  我們這時就可以讓調用這個方法的線程休眠這個時間,以便下以次更新動畫數據。這里也許你會有疑問,我的動畫明明只有幾十幀,可是這里卻反復的播放;這雖然是個好消息,但在有很多情況播放的長度、什么時候播放,都需要我們自己來控制怎么辦?
  
  這時候我們就需要用到javax.microedition.m3g.AnimationController類了,其實每個動畫中的每個可以動的模型都有自己的AnimationController對象,和模型動畫一樣我們可以通過World.find(int controllerID)來獲得,在該類中我們可以通過setActiveInterval(int activeTime,int unactiveTime)來設定動畫在該系統中播放的起始和重點時間,另外通過setPosition(int startTime,int endTime)方法控制這個動畫需要播放哪一段落。
  
  很抱歉有關兩個方法的時候在這次教程實例中我并沒有使用,不過如果您想了解關于這兩個方法的使用,我建議你看看WTK2.2的那個Demo3D中袋鼠的例子,那里面寫的挺詳細的。這里呢我給出動畫和繪制的代碼片斷吧。
  
  protected void paint(Graphics g) {
  
  startTime= System.currentTimeMillis() - worldStartTime;
  validity= world.animate((int)startTime);
  perFrameTime=(int)System.currentTimeMillis();
  
  g.setColor(0x00);
  g.fillRect(0,0,getWidth(), getHeight());
  
  g.setClip(0,0,getWidth(),getHeight());
  g3d.bindTarget(g,true,Graphics3D.DITHERGraphics3D.TRUE_COLOR);
  g3d.setViewport(0,0,getWidth(),getHeight());
  
  g3d.render(world);
  
  g3d.releaseTarget();
  
  framePor=(int)1000/((int)System.currentTimeMillis()-perFrameTime);
  
  System.out.println("3D demo frame/sn:"+framePor);
  
  if(validity < 1)
  { // The validity too small; allow a minimum of 1ms.
  validity = 1;
  }
  
  if(validity == 0x7fffffff)
  { // The validity is infinite; scehdule a refresh in 1 second.
  validity=1000;
  }
  
  }
  
  public void run() {
  while(isRun){
  repaint();
  try{
  Thread.sleep(validity);
  }catch(Exception e){}
  }
  }
  
  這里如果你不喜歡使用線程的話,你可以換成Timer。個人喜好問題吧,我對線程比較熟悉,所以這里我使用的是線程。
  
  動畫似乎我現在也只理解到這些,全部和大家共享出來了。下面我想說一說Transformable類中的幾個方法。首先來介紹一下Transformable類吧。Transformable類是很重要的一個類,Node就是它的子類,知道它的重要性了吧。
  
  Transformable中有四個方法是今天我要簡單說一下的postRotate(float, float, float, float)放是和物體的旋轉有關系的在Mobile3D中默認所有的物體的旋轉軸都在自身的中心,所以對物體進行旋轉操作的話,一定是自轉,而不是繞某個點、或某個軸公轉,這一點一定要弄清楚。也許這樣說有些抽象那么我換個說法,就是這里的旋轉只改變物體的朝向,并不改變物體的位置。
  
  這下明白了吧,也許有人要問“這不正是我們需要的嗎?為什么要強調呢?”原因其實是這樣的,在有的3D引擎中,旋轉是以原點為基礎的。也就是說如果需要做自轉運動,就必須做移動、再旋轉、再移動這樣的操作,其實這樣做的好處是可以方便點的運算,因為點不存在自轉的概念。而我們的Mobile3D在某種程度上說是不可以對點操作的,所以它的最小單位是Mesh,那么它如何實現自轉呢?來看個矩陣你就明白了
  
  90,0,0,0
  0,0,0,0
  0,0,1,0
  0,0,0,0
  
  這個矩陣表示的當前的模型在Y軸上有90度的旋轉?,F在我們回頭來看看postRotate(float a, float x, float y, float z)方法,其中有4個參數,第一個就是這次需要旋轉的角度,后三個其實一個這次旋轉的軸,是通過一個向量來表示的,postRotate方法就是在原來的朝向上繼續進行新的旋轉,如果用數學公式來表示的話就是使用原有的矩陣乘以
  
  a,0,0,0
  0,x,0,0
  0,0,y,0
  0,0,0,z
  
  這個矩陣就是新的方向矩陣。這個方法如果從數學角度聽起來很難理解的話,你只要記住四個參數第一個是這次旋轉的角度,后三個確定旋轉軸。
  同postRotate方法類似的是setOrientation(float a, float x, float y, float z)。不同的是這次不再是旋轉了而是直接設置到這個朝向。
  
  說過旋轉再來看看移動,這個似乎就簡單很多了translate(float x, float y, float z)這個就是指按照指定的向量平移;setTranslation(float x, float y, float z)這個更簡單了,直接移動到指定的位置。
  
  其實還有一個方法scale(float sx, float sy, float sz)是用來進行縮放的,同樣還有setScale(float sx, float sy, float sz)直接設置比例尺,這個六個方法是對物體進行直接的操作的,非常有用,尤其是前四個,在編寫游戲的時候會經常用到,而后兩個使用的頻率似乎少一些,因為很多時候我們都是直接對攝像機的距離進行操作的(除非有特殊需要)。下面我給出個使用前四方法的舉例吧。
  
  public void keyPressed(int keycode){
  float[] camerTra;
  float x;
  float z;
  switch(keycode){
  case GameCanvas.DOWN:
  break;
  case GameCanvas.UP:
  break;
  case 52:
  dir=dir-2;
  System.out.println(dir);
  x=(float)(3*Math.sin((dir * 3.14159f)

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线| 在线日韩欧美视频| 国产手机视频精品| 26uuu日韩精品一区二区| 中文字幕亚洲欧美| 91成人国产在线观看| 欧美中文在线视频| 精品av在线播放| 国内久久久精品| 久久久久久久久网站| 69国产精品成人在线播放| 国产精品揄拍500视频| 人人澡人人澡人人看欧美| 国产精品久久婷婷六月丁香| 久久99精品久久久久久青青91| 成人春色激情网| 亚洲a∨日韩av高清在线观看| 欧洲成人午夜免费大片| 久久久久久久久久av| 国产小视频国产精品| 日韩在线视频免费观看高清中文| 中文字幕av一区二区三区谷原希美| 日韩欧美aaa| 亚洲男女自偷自拍图片另类| 国产日韩精品视频| 欧美激情视频网| 中文字幕亚洲精品| 国外色69视频在线观看| 日韩精品视频免费| 久久噜噜噜精品国产亚洲综合| 久久精视频免费在线久久完整在线看| 欧美洲成人男女午夜视频| 久久不射热爱视频精品| 国产精选久久久久久| 在线丨暗呦小u女国产精品| 91在线观看欧美日韩| 91精品国产91久久久久| 国产激情久久久久| 欧美成年人在线观看| 久久久久久久97| 久久久免费av| 久久久久久久久国产精品| 亚洲第一二三四五区| 欧美日韩精品中文字幕| 韩日欧美一区二区| 97在线视频免费| 欧美精品中文字幕一区| 久久天天躁夜夜躁狠狠躁2022| 国产日韩欧美综合| 成人一区二区电影| 91成人在线观看国产| www.欧美精品一二三区| 精品久久久一区二区| 尤物yw午夜国产精品视频| 亚洲最大成人免费视频| 超碰日本道色综合久久综合| 91影视免费在线观看| 欧美日韩国产成人在线观看| 一本色道久久88综合日韩精品| 草民午夜欧美限制a级福利片| 国产一区二区在线播放| 欧美午夜视频一区二区| 欧美黄色三级网站| 91情侣偷在线精品国产| 色偷偷av一区二区三区| 欧美成人中文字幕| 亚洲欧洲一区二区三区久久| 91亚洲精华国产精华| 中文字幕成人精品久久不卡| 久久免费国产精品1| 欧美在线免费看| 色综合久久88色综合天天看泰| 欧美黑人巨大精品一区二区| 亚洲永久免费观看| 中文字幕在线日韩| 欧美高清在线观看| 国产精品视频网站| 亚洲最大的免费| 欧美精品久久久久久久| 国产精品99久久久久久久久久久久| 亚洲精品av在线| 丁香五六月婷婷久久激情| 中文字幕成人精品久久不卡| 91免费国产视频| 亚洲999一在线观看www| 九九久久久久99精品| 日韩欧美成人免费视频| 97久久精品国产| 伦伦影院午夜日韩欧美限制| 欧美精品videosex极品1| 日韩精品一区二区三区第95| 欧美整片在线观看| 欧美第一黄网免费网站| 中文字幕一区二区精品| 日韩av在线免费观看| 欧美一级淫片播放口| 欧美精品少妇videofree| 色777狠狠综合秋免鲁丝| 成人免费视频97| 性欧美xxxx视频在线观看| 国产精品日韩av| 久久久久久国产精品美女| 国产精品美腿一区在线看| 欧美大胆在线视频| 欧美午夜女人视频在线| 懂色av中文一区二区三区天美| 欧美日韩另类视频| 懂色av影视一区二区三区| 亚洲精品动漫久久久久| 日韩欧美中文在线| 欧美亚洲国产日韩2020| 爽爽爽爽爽爽爽成人免费观看| 国产欧洲精品视频| 中文字幕在线亚洲| 91精品中文在线| 久热国产精品视频| 欧美激情第一页xxx| 成人福利视频网| 韩国精品久久久999| 日韩欧美国产一区二区| 欧美激情精品久久久久久免费印度| 亚洲一区www| 精品国产1区2区| 日韩黄在线观看| 55夜色66夜色国产精品视频| 中文欧美在线视频| 日韩欧美精品中文字幕| 色诱女教师一区二区三区| 久久久久久97| 久久成人这里只有精品| 国产精品一区二区在线| 亚洲深夜福利网站| 久久精品中文字幕| 92看片淫黄大片看国产片| 久久亚洲一区二区三区四区五区高| 国产亚洲欧洲高清| 成人网在线视频| 国产精品自在线| 国产在线观看精品一区二区三区| 97碰碰碰免费色视频| 久久99精品久久久久久琪琪| 俺去了亚洲欧美日韩| 亚洲国产成人精品久久久国产成人一区| 亚洲国产精品999| 国产91精品久久久久| 国产成人精品日本亚洲专区61| 国自产精品手机在线观看视频| 国产精品久久久久久久一区探花| 亚洲福利视频二区| 91精品久久久久久久久久另类| 久久久久久国产精品久久| 欧美午夜激情在线| 国产精品丝袜久久久久久不卡| 97超级碰在线看视频免费在线看| 欧美插天视频在线播放| 一区三区二区视频| 国产成人精品久久亚洲高清不卡| 在线成人激情黄色| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕综合在线| 这里只有精品久久| 三级精品视频久久久久| 亚洲老头同性xxxxx| 色yeye香蕉凹凸一区二区av|