4D到3D透视投影

时间:2013-10-26 16:49:06

标签: java 3d hypercube

我试图计算3D世界中4D点的位置。我从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,并且指的是它应该影响所有尺寸......

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  • 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 矩阵中,并通过透视分割在图形管道的末尾附近被丢弃。