Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › 关于透视矩阵的参数
Tagged: 透视矩阵
- This topic has 6 replies, 3 voices, and was last updated 3 years ago by
Angus.
-
AuthorPosts
-
-
按照我的理解:(不一定正确,请老师指正)
1. MVP中的V矩阵是处理视角的位置+方向(框架代码中只有一个位置参数,方向固定为(0, 0, -1) )
2. P实现透视效果,定义视锥体为对称的四棱柱就保证了t=-b,l=-r(top=-bottom,left=-right)
3. 计算P需要的四个参数(fov、ratio、zNear、zFar)是用来表达对称四棱柱的宽扁程度(这四个参数在保证有意义的情况下任意变化,视锥体都是对称四棱柱),这四个参数应该与具体坐标系无关。不管是左手还是右手坐标系,P矩阵值都一样,都有 0 < zNear < zFar
4. 有一节课老师留了一个问题,视锥体压缩成长方体,内部点的深度是靠近zNear还是zFar,我算出来在(z+f)/2点,zafter/zbefore > 1,深度值变大,由于zNear<zFar,所以我得到的答案是靠近zFar(远平面),不知道对不对
5. 关于问题1,框架提供的V矩阵如下:
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos) {
Eigen::Matrix4f view = Eigen::Matrix4f::Identity();
Eigen::Matrix4f translate;
translate << 1,0,0,-eye_pos[0],
0,1,0,-eye_pos[1],
0,0,1,-eye_pos[2],
0,0,0,1;
view = translate*view;
return view;
}
这里矩阵对应的是视角位置在eye_pos,看向z负半轴
如果改成位置在eye_pos,看向z正半轴,对应矩阵应该是:
-1, 0, 0, eye_pos[0],
0, 1, 0, -eye_pos[1],
0, 0, -1, eye_pos[2],
0, 0, 0, 1, -
1.view transformation就是处理摄像机的位置和方向,约定俗成的位置和方向就是摄像机在原点,方向朝向z轴负向(右手坐标系),所以对于任何一个位置的摄像头我们都要把它移到规定的位置和方向,为了保证你观测正确,我们要对物体做同样的变换。代码里的摄像机位置是(0,0,5)方向就是(0,0,-1)朝向z轴负向,所以只需平移回去就好。
2,3.按照我们规定的摄像机的位置和方向,自然就有一个坐标系(摄像机在坐标系的原点),根据这个坐标系去理解视锥。因为近面离摄像机近,所以应该是zFar < zNear < 0。
4.是远离了,计算过程我是按照我上面理解的去算的,不过我有个不明白的这里的z值远离了摄像机,有什么意义,再经过正交变换,然后投影不就把z轴去掉了吗?求解答。。。
5.改成位置在eye_pos,看向z正半轴的话,应该先平移再旋转,平移矩阵:
1,0,0,-eye_pos[0],
0,1,0,-eye_pos[1],
0,0,1,-eye_pos[2],
0,0,0,1
旋转矩阵:
1,0,0,0
0,1,0,0
0,0,-1,0
0,0,0,1
最终的view变换矩阵=旋转x平移:
1,0,0,-eye_pos[0],
0,1,0,-eye_pos[1],
0,0,-1,eye_pos[2],
0,0,0,1
上面都是我自己的理解,可能也有不对的地方…-
我觉得你说的挺有道理,不过,zFar<zNear<0这一点似乎有点问题,因为在框架代码中参数传递的zFar是50,zNear是0.1,那么问题出在哪里?框架代码用的左手系并且默认视角方向是z正轴?
左手系+z正轴也说不通,三角形顶点放在世界坐标的z为-2和-5处,视角位置在z为5的地方,默认看向正轴就看不到东西了或者看到z为-5的覆盖z为-2的。。。-
Emmm,不好意思没仔细看代码,代码里传入的zNear和zFar应该就是单纯的指与摄像机的距离,是恒正的。。
-
这里应该不是。代码里的就是实际的n,f值,可以设置为负数(参考作业二中助教补充的修正为右手坐标系的一系列操作)。
-
-
-
-
我的理解:z值虽然正交投影会去掉,但是真实的渲染流程中还有一步裁剪,z值超过范围的都裁剪掉了,我们的作业框架似乎没有这一步,导致z不管多少都会看到
-
-
-
AuthorPosts
- You must be logged in to reply to this topic.