Blender踩坑记录

最近需要在NeRF提供的blender模型基础上提取出模型上一个三维空间点在各个视角下的对应的颜色以及direction。首先跟着B站教程学了一下blender python脚本(简称bpy,因为这是blender对应的python库)的使用方法。然后大致了解了一下blender的建模流程。然后找到空间中的某一个点利用bpy找到他在每一张图片的像素坐标。这里需要注意以下几点:

  • 需要选择的是点的全局坐标,因为blender中会有很多坐标系,不要找点的局部坐标。
  • 然后是投影的时候用相机的matrix_world属性,这对应的是c2w矩阵,取逆就可以把世界点投影到相机系下了,同时注意这里得到的c2w矩阵的最后一列代表相机在世界系下的位置,而blender自带的camera.location也是代表相机位置,但是代表的是相对父坐标系的相对位置而不是在世界系下的位置,所以采用c2w矩阵的最后一列代表相机在世界系下的位置。
  • 然后是利用投影矩阵投影到ndc坐标后,如果需要转换到像素坐标,首先对利用clip矩阵投影得到的clip坐标除以第四维度(z坐标)得到ndc坐标,此时的ndc坐标在[-1,+1]范围内,将其归一化到[0,1]之间然后乘上resolution映射到像素平面。这里需要注意的是因为ndc坐标系横轴是x向右是正方向然后纵轴是y向上是正方向,原点在中心;但是png图片横轴是x向右是正方向纵轴是y向下是正方向,原点在左上角,所以y轴正方向相反,归一化的时候针对x需要(1+ndcx)/2×resolution而针对y需要(1-ndcy)/2×resolution。最后是一个大坑,因为x代表横轴其实是列坐标,y轴代表纵轴其实是行坐标,所以xy要取反,即针对点(x,y)位置的点在从png图片读取的时候数组下标是[y][x]。

针对单个patch提取patch解决后需要在mesh上采样多个点然后提取patch一起训练。有两种思路,一种思路是提取出mesh后在mesh上采样,另一种思路是在blender的模型上采样。

  • 针对mesh采样的思路,有一个大坑是存成的mesh的顶点坐标是全局坐标但是blender中的y轴变成了mesh坐标中的z轴并取负数,blender中的z轴变成了mesh坐标中的y轴。
  • 针对blender模型中采样,因为lego模型他是由不同组件构成的,所以要遍历所有bpy.context.scene.object然后针对每一个object的obj.data.vertices得到顶点,然后在这些顶点中采样,需要注意的是这些顶点是局部坐标系下的顶点位置,所以要乘上object.matrix_world转换到世界坐标系,然后还有一个问题就是因为是逐物体遍历,所以对于体积小的物体采样点就会很密集,体积大的物体采样点就会很稀疏。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值