现在的位置: 首页 > 综合 > 正文

Camera.translate的陷阱!问题解决了

2012年11月12日 ⁄ 综合 ⁄ 共 1486字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.