Проецирование куба на плоскость с использованием матричных преобразований и numpy - PullRequest
5 голосов
/ 28 мая 2019

Я не был уверен, подходит ли эта тема лучше здесь или о математическом переполнении.Поскольку я использую 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)

В этот момент у меня есть новое базисное пространство, которое было повернуто30 градусов вокруг оси Y.

Теперь я хочу проецировать это на 2-мерное пространство.Я полагал, что это новое пространство в основном является базисом идентичности с нулевой осью 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      ])

Этот вид проверок, потому что обе точки были сведены к одной и той же вещи.Однако что такое -0.5 на оси Z?Что это представляет?

Наличие значения на пост-преобразовании оси Z заставляет меня думать, что мой метод неверен.Пожалуйста, скажите мне, если я поступаю неправильно.

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Как указывал @PaulPanzer, я расставил точки над новым вектором с неправильной стороны. Решение

np.dot(NE_1, NEW_SPACE)
0 голосов
/ 13 июня 2019

Вы на правильном пути. 3d конвейер для преобразования ваших вершин куба равен

projection @ camera @ world @ model @ vertices

Ваша матрица FLAT представляет собой матрицу камеры с focal_length=1 и cx = cy = 0 (смещения экрана).

punyty - небольшой демонстрационный движок для рендеринга 3d-моделей с использованием numpy, если вам нужна ссылка.

...