今天寫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了!