最近遇到了一个很奇怪的bug,明明桌面坐标的初始原点,都设置ok了,但是模型还是有在空中漂浮的感觉,如下图所示。
- 将上图中的模型手动移动位置,可以将其移动到桌面上,同时看起来是放在桌面上。这说明模型的轴和桌面的法线是一致的,也就是说R是对的,只是T不对。
- 最开始我以为是 mean.x,mean.y,mean.z 作为桌面坐标的原点有问题,因为这个值是个平均值,造成了初始T有误。
- 后来我手动的选取深度图中桌面上的某一点,计算它相对于深度相机坐标系的位置,用这个位置作为初始T,也会出现上图的问题,这就让人摸不着头脑了。
就不讲我的思考过程了,直接说造成这个问题的结论。
首先,每个模型都有自己的bounding box,如下所示
Eigen::Vector3f minRender_1 = { 0.156,0.184,0.190 }, maxRender_1 = { 0.804,1.081,0.810 }; Eigen::Vector3f minRender_2 = { -0.145,0.190,-0.097 }, maxRender_2 = { 1.249,1.145,0.955 }; Eigen::Vector3f minRender_3 = { -0.240,-0.001,0.094 }, maxRender_3 = { 1.064,0.913,0.922 };
- 1
- 2
- 3
比如说
minRender_1
中的第二个参数0.184,说明这个物体的包围盒是从Nerf世界的0.184开始渲染,那Nerf模型放进Nerf世界后,它的初始Y轴位置就是0.184,如果我的虚拟相机的T[1](代表虚拟相机在虚拟世界的位置)是0.2的话,那物体看起来可不是像在空中飘着嘛。
同时还有一个可能,物体它自身与box的x_z平面之间,虽然是平行的,但是这部分有空隙,那也会造成物体在空中
最后还有可能,物体的某一部分是透明的,所以也会看起来物体飘着空中。
对于某个物体的相机视角而言,让它的相机T[1]+
minRender_1[1]
,这样物体的底部Box就是平的了,然后在给每个相机T[1]+1,这里的1是个常量,属于经验值。这样一来物体就比较像是在桌面上放着了。