使用矩阵变换和numpy将立方体投影到平面上

时间:2019-05-28 19:39:03

标签: python numpy linear-algebra

我不确定此主题是否更适合此处或数学上的溢出。由于我使用的是numpy,所以我想将其发布在这里。

我试图在3维空间中旋转多维数据集,然后将其投影到2维平面上。

我从象矩阵开始:

import numpy as np

I = [[1,0,0],
     [0,1,0],
     [0,0,1]]

然后,我将旋转变换应用于Y轴:

from math import sin, cos

theta = radians(30)
c, s = cos(theta), sin(theta)
RY = np.array([[c, 0, s],[0, 1, 0], [-s, 0, c]])
# at this point I'd be dotting the Identiy matrix, but I'll include for completeness
I_RY = np.dot(I, RY)

这时,我有了一个新的基础空间,它已绕Y轴旋转了30度。

现在,我想将此投影到二维空间上。我认为,这个新空间基本上是Z轴设置为零的标识基础:

FLAT = [[1,0,0],
        [0,1,0],
        [0,0,0]]

现在,我认为我可以对此进行组合以完成从立方体到正方形的完整转换:

NEW_SPACE = np.dot(I_RY, FLAT)

剩下的就是变换原始立方体的点。假设原始多维数据集的东北点设置为[1,1,1]和[1,1,-1],我可以像这样获得新点:

NE_1 = np.array([1,1,1])
NE_2 = np.array([1,1,-1])
np.dot(NEW_SPACE, NE_1)
np.dot(NEW_SPACE, NE_2)

但是,这给了我以下内容:

array([ 0.8660254,  1.       , -0.5      ])

这种签出,因为两个点都被展平为同一件事。但是,Z轴上的-0.5是什么?它代表什么?

Z轴后变换上存在一个值,使我认为我的方法不正确。请告诉我是否要以错误的方式进行操作。

2 个答案:

答案 0 :(得分:3)

正如@PaulPanzer所指出的那样,我是从错误的方向添加新向量。解决方法是

np.dot(NE_1, NEW_SPACE)

答案 1 :(得分:0)

您处在正确的轨道上。变换立方体顶点的3d管道是

projection @ camera @ world @ model @ vertices

您的FLAT矩阵是一个camera matrix,其中包含focal_length=1cx = cy = 0(屏幕偏移)。

punyty是一个小型演示引擎,用于在需要参考的情况下使用numpy渲染3d模型。