Closed luhaoaimama1 closed 8 years ago
有点别扭 那么X就有问题了。。。
这个图为啥不显示不懂,,,不过你点开能看
这个图是我的理解 但是为啥摄像机和 2D坐标系不是一个? 不旋转的摄像机的话 摄像机的头就不对着 2D坐标系原点了吧,
还有这个是右手坐标系。
这个是我 的 测试代码
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); // 在坐标原点绘制一个圆
}
}
concat
函数关联。translate
作用于坐标系,也就是视图,使用translate
方法后相机仍在坐标原点iv.animate().rotation(30).start();
2D坐标系也是有Z轴的 而且根据这个旋转就知道 是否是左右手坐标系
请问你这个项目在哪...我向整体运行下试试 这个光有这个代码 我有很多库都米有啊
CustomView引用自ViewSupport https://github.com/GcsSloop/ViewSupport 除此之外没有别的了。
好的 但是 你也可以运行下我的 我认为我的也没有错
运行完毕 我建议你在看看我说的 2D坐标系(iv.animate().rotation(30).start(); 这点可以证明) 其实是3D坐标系 摄像机坐标系 为什么旋转180是因为 他的镜头对着我们 所以旋转180 去看view 他旋转180以后坐标系就变成
最重要的他是 右手坐标系(也是通过 iv.animate().rotation(30).start(); 这点可以证明)啊 我的笔记 关于左右手坐标系的
rotateZ
和2D的旋转rotate
方向是相反的。3D相反 是因为 你那个不是3D坐标系 是 3D摄像机坐标系,我认为2D那个 是有3D坐标系的。不然 摄像机和 物体 不在一个坐标系上 怎么观察? X轴 右 Y下 Z内 。我认为Y是下的 你怎么判断的Y是上?
最后,我运行了你的代码,测试结果和我的预期相同,不晓得为啥会得出不同的结论。
3D相反 是因为 你那个不是3D坐标系 是 3D摄像机坐标系,我认为2D那个 是有3D坐标系的。不然 摄像机和 物体 不在一个坐标系上 怎么观察? X轴 右 Y下 Z内 。我认为Y是下的 你怎么判断的Y是上?
因为我认为他们公用一个坐标系 你不认为
ani.setY(500);
iv.startAnimation(ani);
这两行代码,你使用了camera的translate函数,让坐标系向y轴正方向移动了,导致图片上移。
摄像机 和 物体之间的运动是相反的啊 你 摄像机乡下500 物体上500没有不对啊
你用 正常动画 观察的 自然是对的 ,你用摄像机观察 的自然不太自然
translate并没有移动相机位置,不相信的话,你translate后,获取摄像机位置getLocationY
,看相机位置是否移动。
iv.animate().translationY(100).start(); 你用这个测试 看看 Y向哪里走
iv.animate().translationY(100).start();
这个使用的是2D坐标系,并不是3D,并且3D和2D是不同的
或许 getLocationY 没有移动,但是 view移动了, 其实跟view没有动, 摄像机动了一样 。因为这个是2D坐标系。才让他反过来运动。3D坐标系 仅仅是 靠 MPERSP_0 等来模拟的。但是我们可以把他当做3D坐标系 因为最终的感觉是一样的 我是这样认为的
如果用我刚刚的理解 这个 iv.animate().translationY(100).start(); 就是对的 摄像机 tran Y也是对的
你放一张纸,在纸上面画上坐标系,然后用手机后置摄像头拍摄,之后保持手机的不动,平移纸的位置,观察显示就行了。
想要移动摄像机位置需要使用setLocation
函数。
这个图为啥不显示不懂,,,不过你点开能看 我的实践发现的坐标系的图
我去试试 setLocation 毕竟这个我没用过。
我们做一个假设,假设3D使用的是右手坐标系,就是你发的这个,并且translate移动的是相机坐标系 当相机向x轴正方向移动的时候(左),View应当右移 [正确] 当相机向y轴正方向移动的时候(下),View应当上移 [正确] 当相机向z轴正方向移动的时候(外),由于摄像机默认位置是(0, 0, -8),正向移动接近View,显示应当变大 [错误]
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 移动 参考坐标系 :摄像机坐标系,
setLocation 我尝试了 没有问题 setLocationX(3)的时候 图像左边移动了 因为参考系是 摄像机坐标系3代表 左边。然后对照2D的 就没有问题了
不太明白,参考坐标系:2D既然左图
就是 左边的
我说的都是以这个图说的
3D的为啥setLocation
要参考左侧,translate
要参考右侧?
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
这个是官方文档
我看过官方文档啊,设置相机位置
但是我当初也说过 摄像机坐标系 的参考系 也是2D 既左图 为啥 旋转180 是因为 他摄像头 面对我们,旋转180 就 面对 View了 我是这么认为的 但是这时候 就会产生相对性。所以就是两个相对坐标系
当然这是我的认为 但是各种 方法我都尝试过了 发现 吻合
所以说两者都是摄像机坐标系??
我发微博咨询一下其他人的意见
恩恩 我认为 参考系 。平时的 咱们都是2D 但是有摄像机 摄像机就有两个了。
挺好的 三个臭皮匠定个诸葛亮 ~人多力量大
为啥我setLocationZ没啥反应啊 最后一个方法 transalte和 setLocation就全测试完了 可惜卡主了
我代码提交了 你可以更新下 多了一些setLocation方法的测试 但是为啥 Z就不变样子啊。。。 正负都设置了 不知道为啥 图像 表示 你动你的没我啥事
所有函数我都测试过,setLocationZ如果不旋转的话,对视图大小是不会产生影响的。
奥 原来如此 那就不考虑他了 ~ 当然知道你都测试过了 你很多篇博客我都很喜欢 看完很爽~感觉全会了哈哈
嗯,这一会儿大家应该都在等着下班放假呢,稍等一下,看看其他人的看法。
恩 那我先去工作去了 晚上的话估计不在 和大家去HAPPY~
我感觉我的却是有问题 研究下
为什么你会感觉错 因为 物体显示和摄像机的运动是相反的;