我不确定此主题是否更适合此处或数学上的溢出。由于我使用的是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轴后变换上存在一个值,使我认为我的方法不正确。请告诉我是否要以错误的方式进行操作。
答案 0 :(得分:3)
正如@PaulPanzer所指出的那样,我是从错误的方向添加新向量。解决方法是
np.dot(NE_1, NEW_SPACE)
答案 1 :(得分:0)
您处在正确的轨道上。变换立方体顶点的3d管道是
projection @ camera @ world @ model @ vertices
您的FLAT矩阵是一个camera matrix,其中包含focal_length=1
和cx = cy = 0
(屏幕偏移)。
punyty是一个小型演示引擎,用于在需要参考的情况下使用numpy渲染3d模型。