Camera.translate的陷阱!問題解決了

來源:互聯網
上載者:User

今天寫billboard的測試程式
在處理鏡頭轉動時
按左鍵 camera.postRotate(deltaAngle, 0.0f, 1.0f, 0.0f);
按右鍵 camera.postRotate(-deltaAngle, 0.0f, 1.0f, 0.0f);

這樣卻不行!

鏡頭經常會時好時壞,有時可以正常轉動,有時就會出現莫名其妙的問題了。。這是問題一

後來我把繞Y軸的鏡頭處理成為

if (isKeyLeftPressed()) {
   camAngleY += deltaAngle;
   if(camAngleY >= 360.0f) {
    camAngleY -= 360.0f;
   }
   
   rotateCamY();
  }

private void rotateCamY() {
  camera.getCompositeTransform(tTemp);

  tTemp.get(matrixs);
  unitVector[0] = matrixs[3];
  unitVector[1] = matrixs[7];
  unitVector[2] = matrixs[11];
  
  tCamera.setIdentity();
  tCamera.postTranslate(unitVector[0], unitVector[1], unitVector[2]);
  tCamera.postRotate(camAngleY, 0.0f, 1.0f, 0.0f);
 }

從理論上來說,沒有任何問題吧
但實際中就是不行
我鬱悶阿
把每一步的矩陣都列印出來,觀察了半天
突然發現rotateCamY()從進去到出來的結果都是對的
但下一次進去後結果就會比上次出來的結果矩陣有一個translate(0.0f, 3.0f, 10.0f)這樣的操作
我恍然大悟!
在我loadCamera(),
camera.translate(0.0f, 3.0f, 10.0f);
world.addChild(camera);
現在看來,在每次rotateCamY()這個操作之後camera.translate(0.0f, 3.0f, 10.0f);會偷偷地執行
我暈。。這不是坑人嗎?可能是API哪個部分我還沒注意看到

看來這種方法也不行

第三種方法:
在看了幾個M3G例子之後
我開始用
cameraGroup.addChild(camera);
cameraGroup.translate(0.0f, 3.0f, 10.0f);
world.addChild(cameraGroup);

果不其然,這樣就正常了!

結論:一定要用個Group來儲存Camera

---------------------------------------updated 2007/01/18------------------------------------------------------

現在來看這篇文章,當真幼稚無比

我因為在構造camera時進行了translate操作,這導致了camera的位置並不是在它座標系的中心了,

假設camera新的位置是(0, 5, 10)

因此camera.rotate就會沿著原點(0,0,0)來進行旋轉

當然,結果會異常了!

如果要想繞著自身中心旋轉

就需要transform.rotate,然後camera.setTransform

同樣的道理,在平移時

如果我使用camGroup.translate,這就是造成camGroup沿著其父座標系的軸進行平移,也就是world座標系的平移

如果我們想要在相機這個局部座標系進行平移的話,就需要

camera.translate了!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.