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



我不确定这个主题是否更适合这里或数学溢出。由于我正在使用 numpy,我想我会在这里发布它。

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

我从 Identiy 矩阵开始:

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轴转换后存在一个值,这让我觉得我的方法不正确。请告诉我我是否以错误的方式处理这个问题。

正如@PaulPanzer指出的,我从错误的方向点缀了新向量。解决方案是

np.dot(NE_1, NEW_SPACE)

你走在正确的轨道上。用于变换立方体顶点的 3d 管道是

projection @ camera @ world @ model @ vertices

您的 FLAT 矩阵是具有focal_length=1cx = cy = 0(屏幕偏移)的相机矩阵。

Punyty是一个小型演示引擎,用于使用Numpy渲染3D模型,如果你想要一个参考。

相关内容

  • 没有找到相关文章

最新更新