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