问题标签 [projective-geometry]
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.
math - 查找投影和 z 距离
我有一个代表投影的图像。我将用一个例子来解释这个问题:
在屏幕中,有一条线从一个点 E(100,200) 到另一个点 H (150,100)。A 代表现实世界中距离为 200 厘米的点,而 B 是现实世界中距离为 300 厘米的点。
我想知道的是:
给定通过这两个点的线的一个点,有没有办法计算它应该具有的 z 距离数据?
如果 z 距离不是线性函数而是某个对数函数怎么办?
如果不清楚,问我一切,
干杯
actionscript-3 - 2d 到 3d - 如何将绘图包裹在圆柱体周围
我有在 3d 空间中旋转的绘图(具有 x 和 y 坐标的点数组): http ://www.motiondraw.com/md/as_samples/Testing/_mindreader/main.html
就像现在一样,这幅画看起来就像包裹在一个立方体上,角落里有一个令人讨厌的 90° 度。相反,它应该看起来好像被包裹在一个圆柱体上。在开始旋转之前,我调用一个函数(在 ActionScript 中)“bendDrawing”,它为每个点设置一个初始 z 值:
for (var j = 0; j < numPoints; j++ ) {
// 绘图居中 – 中心左侧的点 < 0 var distFromCenter = Math.abs(shape[i].points[j].x);
}
我只是无法解决这个问题;-) 任何指针都非常感谢!
安德烈亚斯·韦伯
kinect - 从两个 Kinect 深度图中提取投影单应性
给定从 Kinect 深度图获得的两个连续的 3D 点云 1 和 2(不是整个云,例如使用 OpenCV 的 GoodFeaturesToMatch 从云中选择 100 个点),我想计算相机从 1 到 2 的单应性。我知道这是一个投影转换,很多人已经做过了:这里(幻灯片 12)、这里(幻灯片 30)和这里似乎是经典论文。我的问题是,虽然我是一名称职的程序员,但我没有数学或三角技能将其中一种方法转化为代码。由于这不是一个简单的问题,我为解决以下问题的代码提供了大笔赏金:
相机在原点,看 Z 方向,在不规则五面体 [A,B,C,D,E,F]:
相机向左 (X) 移动 -90mm,向上 (Y) +60mm,向前 +50mm (Z) 并向下旋转 5°,向右旋转 10°,逆时针旋转 -3°:
旋转整个场景,使相机回到原来的位置,让我可以确定顶点在 2 处的位置:
用于准备的 3DS Max 文件是max 1、max 2和max 3
以下是顶点之前和之后的位置、内在函数等:
请注意,camera2 的顶点并非 100% 准确,存在一些故意的噪点。
我需要的代码必须可以很容易地转换为 VB.Net 或 C#,在必要时使用 EMGUCV 和 OpenCV,获取 2 组顶点和内在函数并产生以下输出:
我不知道同质坐标的单应性是 3X3 还是 3X4,但它必须允许我将顶点从 1 转换为 2。
我也不知道值 a1、a2 等;这就是你必须找到的>;-)
500 赏金提供“取代”了我为这个非常相似的问题提供的赏金,我在那里添加了一条指向这个问题的评论。
EDIT2:我想知道我问这个问题的方式是否具有误导性。在我看来,问题更多的是点云拟合而不是相机几何(如果你知道如何将 A 平移和旋转到 B,你就会知道相机变换,反之亦然)。如果是这样,那么也许可以使用 Kabsch 算法或类似的方法获得解决方案
image-processing - 需要一些帮助来理解公式
这是针孔相机型号:
(我不明白,是不是有[R t],还是(R,t)) 这个公式是把点的3d坐标转换成针孔相机得到的一张图片的2d坐标。
投影图:
波浪号在向量上,表示将“1”作为元素添加到该向量中。M是该点在3d空间中的坐标,m是该点在图片中的坐标,f是相机的焦距,s是像素长宽比。(R, t) 描述了描述矩形的世界坐标系和相机坐标系之间的 3D 变换。
我不清楚 A 之后的 [R t](或 (R, t))是什么意思,以及如何通过将角的 3D 坐标(像素纵横比 = 1)插入公式中得到:
“t”字母是什么意思?
我在这里找到了这个公式(第 13 页)。
matlab - 来自相同投影矩阵的不同基本矩阵
我使用两个投影矩阵 P1 和 P2(例如我使用恐龙数据集),我需要计算基本矩阵 F。所以我使用两个 Matlab 函数:
- Peter Kovesi 的函数:www.csse.uwa.edu.au/~pk/Research/MatlabFns/Projective/fundfromcameras.m
- 齐瑟曼:www.robots.ox.ac.uk/~vgg/hzbook/code/vgg_multiview/vgg_F_from_P.m
这些函数应该做同样的事情,但我有不同的 F 值!怎么可能?哪个是正确的功能?
如果两个点 X1 和 X2 在两个不同的图像中“相同”,则 X2^T*F*X1 = 0 ... 所以我通过使用 SURF 从两个旋转图像(5 度)中找到了两个对应点,但是 X2^T *F*X1 在这两个函数中永远不会等于零。有任何想法吗?
相反,如果我使用这个从匹配点计算 F 的函数:
- 由 Peter Kovesi 编写的 ransac 拟合基本矩阵:ransacfitfundmatrix.m
我有那个 X2^T*F*X1 = 0 .... 显然 F 与其他两个函数的两个 FI 不同...
math - 2D 弹丸追踪路径说明
2D游戏中的弹丸追踪路径问题:
假设:
我们做了一个简化的假设,即重力是恒定的并且没有风或阻力。弹丸的运动由以下方程给出:
x = x0 + v0t cos(theta)
y = y0 + v0t sin(theta) + .5 gt^2
其中 (x0, y0) 是初始位置,v0 是初始速度(仅幅度),theta 是排放角,g 是重力加速度。求解 v0t 的第一个方程并代入第二个方程,我们得到方程 [1]:
y = y0 + (x-x0) tan(theta) + .5 (g/v0^2) (x-x0)^2 / cos(theta)^2
校准:
校准是根据实际弹丸确定 g 值的过程。为此,我们发射一个随机射弹并捕获:
- 起点 (x0, y0)
- 目标向量 (v0, theta)
- 曲线上的一个随机点 (x1, y1)
将这些值代入方程 [1] 并求解 g,我们得到:
g = (v0^2) * {[2 cos(theta)^2 (y1-y0) / (x1-x0)^2] - [sin(2theta) / (x1-x0)]}
应用:
现在我们有了 g,我们可以将其代回方程 [1],现在可以使用该方程从任何起点和初始速度跟踪射弹的路径。(这是我不明白的部分)
g=5.89
(x0,y0) 起始位置 = 0,0
初始速度 = 1-100
放电角度 = 0-360
有人可以解释一下,如果重力加速度为 5.89(在这个游戏中),那么对于 1-100 之间的任何初始速度和 0-360 之间的任何放电角,如何获得抛物线的完整绘制路径,并且开始位置是0,0?
我是一个数学新手,所有这些东西都不是我在别处找到的粗体字,而且我一直在绞尽脑汁。请假设我什么都不知道。
matlab - 计算一个矩阵,将一个四边形转换为二维中的另一个四边形
在下图中,目标是计算单应矩阵 H,它将点 a1 a2 a3 a4 转换为对应的 b1 b2 b3 b4。那是:
您建议哪种方法是计算 H(3x3) 的最佳方法。a1...b4 是在齐次坐标系中表示的 2D 点(即 [a1_x a1_y 1]', ...)。 编辑:对于这些类型的问题,我们使用 SVD,所以我想看看如何在 Matlab 中简单地完成。
编辑:
这是我最初尝试在 Maltlab 中使用 svd (H=Q/P) 解决它的方法。考虑给定示例的以下代码
我期望答案是一个空矩阵,但它不是!...这就是我在 StackOverflow 中问这个问题的原因。现在,我们都知道这是一个射影变换,显然不是欧几里得。但是,很高兴知道在一般情况下是否可以仅使用 4 个点来计算此类矩阵。
intersection - 一条线与无穷大平面的交点
我想计算 3D 线与无穷远平面的交点。我怀疑这与采用线的 3D 方向并将第 4 个矢量坐标设置为 0 相同。
然而,这还不够。我想知道在透视相机转换和投影线后,屏幕坐标中交叉点的 2D 位置。
这个问题相当于在 2D 图像中寻找消失点。
projection - 将 2D 点反投影到 3D Plucker 线
我正在尝试构建一个跟踪器(手跟踪个人项目),因此我需要使用 Plucker 坐标将 2d 点反向投影到 3d 线。(如光线追踪)
作为输入,我有一个点的二维坐标和投影矩阵。
网络上有关采摘器坐标的信息概述了它们为何有用,但没有论文分析性地描述上述过程。(他们只是提到他们将项目反向投影到采摘线,没有任何进一步的描述)
有人可以指出我正确的方向吗?
opengl - 如何在 OpenGL 中高效地实现“point-on-heightmap”拾取?
我想在世界地表上跟踪我的 OpenGL 场景中的鼠标坐标,它被建模为高度图。目前没有像硬件镶嵌这样的花哨的东西。请注意,此问题与对象拾取无关。
目前我正在做以下事情,这显然是由于回读操作而降低了性能:
- 渲染世界(地表)
- 读回鼠标坐标处的深度值
- 渲染场景的其余部分
- 交换缓冲区并渲染下一帧
回读是在两个渲染步骤之间,因为我想要地表的深度值,前面没有任何物体。使用以下命令完成:
我的应用程序将帧速率限制为每秒 60 帧。在没有回读操作的情况下渲染场景时,我的 CPU 使用率不到 5%,但是在进行回读时,它增加到大约 75%,尽管我没有做太多渲染场景或更新任何游戏模型或诸如此类的事情。
一个临时的解决方案是缓存鼠标下像素的深度值,并且仅每 5 帧或 10 帧更新一次,这会导致 CPU 使用率回落到 10% 以下。但显然不能成为问题的最佳解决方案。
如何有效地实现拾取(不是对象拾取,因为我想要表面上的(浮点)坐标)?
我已经考虑过读回前缓冲区的深度值而不是后缓冲区,但是当谷歌搜索如何这样做时,我只发现人们抱怨最好避免使用 glRead* 方法。但是我怎么能在不读东西(使用 glRead*)的情况下读东西(做挑选)?
我很困惑。其他人如何实现拣货?
一种完全不同的方法是在软件中实现世界表面拾取。从相机“进入深度”重建 3D 射线应该没什么大不了的,它表示在目标像素处渲染的空间点。然后我可以实现一个相交算法来找到表面上最前面的点。