VTK无法正确渲染多边形

3

我有一个VTK 6.3程序,已经简化到下面的清单。

当我运行它时,渲染出来的多边形不正确。它应该是一个四边形,旁边附着着另一个四边形,而不是这个奇怪的东西:

Bad polygon rendering

看起来多边形三角化出现了错误,当您旋转多边形时,有一个流氓三角形会闪烁。

我认为我的多边形已经被正确地指定:逆时针和非自相交。

我已经深入研究了VTK代码,希望找到一种更改三角剖分方法的方法。 VTKPolygon类包含几种不同的三角剖分方法,但不清楚是否可以手动设置方法。

如果有人对此有解决方法的建议,我将非常感激。

正如我所说,我相信列表接近最小化的代码,可以重现问题。

另外,正如评论中指出的那样,这种行为在VTK 8.0版本中已经修复。但是,我正在运行RHEL 7.4,并且安装VTK 7或8的过程并不直观。 VTK似乎需要比RHEL 7.4提供的更新版本的OpenGL。

#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, 3.0, 0.0});
    p.push_back (P {7.0, 5.0, 0.0});
    p.push_back (P {1.0, 3.0, 0.0});
    p.push_back (P {1.0, 2.0, 0.0});
    p.push_back (P {0.0, 3.0, 0.0});
    p.push_back (P {0.0, 1.0, 0.0});
    p.push_back (P {1.0, 1.0, 0.0});
    p.push_back (P {1.0, 0.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;
}

1
我使用VTK 8.0按原样运行了您的代码,结果得到两个共边连接的四边形。 - user6764549
@AmitSingh 谢谢!我想是时候升级了。 - jsp
实际上,我尝试升级,但我的发行版RHEL 7.4没有新版本VTK所需的OpenGL版本。这在帖子中已经被指出。 - jsp
你正在使用虚拟机吗? - Mathieu Westphal
@MathieuWestphal 不,我没有使用虚拟机。 - jsp
RHEL 应该支持您需要的 OpenGL 版本。您能否明确在 RHEL 7 上构建/使用 VTK 8 时遇到的错误? - Mathieu Westphal
1个回答

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接