Foundry Nuke NDK:3d到2D相机投影

时间:2017-03-02 08:01:02

标签: c++ nuke

我正在努力计算使用Nuke NDK从3d到2d渲染相机的精确投影点。我有一个动态的数据量(对于下面的测试,我只是使用一个恒定的8个点)我想要计算,所以为此目的将Gizmo中的协调节点打包似乎是不切实际的。 / p>

我一直在尝试关注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);
     }
}

0 个答案:

没有答案