4D转3D透视投影

Posted

技术标签:

【中文标题】4D转3D透视投影【英文标题】:4D to 3D perspective projection 【发布时间】:2013-10-26 16:49:06 【问题描述】:

我正在尝试计算 4D 点在 3D 世界中的位置。我从 2D 开始,并尝试将其扩展到 3D,然后扩展到 4D。首先,我发现计算线上2D点的投影位置很容易。

Whoops, there should be () in the first equation: x/(a+y)

现在我发现如果我将 P(X,Y,Z) 拆分为 P1(X,Z) 和 P2(Y,Z),计算它们的 Q 然后构建,这同样适用于 3D 世界P'(Q1,Q2) 的一个点(假设我从 C(0,-a) 点看 Z 轴正无穷大并渲染到 XY 平面)。

nx = (a*x)/(a+z);
ny = (a*y)/(a+z);

然后我认为它就像添加下一个点P3一样简单,并想出了

nx = (a*x)/(a+z);
ny = (a*y)/(a+z);
nw = (a*w)/(a+z);

我觉得这很奇怪,因为 W(新轴)实际上只影响最后一点的 Z,并且提到 tesseract 它应该影响所有维度...

这不起作用,所以我想问您是否可以提供一些关于我做错了什么的细节。我很确定它是“点分裂”问题,方程应该更复杂。请不要用矩阵和四元数攻击我。我只想在 (0,-1) 有一个简单的静态相机看着 (0,0)...

感谢您的帮助!

【问题讨论】:

我认为这可能更适合math.stackexchange.com。 This answer to a related question also seems useful. 【参考方案1】:

2D (x,y) y=0 上的投影表示线与线的交点:

x'/a = x/(a+y)

3D (x,y,z) 上 z=0 的投影表示线与平面的交点:

for y=0: x'/a = x/(a+z)
for x=0: y'/a = y/(a+z)

4D (x,y,z,w) 上的投影到 w=0 表示线与超平面的交点:

for y=0, z=0: x'/a = x/(a+w)
for x=0, z=0: y'/a = y/(a+w)
for x=0, y=0: z'/a = z/(a+w)

...等等

或者,可以使用参数形式计算一条线和一个超平面的交点,其中一条线由以下方式描述:

[px,py,pz,pw] = [p0x,p0y,p0z,p0w] + t * [p1x,p1y,p1z,p1w]

其中参数 t 是任意数字

超平面由以下方式描述:

[hx,hy,hz,hw] = [h0x,h0y,h0z,h0w] + a * [h1x,h1y,h1z,h1w] + b * [h2x,h2y,h2z,h2w] + c * [h3x,h3y,h3z,h3w]

现在可以通过求解找到交点:

[px,py,pz,pw] = [hx,hy,hz,hw]

或更明确:

[p0x,p0y,p0z,p0w] + t * [p1x,p1y,p1z,p1w] = [h0x,h0y,h0z,h0w] + a * [h1x,h1y,h1z,h1w] + b * [h2x,h2y,h2z,h2w] + c * [h3x,h3y,h3z,h3w]

除非直线平行于超平面,否则可以求解 4 个方程(每个维度 x、y、z、w 一个)和 4 个未知数(a、b、c、t)。

以上想法受4D中解析几何的影响(其中w分量代表自己的单独维度),它们不应与齐次坐标混淆(其中使用w分量将平移/投影集成到 4D 矩阵中,并在图形管道末端附近被透视分割丢弃)。

【讨论】:

以上是关于4D转3D透视投影的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的透视 3D 投影

在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影

透视投影详解转

投影方式- Unity3D游戏开发培训

如何构建透视投影矩阵(无 API)

∑GL-透视投影矩阵的推导