3D动画实现原理

来源:互联网 发布:博客怎么做网络推广 编辑:程序博客网 时间:2024/04/28 00:45

   
    通过变换矩阵,我们可以实现大多数的动画效果,不过这种方式,大多实现的是一种2D效果,如果向实现三维空间中的效果又什么方法呢?
    下面就为大家介绍Camera类,中文意思是摄像头,当然这个指的可不是我们手机上那个照相用的那个摄像头,这是一个逻辑概念,
    把我们手机的屏幕比作摄像头窗口,透过这个窗口,我们看到里面显示的东西(就是我们应用的界面),
    当然如果我们从不同的角度来看屏幕中的物体,自然就会呈现出一种立体效果,这里所说的不同角度是什么意思呢,比如桌子上有一个杯子,
    我们从正面看它是一个样,从后面看又是一个样,从上面看又是另一个样。
      这个概念应该不难理解,而Camera类就是用来做这个事情的,来看看下面这段代码:
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float fromDegrees = mFromDegrees;
        float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

        final float centerX = mCenterX;
        final float centerY = mCenterY;
        final Camera camera = mCamera;

        final Matrix matrix = t.getMatrix();

        camera.save();
        if (mReverse) {
            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
        } else {
            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
        }
        camera.rotateY(degrees);
        camera.getMatrix(matrix);
        camera.restore();

        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);
    }
首先我们得到了一个变换矩阵,camera.save() 这句话是将当前的摄像头位置保存下来,以便变换进行完成后恢复成原位,接下来调用camera.translate
,这个方法接受3个参数,分别是x,y,z三个轴的偏移量,我们这里只将z轴进行了偏移,已开始的偏移是3000,随着时间的推移,这个偏移会越来越小。
这就会形成这样一个效果,我们的View从一个很远的地方向我们移过来,越来越近,最终移到了我们的窗口上面~
      camera.rotateY(360 * interpolatedTime) 这句话,是给我们的View加上旋转效果,在移动的过程中,视图还会移Y轴为中心进行旋转。
      随后的 camera.getMatrix(matrix) ,这个是将我们刚才定义的一系列变换应用到变换矩阵上面,调用完这句之后,我们就可以将camera的位置恢复了,
      以便下一次再使用。接下来的调用上一篇中已经介绍过了,就不再赘述了~,完成这段代码之后,我们就可以看到3D动画效果拉~