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

5

我不确定这个主题是更适合在这里发布还是在数学溢出站。因为我在使用numpy,所以我想在这里发布它。

我正在尝试将一个三维空间中的立方体旋转,然后投影到一个二维平面上。

我从单位矩阵开始:

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轴上存在一个值让我觉得我的方法可能不正确。如果我走错了,请告诉我正确的方法。


只是提醒一下,我不是学生,所以请不要建议“问我的导师”。我是一名全职程序员,在业余时间学习这个。 - dopatraman
看起来像是乘法的顺序问题。你似乎先将向量与投影相乘,然后再与旋转相乘。这个顺序可能应该反过来。 - Paul Panzer
怎么做?我正在进行 I -> RY -> FLAT - dopatraman
1
好的,是的,然后你要从右边乘以NE_1/2,这就像先乘以FLAT一样。(回想一下矩阵乘法是_结合律_,意味着括号(如果您愿意,可以理解为时间顺序)不重要,但不是_交换律_,意味着左右顺序很重要。) - Paul Panzer
@PaulPanzer,你是对的,请将您的回答提交为答案,我会标记它为正确。 - dopatraman
2个回答

3

正如@PaulPanzer所指出的那样,我在错误的方向上给新向量加点。解决方法为

np.dot(NE_1, NEW_SPACE)

1
你正在正确的道路上。将立方体顶点转换为3D管道是:
投影 @ 相机 @ 世界 @ 模型 @ 顶点
你的FLAT矩阵是一个相机矩阵,具有focal_length=1cx = cy = 0(屏幕偏移量)。
如果需要参考,punyty是一个使用numpy渲染3D模型的小型演示引擎。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接