ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Rerun `ViewCoordinates` 坐标约定编码类型全解析:从 `ViewDir` 六个方向到 3D 视图与相机坐标系

Rerun `ViewCoordinates` 坐标约定编码类型全解析:从 `ViewDir` 六个方向到 3D 视图与相机坐标系 RerunViewCoordinates坐标约定编码类型全解析从ViewDir六个方向到 3D 视图与相机坐标系【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunViewCoordinates是 Rerun 中用于描述三维坐标取向约定的编码Encoding类型它规定三个正坐标轴分别指向哪个方向是相机Pinhole朝向与 3D 视图姿态控制的核心数据载体。本文以 docs/content/reference/types/encodings/view_coordinates.md 为骨架结合 re_sdk_types、re_tf 等实现源码与 transforms.md 使用文档带你理解其数据模型、Arrow 存储格式、48 个三字母常量与左右手系判定机制并掌握在 Python / Rust / C 中正确配置 3D 视图与相机朝向的实战方法。一、类型定位与核心语义ViewCoordinates是一种编码Encoding类型其定义文档位于 view_coordinates.def.rs官方定义为An orientation convention for three-dimensional coordinates.三维坐标的取向约定其语义要点有三三个方向始终按[x, y, z]顺序排列分别指定三个正轴X、Y、Z各自指向的方向方向用ViewDir枚举描述即Up/Down/Left/Right/Forward/Back六个抽象方向左右手系有严格限制文档明确警告 Rerun does not yet support left-handed coordinate systemsRerun 目前尚不支持左手坐标系对应 issue #5032左手系常量虽然存在但会被拒绝使用。类型定义文件同时标注了该类型处于unstable不稳定状态#[rerun(state unstable)]即可能在未来的版本中以不向后兼容的方式发生变化。一个具体例子文档给出了最直观的示例[Right, Down, Forward]表示 X 指向右Right、Y 指向下Down、Z 指向前Forward。这种以「轴方向命名」而不是「数值向量」的方式让坐标约定具备极强的可读性——你不需要记忆任何矩阵或旋转四元数只需用三个英文单词描述轴朝向即可。二、底层ViewDir枚举六个抽象方向ViewCoordinates的组成单元是ViewDir枚举其定义位于 view_dir.def.rs/// The six cardinal directions for 3D view-space. #[repr(u8)] #[rerun(state stable)] pub enum ViewDir { Up 1, // 上 Down 2, // 下 Right 3, // 右 Left 4, // 左 Forward 5, // 前 Back 6, // 后 }值得注意的两点抽象的、与数值无关的方向定义文档明确指出 these are abstract directions and do on their own not correspond to any specific coordinate system or numerical values即单个ViewDir本身不绑定任何具体坐标系或数值只有三个方向组合成ViewCoordinates后才构成一个完整的坐标系约定。枚举值为稳定的u8编码Up1、Down2、Right3、Left4、Forward5、Back6这正是后面 ArrowUInt8序列化编码所对应的原始数值。在 Rust 侧ViewCoordinates编码类型被实现为对[ViewDir; 3]的透明包装#[repr(transparent)]见 encodings/view_coordinates.rspub struct ViewCoordinates( /// The directions of the [x, y, z] axes. pub [crate::encodings::ViewDir; 3usize], );三、Arrow 数据类型FixedSizeList(3 x non-null UInt8)参考文档给出的 Arrow 数据类型为FixedSizeList(3 x non-null UInt8)也就是说一个ViewCoordinates值在 Arrow 内存布局中是长度为 3 的定长列表列表元素是非空的UInt8每个元素即ViewDir枚举的 u8 编码值。其 Rust 序列化实现encodings/view_coordinates.rs可以印证这一点impl ::re_types_core::ArrowDataType for ViewCoordinates { fn arrow_data_type() - arrow::datatypes::DataType { DataType::FixedSizeList( std::sync::Arc::new(Field::new( item, crate::encodings::ViewDir::arrow_data_type(), // UInt8 false, // non-null )), 3, // 固定长度 3 ) } }item字段非空false表示不允许 null对应文档中的non-null固定长度3对应文档中的3 x反序列化时按每 3 个ViewDir为一组切分step_by(3)并校验长度缺失数据会返回DeserializationError::missing_data()。这套布局保证了该类型在 Rust / Python / C 各语言 SDK 之间二进制兼容也使其可以直接放入DataFrame、Query等需要 Arrow 支持的下游流程中。四、坐标系常量全表48 个三字母组合 12 个左右手系别名ViewCoordinates最实用的地方在于其开箱即用的常量。Rust 的 archetype 扩展文件 view_coordinates_ext.rs 中通过define_coordinates!宏一次性声明了48 个三字母常量命名规则为X轴方向首字母 Y轴方向首字母 Z轴方向首字母方向组合含义URFXUp, YRight, ZForwardRUBXRight, YUp, ZBackRDFXRight, YDown, ZForward默认相机约定RFUXRight, YForward, ZUp3D 视图最终回退约定ULFXUp, YLeft, ZForward左手系不支持……共 48 个ULF~BRD生成机制所有排列的组合这 48 个常量并非手写而是由 scripts/generate_view_coordinate_defs.py 自动生成。脚本核心逻辑为D1 [Up, Down] # 上下方向对应 X 轴维度 D2 [Left, Right] # 左右方向对应 Y 轴维度 D3 [Forward, Back] # 前后方向对应 Z 轴维度 for i in D1: for j in D2: for k in D3: for x, y, z in itertools.permutations([i, j, k]): name f{x[0]}{y[0]}{z[0]} yield ViewCoordinates(name, x, y, z)即从 {Up, Down} × {Left, Right} × {Forward, Back} 三组中各取一个方向再对三个方向做全排列2 × 2 × 2 × 3! 48个组合覆盖了所有「三轴分别指向一个正交方向」的合法坐标系。12 个左右手系别名除 48 个三字母常量外脚本还生成了12 个RIGHT_HAND_*/LEFT_HAND_*别名如RIGHT_HAND_Z_UP、LEFT_HAND_Y_DOWN语义为「以某轴为 up 轴的右手/左手系」。其中右手系 6 个与generate_view_permutations()生成的某 6 个三字母常量等价如RIGHT_HAND_X_UP即URF见 view_coordinates_ext.rs。该脚本支持--rust/--python/--cpp三个目标语言参数并可通过--preview预览生成结果Python 与 C 的常量声明/定义也由同一套逻辑同步维护见 view_coordinates_ext.py 与 view_coordinates_ext.cpp。五、左右手系判定行列式检验与使用限制生成脚本中实现了一个关键的数学判定逻辑is_left_handed()generate_view_coordinate_defs.py先把六个方向映射为三维单位向量Right→(1,0,0)、Up→(0,-1,0)、Forward→(0,0,1)等注意其坐标映射以 RDF 参考系为准再计算由三个轴方向组成的 3×3 矩阵的行列式行列式 1→ 右手系right-handed行列式 -1→ 左手系left-handed其余情况→ 退化的坐标系degenerate抛出警告。生成代码时左手系常量会在 docstring 中自动附加警告说明。运行期同样有校验组件扩展中的from_rub_quat()view_coordinates_ext.rs在行列式为 -1 时会返回错误 Rerun does not yet support left-handed coordinate systems。此外还提供了sanity_check()方法components/view_coordinates_ext.rs若三个方向未覆盖全部三个维度例如出现两个同维度方向会返回 Coordinate system does not cover all three cardinal directions 错误。这些校验共同保证只有合法的、右手的三维坐标系才能进入渲染管线。六、坐标转换 APIRDF / RUB 参考系与旋转矩阵组件扩展components/view_coordinates_ext.rs提供了一组基于glam的坐标变换方法内部以两个参考系为基准RDFXRight, YDown, ZForward图像像素空间的固定约定RUBXRight, YUp, ZBack3D 场景常用的右手参考系。方法作用to_rdf()/from_rdf()变换到 / 变换自 RDF 参考系3×3 矩阵to_rub()/from_rub()变换到 / 变换自 RUB 参考系3×3 矩阵from_other(other)生成从其他坐标系变换到自身self的矩阵即self.from_rdf() * other.to_rdf()from_rub_quat()生成从 RUB 旋转到自身的四元数左手系返回错误from_up_and_handedness(up, handedness)仅根据 up 轴与左右手性构造坐标系up()/right()/forward()提取 up / right / forward 轴对应的SignedAxis3如X、-Zdescribe_short()/describe()输出如RDF或RDF (XRight, YDown, ZForward)的人类可读描述配套的类型Axis3、Sign、SignedAxis3定义在 crates/store/re_sdk_types/src/view_coordinates.rsSignedAxis3表示六个有符号轴方向X、-X、Y、-Y、Z、-Z可转换为单位向量as_vec3()。这套 API 是 Rerun 内部处理相机外参、点云朝向、坐标换算的基础例如re_tf中通过view_coordinates.from_other(image_view_coordinates())将场景坐标系换算到图像像素坐标系见 transform_forest.rs。七、实际应用3D 视图默认朝向与相机朝向ViewCoordinates作为组件components/view_coordinates.rs和archetypeViewCoordinates原型定义于 archetypes/view_coordinates.rs出现其作用是控制相机与 3D 视图的朝向。参考文档中给出的使用规则结合 transforms.md 可以归纳为3D 视图默认朝向向某个实体记录ViewCoordinatesarchetype 后该实体及其子树下的 3D 视图Spatial3DView会采用该坐标约定控制视线方向、导航与默认网格平面。视图取用其原点或最近祖先上的值因此全局记录rr.log(/, rr.ViewCoordinates.RIGHT_HAND_Z_UP, staticTrue)可作用于所有 3D 视图除非 blueprint 中显式覆盖。相机Pinhole朝向Pinholearchetype 的camera_xyz字段见 pinhole.rs控制相机姿态与投影方向默认值为 RDFX 右、Y 下、Z 前由Pinhole::DEFAULT_CAMERA_XYZ常量给出。修改camera_xyz会重新定向相机视锥、深度投影以及 3D 内容到相机视图的投影。回退链3D 视图查找坐标约定的顺序是——蓝图显式设置 场景中记录的ViewCoordinates取原点或最近祖先 最近祖先 Pinhole 的camera_xyz 最终回退RFU。这一逻辑在 transform_queries.rs 的query_view_coordinates与query_view_coordinates_at_closest_ancestor中实现且场景级ViewCoordinates优先于 Pinhole 的camera_xyz回退有对应单元测试验证见同文件第 593 行起。不影响变换数据该取向约定不会改变已记录的 Transform3D 等变换数据它只影响渲染视角的呈现。对 2D 空间无效果对 2D 空间及其他实体ViewCoordinates目前不产生作用对应 issue #1387。各语言使用示例Pythonrr.ViewCoordinates即 archetype 类暴露全部常量import rerun as rr rr.init(view_coords_demo) rr.spawn() # 全局 3D 视图约定XRight, YUp, ZBack右手系 rr.log(/, rr.ViewCoordinates.RUB, staticTrue) # 相机默认 RDFXRight, YDown, ZForward rr.log(world/camera, rr.Pinhole(focal_length[500.0, 500.0], camera_xyzrr.ViewCoordinates.RDF))Rust常量以关联函数形式提供use rerun::archetypes::{Pinhole, ViewCoordinates}; use rerun::RecordingStream; rec.log_static(/, ViewCoordinates::RIGHT_HAND_Z_UP())?; rec.log(world/camera, Pinhole::new([500.0, 500.0]).with_camera_xyz(rerun::components::ViewCoordinates::RDF))?;C常量位于rerun::archetypes::ViewCoordinates与rerun::components::ViewCoordinatesrec.log_static(/, rerun::archetypes::ViewCoordinates::RIGHT_HAND_Z_UP); rec.log(world/camera, rerun::archetypes::Pinhole::from_focal_length_and_resolution({500.f, 500.f}, {640.f, 480.f}) .with_camera_xyz(rerun::components::ViewCoordinates::RDF));八、迁移与兼容性提示API 迁移早期版本的log_view_coordinates已被ViewCoordinatesarchetype 取代见 migration-0-9.md应直接使用rr.ViewCoordinates.RDF、rr.ViewCoordinates.RIGHT_HAND_Z_DOWN这类常量而非字符串形式的xyz/up。timeless→static0.16 版本起时间无关的坐标约定日志参数由timelessTrue改为staticTrue见 migration-0-16.md。稳定性ViewCoordinates编码类型标注为unstable未来可能发生不向后兼容的变化而ViewDir枚举本身是stable的。左手系LEFT_HAND_*常量与部分三字母常量如ULF在文档与代码中均被标记为左手系当前版本不支持使用运行时转换 API 会返回错误。总结ViewCoordinates用「三个抽象方向的有序组合」这一简洁模型统一解决了 Rerun 中 3D 视图与相机的坐标约定描述问题底层由稳定枚举ViewDiru8 编码构成序列化为FixedSizeList(3 x non-null UInt8)上层通过自动生成的 48 个三字母常量与 12 个左右手系别名提供开箱即用的坐标系再辅以 RDF/RUB 参考系转换矩阵与严格的手性校验保证坐标换算的正确性。理解这一编码类型是正确配置相机朝向、多源 3D 数据对齐与多模态机器人数据可视化的前提。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表