GcsSloop / AndroidNote

安卓学习笔记
http://www.gcssloop.com/#blog
9.17k stars 2.14k forks source link

摄像机博文 3D坐标系 Y应该是和2D的一样 #44

Closed luhaoaimama1 closed 8 years ago

luhaoaimama1 commented 8 years ago

为什么你会感觉错 因为 物体显示和摄像机的运动是相反的;

luhaoaimama1 commented 8 years ago

有点别扭 那么X就有问题了。。。

luhaoaimama1 commented 8 years ago

这个图为啥不显示不懂,,,不过你点开能看

这个图是我的理解 但是为啥摄像机和 2D坐标系不是一个? 不旋转的摄像机的话 摄像机的头就不对着 2D坐标系原点了吧,

luhaoaimama1 commented 8 years ago

还有这个是右手坐标系。

luhaoaimama1 commented 8 years ago

这个是我 的 测试代码

GcsSloop commented 8 years ago

测试3D坐标系正方向

public class MatrixCameraTest extends CustomView {
    public MatrixCameraTest(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 测试X轴正方向(canvas);
        // 测试Y轴正方向_不显示(canvas);
        // 测试Y轴正方向(canvas);
        测试Z轴正方向_缩小(canvas);

    }

    /**
     * 测试z轴正方向,正方向是垂直屏幕向内,向正方向移动表示远离相机,内容缩小
     * @param canvas
     */
    private void 测试Z轴正方向_缩小(Canvas canvas) {
        // 相机默认位置(左上角) 测试x轴正方向
        Camera camera = new Camera();
        camera.translate(0,0,200);      // 将坐标系向z轴正向平移200个单位

        Matrix matrix = new Matrix();
        camera.getMatrix(matrix);

        mDeafultPaint.setColor(Color.GRAY);
        canvas.drawCircle(0,0,100,mDeafultPaint);   // 在坐标原点绘制一个圆

        canvas.concat(matrix);          // 使用concat连接Canvas

        mDeafultPaint.setColor(Color.RED);
        canvas.drawCircle(0,0,100,mDeafultPaint);   // 在坐标原点绘制一个圆
    }

    /**
     * 由于matrix的2D坐标系和Camera的3D坐标系通过 concat 函数进行来关联,两者是相互联系的,平移2D坐标系会联动平移3D
     * @param canvas
     */
    private void 测试Y轴正方向(Canvas canvas) {
        // 相机默认位置(左上角) 测试y轴正方向
        canvas.translate(mViewWidth/2,mViewHeight/2);   // 平移坐标系到屏幕中心
        CanvasAidUtils.draw3DCoordinateSpace(canvas);   // 绘制辅助坐标系

        Camera camera = new Camera();
        camera.translate(0,200,0);      // 将坐标系向y轴正向平移200个单位

        Matrix matrix = new Matrix();
        camera.getMatrix(matrix);

        canvas.concat(matrix);          // 使用concat连接Canvas

        canvas.drawCircle(0,0,100,mDeafultPaint);   // 在坐标原点绘制一个圆
    }

    private void 测试Y轴正方向_不显示(Canvas canvas) {
        // 相机默认位置(左上角) 测试y轴正方向-不显示
        Camera camera = new Camera();
        camera.translate(0,200,0);      // 将坐标系向y轴正向平移200个单位

        Matrix matrix = new Matrix();
        camera.getMatrix(matrix);

        canvas.concat(matrix);          // 使用concat连接Canvas

        canvas.drawCircle(0,0,100,mDeafultPaint);   // 在坐标原点绘制一个圆
    }

    /**
     * 由于y轴正方向向上,坐标原点移动后在屏幕外,所以不显示
     * @param canvas
     */
    private void 测试X轴正方向(Canvas canvas) {
        // 相机默认位置(左上角) 测试x轴正方向
        Camera camera = new Camera();
        camera.translate(200,0,0);      // 将坐标系向y轴正向平移200个单位

        Matrix matrix = new Matrix();
        camera.getMatrix(matrix);

        canvas.concat(matrix);          // 使用concat连接Canvas

        canvas.drawCircle(0,0,100,mDeafultPaint);   // 在坐标原点绘制一个圆
    }
}
GcsSloop commented 8 years ago
luhaoaimama1 commented 8 years ago

