java - 4D 到 3D 透视投影

标签 java 3d hypercube

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

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,而引用超正方它应该影响所有维度......

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

感谢您的帮助!

最佳答案

  • 二维 (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 矩阵中,并在图形管道末端附近被透视划分丢弃)。

关于java - 4D 到 3D 透视投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19609255/

相关文章:

c# - 如果 x of y 值相等

java - while 循环中的扫描仪

java - 使用正则表达式来匹配字符串中的变量

javascript - Three.js - 如何选择灯光/相机

C++如何生成n维元组的笛卡尔积集

Python - n维立方体的角坐标

java - Apache Camel 聚合器输入输出回复

c++ - OpenGL 深度无法按预期工作

java - 多边形顶点作为 UV 坐标

C++ 生成并存储 n 维立方体的坐标