You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NeRF中get_rays函数逐行代码功能与运行逻辑咨询

NeRF get_rays 函数逐行功能解释

get_rays 是NeRF管线中生成相机采样光线的核心函数,输入为图像高度H、宽度W、相机焦距focal、相机到世界的变换矩阵c2w(即相机位姿),输出当前视角下每个像素对应射出光线的原点rays_o与方向向量rays_d。

以下是逐行代码解释:

  • 函数定义行
def get_rays(H,W , focal, c2w): #c2w is pose

输入参数说明:

  • H:输出图像的高度(像素数)

  • W:输出图像的宽度(像素数)

  • focal:相机内参的焦距值

  • c2w:3×4的相机位姿矩阵,前3列为相机坐标系转世界坐标系的旋转分量,第4列为相机光心在世界坐标系下的平移坐标

  • 像素坐标网格生成行

i, j = tf.meshgrid(tf.range(W, dtype=tf.float32), tf.range(H, dtype=tf.float32), indexing='xy') 

生成和图像维度匹配的像素坐标网格:

  • 先生成宽度方向0到W-1的横坐标序列、高度方向0到H-1的纵坐标序列

  • 采用indexing='xy'的笛卡尔坐标索引逻辑,输出两个H×W的二维张量:i中每个位置存储对应像素的横向坐标,j中每个位置存储对应像素的纵向坐标

  • 相机坐标系光线方向计算行

dirs = tf.stack([(i-W*.5)/focal, -(j-H*.5)/focal, -tf.ones_like(i)], -1)                

计算相机坐标系下每个像素对应的光线方向,遵循OpenGL相机约定:相机朝-z轴观测,y轴向上、x轴向右:

  • i-W*.5、j-H*.5将像素坐标平移到以图像中心为原点

  • 除以焦距focal,将像素单位的坐标转换为相机坐标系下的平面坐标

  • 纵坐标前加负号,是因为图像像素的j值从上到下递增,和相机坐标系y轴向上的方向相反

  • 最后一维固定为-1,对应相机朝向-z轴的设定,最终拼接得到H×W×3的相机坐标系方向张量dirs

  • 方向向量坐标系转换行

rays_d = tf.reduce_sum(dirs[..., np.newaxis, :] * c2w[:3,:3], -1)     

将相机坐标系下的光线方向转换到世界坐标系:

  • c2w[:3,:3]是位姿矩阵中的3×3旋转分量,负责将相机坐标系向量映射到世界坐标系

  • 给dirs新增维度后和旋转矩阵逐元素相乘再按最后一维求和,本质是完成向量与旋转矩阵的乘法运算,得到H×W×3的世界坐标系光线方向张量rays_d

  • 光线原点生成行

rays_o = tf.broadcast_to(c2w[:3,-1], tf.shape(rays_d))

生成所有光线的原点张量:

  • c2w[:3,-1]是位姿矩阵中的平移分量,即相机光心在世界坐标系下的坐标,同一视角下所有光线的原点都是该位置

  • 用广播操作将长度为3的光心坐标,扩展为和rays_d维度一致的H×W×3张量,每个像素对应的光线原点都指向同一个相机光心

  • 返回行

return rays_o, rays_d

返回世界坐标系下的光线原点、光线方向张量,后续用于光线采样、体渲染计算像素颜色。

内容的提问来源于stack exchange,提问作者thebigjuicyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 02:15:01