iv.animate().rotation(30).start(); 2D坐标系也是有Z轴的 而且根据这个旋转就知道 是否是左右手坐标系

luhaoaimama1 commented 8 years ago

请问你这个项目在哪...我向整体运行下试试 这个光有这个代码 我有很多库都米有啊

GcsSloop commented 8 years ago

CustomView引用自ViewSupport https://github.com/GcsSloop/ViewSupport 除此之外没有别的了。

luhaoaimama1 commented 8 years ago

好的 但是 你也可以运行下我的 我认为我的也没有错

luhaoaimama1 commented 8 years ago

运行完毕 我建议你在看看我说的 2D坐标系(iv.animate().rotation(30).start(); 这点可以证明) 其实是3D坐标系 摄像机坐标系 为什么旋转180是因为 他的镜头对着我们 所以旋转180 去看view 他旋转180以后坐标系就变成

luhaoaimama1 commented 8 years ago

最重要的他是 右手坐标系(也是通过 iv.animate().rotation(30).start(); 这点可以证明)啊 我的笔记 关于左右手坐标系的

GcsSloop commented 8 years ago
luhaoaimama1 commented 8 years ago

3D相反 是因为 你那个不是3D坐标系 是 3D摄像机坐标系,我认为2D那个 是有3D坐标系的。不然 摄像机和 物体 不在一个坐标系上 怎么观察? X轴 右 Y下 Z内 。我认为Y是下的 你怎么判断的Y是上?

GcsSloop commented 8 years ago

最后,我运行了你的代码,测试结果和我的预期相同,不晓得为啥会得出不同的结论。

luhaoaimama1 commented 8 years ago

3D相反 是因为 你那个不是3D坐标系 是 3D摄像机坐标系,我认为2D那个 是有3D坐标系的。不然 摄像机和 物体 不在一个坐标系上 怎么观察? X轴 右 Y下 Z内 。我认为Y是下的 你怎么判断的Y是上?

luhaoaimama1 commented 8 years ago

因为我认为他们公用一个坐标系 你不认为

GcsSloop commented 8 years ago
ani.setY(500);
iv.startAnimation(ani);

这两行代码,你使用了camera的translate函数,让坐标系向y轴正方向移动了,导致图片上移。

luhaoaimama1 commented 8 years ago

摄像机 和 物体之间的运动是相反的啊 你 摄像机乡下500 物体上500没有不对啊

luhaoaimama1 commented 8 years ago

你用 正常动画 观察的 自然是对的 ,你用摄像机观察 的自然不太自然

GcsSloop commented 8 years ago

translate并没有移动相机位置,不相信的话,你translate后,获取摄像机位置getLocationY,看相机位置是否移动。

luhaoaimama1 commented 8 years ago

iv.animate().translationY(100).start(); 你用这个测试 看看 Y向哪里走

GcsSloop commented 8 years ago

iv.animate().translationY(100).start(); 这个使用的是2D坐标系,并不是3D,并且3D和2D是不同的

luhaoaimama1 commented 8 years ago

或许 getLocationY 没有移动,但是 view移动了, 其实跟view没有动, 摄像机动了一样 。因为这个是2D坐标系。才让他反过来运动。3D坐标系 仅仅是 靠 MPERSP_0 等来模拟的。但是我们可以把他当做3D坐标系 因为最终的感觉是一样的 我是这样认为的

luhaoaimama1 commented 8 years ago

如果用我刚刚的理解 这个 iv.animate().translationY(100).start(); 就是对的 摄像机 tran Y也是对的

GcsSloop commented 8 years ago

