问题标签 [homogenous-transformation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
3d - 3D 坐标系变换
我有一个场景的点云,其中一个感兴趣的对象与其他一些点一起存在。我还知道恰好是一个长方体的 3D 边界框的八个角的坐标。
现在我有一个用例,我需要将此点云转换为相机坐标系,其中每个 3D 点都将获得一个新的 XYZ 坐标。同理,3D包围盒的八个角点应该转化为相机坐标系。
现在我有了外在矩阵;(旋转矩阵和平移)将列向量从相机坐标系转换为世界坐标系。为简单起见,我将旋转矩阵转换为四元数。
我想将点云和边界框坐标从世界坐标系转换为相机坐标系。所以我通过简单的逆旋转和负平移来获得逆变换,如下所示:
现在,inverse_translation
并inverse_orientation
持有将世界坐标系中的点转换为相机坐标系的变换。
因此,我通过以下方式使用此转换将边界框的八个角转换为相机坐标:
我还将点云转换为相机坐标系并使用边界框将其可视化,边界框不再围绕对象。此外,我看到边界框的大小略有变化。
我怀疑我在进行逆变换时做错了什么。关于如何完成这项工作的任何想法?
c++ - Eigen 从 Affine3d 3x3 旋转矩阵中提取的四元数是否已归一化?
这里https://docs.ros.org/kinetic/api/eigen_conversions/html/eigen__msg_8cpp_source.html#l00093
我很不明白这一行的语法:Eigen::Quaterniond q = (Eigen::Quaterniond)e.linear();
但无论如何,假设e
是类型Eigen::Affine3d
(3x3 旋转矩阵),我在哪里可以弄清楚如何从 Eigen 库中的旋转矩阵构造四元数?我没有在文档上看到任何方法,除了https://eigen.tuxfamily.org/dox/classEigen_1_1QuaternionBase.html#title25但我是一个真正的 C++ 菜鸟,所以我什至不明白那个......
我希望它做这样的事情https://arc.aiaa.org/doi/abs/10.2514/2.4654?journalCode=jgcd因为我需要提取的四元数必须标准化,我想确保这一点。
for-loop - 如何向量化齐次变换矩阵/张量的计算?
对于我的模拟,我需要计算许多转换矩阵,因此我想对我现在使用的 for 循环进行矢量化。
有没有办法对现有的 for 循环进行向量化,或者我之前可能需要另一种方法来计算向量和矩阵?
我准备了一个小的工作示例:
python - 具有齐次坐标的 MVP 变换
我正在尝试使用 python 和 numpy 计算 MVP 转换,我的代码可能有问题,因为我最终得到 aw=0。我对照 glu 函数检查了我的截头锥体/透视图/lookat,它们似乎是正确的。由于 numpy 数组的 C 顺序,我更改了操作顺序,并按该顺序应用模型、视图和投影。在示例中,转换原点会导致 w=0 的齐次坐标,这当然会阻止我将结果除以 w。
c++ - 使用 pcl transformcloud 将 3d 点平移和旋转到原点
给定从 charucoBoard 角的相机姿态估计获得的旋转矩阵和平移矩阵,我想通过使用齐次变换将一个特定的角转换为原点。如果我理解正确,相机在相机世界中的位置是(0,0,0),并且旋转矩阵和平移向量也在相机坐标系中解释。
平移向量告诉您相机坐标系中的确切位置,而旋转矩阵告诉您相对于相机的旋转角度。
然后我将我的齐次变换矩阵构造为:
其中 rmatrix 是我的旋转矩阵, tvec 是平移向量
和transformation_matrix的输出是
旋转矩阵为:
翻译向量:
transformpointcloud
然后
我使用pcl::transformPointCloud (*cloud, *transformed_cloud, translation_matrix);
但是,我无法在转换后将点与原点对齐。有没有人知道我可能会出错的地方?
更新:
我测试了之前和之后的转换,发现我的齐次矩阵转换是不正确的:
这是从电路板侧面获取的深度数据 如您所见,x、y、z 轴分别显示为红色、绿色和蓝色,白色点云在前面,红色点云在后面。我发现图像已正确翻转到我想要的方向,但原点(红色、绿色和蓝色轴的交点)有时未连接到板的角之一,并且 x 轴与董事会的边界。
我可以肯定的一件事是,当相机平行于电路板时,x 轴也平行于转换后的图像。 从板顶部的直角拍摄
我推测我缺少一两个旋转轴。
我通过使用 R*P + T 公式用以下代码标记另一个角,确保我的角的旋转矩阵和平移向量是正确的:
板的长度是 0.4 米,所以我将corner1_0 设置为 (0.4, 0, 0),然后这是我为指示目的绘制的两个标记轴的图像
如您所见,旋转矩阵和平移向量是正确的。非常感谢任何帮助/提示/推测:)
python - 使用 numpy 的 cumprod 功能和矩阵乘法
我正在尝试使用 numpy 的 cumprod 的功能,但用于矩阵。有一个充满齐次变换的矩阵(为了简单起见,这里是随机的)我想使用 numpy 的矩阵乘法来累积变换。
dataAcc 应包含以下内容:
有没有办法使用快速的 numpy 函数或类似的函数来做到这一点?我不想使用循环...
干杯
performance - 为什么在计算机图形学中使用矩阵?
我了解如何在计算机图形学中应用矩阵,但我不太明白为什么要这样做。例如在翻译中:要(x, y, z)
逐个向量翻译,(diffX, diffY, diffZ)
您可以简单地将向量相加,而不是创建翻译矩阵:
然后将向量乘以矩阵得到(x+diffX, y+diffY, z+diffZ)
. 肯定应用这样的矩阵会浪费性能和内存吗?
rust - 您如何正确实现视图矩阵?
我正在使用 Rust Vulkano Vulkan API 绑定制作类似 Minecraft 的游戏来渲染游戏。我有一个玩家围绕 Y 轴或 X 轴旋转,专门使用 FPS 视图矩阵实现。视图矩阵的预期输出是一个 4x4 浮点齐次矩阵 ( [[f32; 4]; 4]
)。
我尝试使用cgmath
库和nalgebra
库作为 FPS 视图矩阵的实现,尽管我决定手动实现它仅nalgebra
用于矩阵运算。
我也尝试使用传统的look_at(eye, target, up)
功能。
结果要么是奇怪的剪裁/翘曲,要么是无法正确旋转。我试图找到一些外部资源,例如 MVP 矩阵教程、问题和论坛,但解决方案总是导致奇怪的渲染。
更新 1
我目前在游戏中构建的环境只是一个大的 64x64x64 块大小的空心块,纹理仅在块边界上,没有启用 alpha 混合的面部剔除。
这是我能得到的最接近 y 轴旋转围绕想象中的大圆路径旋转的地方,它应该只是围绕玩家旋转。