VTK无法正确渲染多边形

时间:2018-03-30 21:28:30

标签: rendering polygon vtk

我有一个VTK 6.3程序,我已经提炼到下面的列表。

当我运行它时,渲染的多边形不正确。它应该是一个四边形,旁边有另一个连接的四边形,而不是这个古怪的东西:

Bad polygon rendering

看起来多边形三角剖分是错误的,当你旋转多边形时,一个流氓三角形会闪烁。

我相信我的多边形已正确指定:逆时针和非自相交。

我已经挖掘了VTK代码,希望找到一种方法来改变三角测量方法。 VTKPolygon类包含几种不同的三角测量方法,但不清楚是否可以手动设置方法。

如果有人建议对此进行排查,我将非常感激。

正如我所说,我认为列表接近于重现问题的最小代码量。

此外,正如在评论中已经注意到的,此行为在VTK 8.0版中已得到修复。但是,我正在运行RHEL 7.4,并且安装VTK的第7版或第8版并不是直截了当的。 VTK似乎想要一个比RHEL 7.4更新版本的OpenGL。

import tensorflow as tf
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from matplotlib import pyplot as plt

def extract_prediction(l):
    ll = list(l)
    predict = []
    n = 0
    for i in ll:

        predict.append(i['predictions'][0])
        n += 1

    return predict


x = np.linspace(-1, 1, 500).reshape([-1, 1])
noise = np.random.normal(0, 0.05, x.shape)
y = np.square(x) + noise
print(y.shape)
feature = tf.feature_column.numeric_column('x')
print(np.min(y), ' ', np.max(y))
est = tf.estimator.DNNRegressor(hidden_units=[30],
                                feature_columns=[feature],
                                activation_fn=tf.nn.tanh,

optimizer=tf.train.AdamOptimizer(learning_rate=0.3))
input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': x}, y=y, 
                                              shuffle=False)
p_input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': x} , y=y, 
                                                shuffle=False)
est.train(input_fn=input_fn, steps=50000)
predict = est.evaluate(input_fn=p_input_fn)
print(predict)
predict = est.predict(input_fn=p_input_fn)
p = extract_prediction(predict)

plt.plot(y, 'b')
plt.plot(p, 'r')
plt.show()

1 个答案:

答案 0 :(得分:1)

我认为VTK在坐标原点方面有一些技巧。我将您的源代码用于VTK 8.1.1。我更改了坐标设置,以获得两个空间方向不同的三角形

enter image description here

我在

下面放置了修改后的来源
#include "vtkAutoInit.h"
#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)
#include "stdafx.h"


#include <vtkActor.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolygon.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    struct P { float x, y, z; };
    vector<P> p;

    p.push_back(P{ 8.0, 8.0, 3.0 });
    p.push_back(P{ 8.0, 1.0, 0.0 });
    p.push_back(P{ 1.0, 8.0, 0.0 });
    p.push_back(P{ 1.0, 1.0, 3.0 });
    p.push_back(P{ 8.0, 1.0, 0.0 });


    vtkSmartPointer<vtkPolygon> poly = vtkSmartPointer<vtkPolygon>::New();
    poly->GetPointIds()->SetNumberOfIds(p.size());

    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> polygons =vtkSmartPointer<vtkCellArray>::New();

    for (size_t i = 0; i < p.size(); ++i)
    {
        points->InsertNextPoint(p[i].x, p[i].y, p[i].z);
        poly->GetPointIds()->SetId(i, i);
    }

    polygons->InsertNextCell(poly);
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();

    polydata->SetPoints(points);
    polydata->SetPolys(polygons);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polydata);

    vtkSmartPointer<vtkActor> buildingActor = vtkSmartPointer<vtkActor>::New();
    buildingActor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(buildingActor);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();

    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();

    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindow->Render();
    renderWindowInteractor->Start();

    return 0;
}