Foundry Nuke NDK: проекция с 3D на 2d камеры

Я изо всех сил пытаюсь вычислить точную проецируемую точку от 3D до 2-мерной камеры рендеринга, используя Nuke NDK. У меня есть динамический объем данных (для теста ниже я просто использую константу 8 баллов), который я рассчитываю рассчитывать, поэтому представляется нецелесообразным объединять узлы согласования в гизмо для этой цели.

Я пытался следовать nukescripts.snap3d.projectpoint пример, но пока я довольно значительно выключен.

Пример данных, которые я получаю:

PointA:
(3D) { -127.91322327, 56.28646469, 336.15023804 }
(2D) { 901.65655518, 65.55204773 }

PointF:
(3D) { -127.91322327, 90.09331512, 372.51187134 }
(2D) { 522.12438965, 22.69236374 }

Данные через Reconcile3d узел:

PointA: { 469.26919556, -1.9122355 }
PointF: { 522.12438965, 188.99978638 }

Может кто-нибудь увидеть, где у меня математически не получается. Я не ожидал столкнуться с этими проблемами, но я застрял почти 2 дня только на этих прогнозах. Благодарю.

//has camera && point data

if (input1() && input0()) {
const Format *format = input0()->deepInfo().format();
Matrix4 xform = input1()->imatrix(); // also tried the non-inverse matrix
Matrix4 projection = input1()->projection() * xform;

float imageAspect = float(format->h()) / float(format->w());
float pixelAspect = format->pixel_aspect();

for (int i = 0; i < 8; i++) {
int s = i * 3;
Vector4 v = projection * Vector4(
XYZ_values[s], XYZ_values[s + 1], XYZ_values[s + 2], 1.0f
);

float x = ((v.x / v.w) + 1) * 0.5;
float y = ((v.y / v.w) + (1- (1- imageAspect/pixelAspect))) * 0.5;
x *= float(format->w());
y *= float(format->w()) * pixelAspect;

XY_values.push_back(x);
XY_values.push_back(y);
}
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]