你放一张纸,在纸上面画上坐标系,然后用手机后置摄像头拍摄,之后保持手机的不动,平移纸的位置,观察显示就行了。 想要移动摄像机位置需要使用setLocation函数。

luhaoaimama1 commented 8 years ago

这个图为啥不显示不懂,,,不过你点开能看 我的实践发现的坐标系的图

luhaoaimama1 commented 8 years ago

我去试试 setLocation 毕竟这个我没用过。

GcsSloop commented 8 years ago

我们做一个假设,假设3D使用的是右手坐标系,就是你发的这个,并且translate移动的是相机坐标系 当相机向x轴正方向移动的时候(左),View应当右移 [正确] 当相机向y轴正方向移动的时候(下),View应当上移 [正确] 当相机向z轴正方向移动的时候(外),由于摄像机默认位置是(0, 0, -8),正向移动接近View,显示应当变大 [错误]

luhaoaimama1 commented 8 years ago

translate : * Applies a translation transform on all three axis. * * @param x The distance to translate by on the X axis * @param y The distance to translate by on the Y axis * @param z The distance to translate by on the Z axis */ 参考坐标系:2D既然左图

setLocation 移动 参考坐标系 :摄像机坐标系,

luhaoaimama1 commented 8 years ago

setLocation 我尝试了 没有问题 setLocationX(3)的时候 图像左边移动了 因为参考系是 摄像机坐标系3代表 左边。然后对照2D的 就没有问题了

GcsSloop commented 8 years ago

不太明白,参考坐标系:2D既然左图

luhaoaimama1 commented 8 years ago

就是 左边的

luhaoaimama1 commented 8 years ago

我说的都是以这个图说的

GcsSloop commented 8 years ago

3D的为啥setLocation要参考左侧,translate要参考右侧?

luhaoaimama1 commented 8 years ago

translate :

setLocation

Sets the location of the camera. The default location is set at 0, 0, -8. @param x The x location of the camera @param y The y location of the camera @param z The z location of the camera

这个是官方文档

GcsSloop commented 8 years ago

我看过官方文档啊,设置相机位置

luhaoaimama1 commented 8 years ago

但是我当初也说过 摄像机坐标系 的参考系 也是2D 既左图 为啥 旋转180 是因为 他摄像头 面对我们,旋转180 就 面对 View了 我是这么认为的 但是这时候 就会产生相对性。所以就是两个相对坐标系

luhaoaimama1 commented 8 years ago

当然这是我的认为 但是各种 方法我都尝试过了 发现 吻合

GcsSloop commented 8 years ago

所以说两者都是摄像机坐标系??

GcsSloop commented 8 years ago

我发微博咨询一下其他人的意见

luhaoaimama1 commented 8 years ago

恩恩 我认为 参考系 。平时的 咱们都是2D 但是有摄像机 摄像机就有两个了。

luhaoaimama1 commented 8 years ago

挺好的 三个臭皮匠定个诸葛亮 ~人多力量大

luhaoaimama1 commented 8 years ago

为啥我setLocationZ没啥反应啊 最后一个方法 transalte和 setLocation就全测试完了 可惜卡主了

luhaoaimama1 commented 8 years ago

我代码提交了 你可以更新下 多了一些setLocation方法的测试 但是为啥 Z就不变样子啊。。。 正负都设置了 不知道为啥 图像 表示 你动你的没我啥事

GcsSloop commented 8 years ago

所有函数我都测试过,setLocationZ如果不旋转的话,对视图大小是不会产生影响的。

luhaoaimama1 commented 8 years ago

奥 原来如此 那就不考虑他了 ~ 当然知道你都测试过了 你很多篇博客我都很喜欢 看完很爽~感觉全会了哈哈

GcsSloop commented 8 years ago

嗯,这一会儿大家应该都在等着下班放假呢,稍等一下,看看其他人的看法。

luhaoaimama1 commented 8 years ago

恩 那我先去工作去了 晚上的话估计不在 和大家去HAPPY~

luhaoaimama1 commented 8 years ago

我感觉我的却是有问题 研究下