问题标签 [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.

0 投票
1 回答
147 浏览

python - 围绕给定轴旋转任意平面会导致结果不一致

我正在尝试围绕某个任意轴旋转和平移任意平面。出于测试目的,我编写了一个简单的 python 程序,它以在此处输入图像描述 度为单位围绕 X 轴旋转一个随机平面。

不幸的是,在检查平面之间的角度时,我得到了不一致的结果。这是代码:

它打印:

调试此代码时,我看到转换矩阵是正确的,因为它表明它是 在此处输入图像描述

我不确定出了什么问题,并希望在这里提供任何帮助。

* 生成变换矩阵的代码为:

0 投票
0 回答
290 浏览

3d - 3D 坐标系变换

我有一个场景的点云,其中一个感兴趣的对象与其他一些点一起存在。我还知道恰好是一个长方体的 3D 边界框的八个角的坐标。

现在我有一个用例,我需要将此点云转换为相机坐标系,其中每个 3D 点都将获得一个新的 XYZ 坐标。同理,3D包围盒的八个角点应该转化为相机坐标系。

现在我有了外在矩阵;(旋转矩阵和平移)将列向量从相机坐标系转换为世界坐标系。为简单起见,我将旋转矩阵转换为四元数。

我想将点云和边界框坐标从世界坐标系转换为相机坐标系。所以我通过简单的逆旋转和负平移来获得逆变换,如下所示:

现在,inverse_translationinverse_orientation持有将世界坐标系中的点转换为相机坐标系的变换。

因此,我通过以下方式使用此转换将边界框的八个角转换为相机坐标:

我还将点云转换为相机坐标系并使用边界框将其可视化,边界框不再围绕对象。此外,我看到边界框的大小略有变化。

我怀疑我在进行逆变换时做错了什么。关于如何完成这项工作的任何想法?

0 投票
1 回答
1211 浏览

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因为我需要提取的四元数必须标准化,我想确保这一点。

0 投票
2 回答
68 浏览

for-loop - 如何向量化齐次变换矩阵/张量的计算?

对于我的模拟,我需要计算许多转换矩阵,因此我想对我现在使用的 for 循环进行矢量化。

有没有办法对现有的 for 循环进行向量化,或者我之前可能需要另一种方法来计算向量和矩阵?

我准备了一个小的工作示例:

0 投票
0 回答
66 浏览

python - 具有齐次坐标的 MVP 变换

我正在尝试使用 python 和 numpy 计算 MVP 转换,我的代码可能有问题,因为我最终得到 aw=0。我对照 glu 函数检查了我的截头锥体/透视图/lookat,它们似乎是正确的。由于 numpy 数组的 C 顺序,我更改了操作顺序,并按该顺序应用模型、视图和投影。在示例中,转换原点会导致 w=0 的齐次坐标,这当然会阻止我将结果除以 w。

0 投票
1 回答
2355 浏览

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),然后这是我为指示目的绘制的两个标记轴的图像

如您所见,旋转矩阵和平移向量是正确的。非常感谢任何帮助/提示/推测:)

0 投票
0 回答
111 浏览

python - 使用 numpy 的 cumprod 功能和矩阵乘法

我正在尝试使用 numpy 的 cumprod 的功能,但用于矩阵。有一个充满齐次变换的矩阵(为了简单起见,这里是随机的)我想使用 numpy 的矩阵乘法来累积变换。

dataAcc 应包含以下内容:

有没有办法使用快速的 numpy 函数或类似的函数来做到这一点?我不想使用循环...

干杯

0 投票
2 回答
30 浏览

math - 什么是齐次坐标系中的分辨率损失?

从下图中我了解到,齐次坐标是n位计算机范围限制的一种方式。但是,自从在网上阅读后仍然有些困惑,解释对我来说非常复杂。然后还有一个主要问题,即图像最后一段中提到的分辨率损失是什么。

这东西让我很困惑。谁能指出我正确的方向,以便对这些基础知识有清晰的认识?

来自计算机图形学数学元素的一段 - David F. Rogers, J. Alan Adams 在此处输入图像描述 []

0 投票
0 回答
72 浏览

performance - 为什么在计算机图形学中使用矩阵?

我了解如何在计算机图形学中应用矩阵,但我不太明白为什么要这样做。例如在翻译中:要(x, y, z)逐个向量翻译,(diffX, diffY, diffZ)您可以简单地将向量相加,而不是创建翻译矩阵:

然后将向量乘以矩阵得到(x+diffX, y+diffY, z+diffZ). 肯定应用这样的矩阵会浪费性能和内存吗?

0 投票
1 回答
851 浏览

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 轴旋转围绕想象中的大圆路径旋转的地方,它应该只是围绕玩家旋转。