VTK текстурная шкала - PullRequest
       66

VTK текстурная шкала

0 голосов
/ 02 июля 2019

Я работаю с изображениями глаз и хочу, чтобы я взял одно из этих изображений и применил его в качестве текстуры для сферы.Тем не менее, у меня есть небольшие проблемы с масштабированием, вот как это выглядит сейчас:

enter image description here

А вот изображение I 'я работаю с:

enter image description here

До сих пор я пробовал различные методы, но у меня все еще нет желаемого результата.

Вот код, над которым я работаю:

#include <vtkSmartPointer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkTransformTextureCoords.h>
#include <vtkTexture.h>
#include <vtkTextureMapToSphere.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader.h>
#include <vtkTexturedSphereSource.h>
#include <vtkSphereSource.h>

int main(int argc, char *argv[])
{
std::string fileName = "C:\\VTK\\eyeTextureNew2.jpg";

//Create sphere
vtkSmartPointer<vtkTexturedSphereSource> source =
    vtkSmartPointer<vtkTexturedSphereSource>::New();
source->SetPhiResolution(100);
source->SetThetaResolution(100);

// Read texture file
vtkSmartPointer<vtkImageReader2Factory> readerFactory =
    vtkSmartPointer<vtkImageReader2Factory>::New();
vtkImageReader2 *imageReader = readerFactory->CreateImageReader2(fileName.c_str());
imageReader->SetFileName(fileName.c_str());

// Create texture
vtkSmartPointer<vtkTexture> texture =
    vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(imageReader->GetOutputPort());

vtkSmartPointer<vtkTransformTextureCoords> transformTexture =
    vtkSmartPointer<vtkTransformTextureCoords>::New();
transformTexture->SetInputConnection(source->GetOutputPort());

vtkSmartPointer<vtkPolyDataMapper> mapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformTexture->GetOutputPort());

vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetTexture(texture);

vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(.1, .2, .3);

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

vtkSmartPointer<vtkRenderWindowInteractor> renWinInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWinInteractor->SetRenderWindow(renderWindow);

renderWindow->Render();
renWinInteractor->Start();

imageReader->Delete();

return EXIT_SUCCESS;
}

Есть идеи о том, что я могу делать неправильно или пропустить?Заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2019

с вткплоттером Я получаю это (но симметрично с обратной стороны):

    from vtkplotter import Sphere

    s = Sphere().texture('QeXKq.jpg')
    s.show()

enter image description here

textureФункция фактически делает это:

def texture(self, tname):
    """Assign a texture to actor from image file or predefined texture tname."""
    import os

    tmapper = vtk.vtkTextureMapToPlane()
    tmapper.AutomaticPlaneGenerationOn()
    tmapper.SetInputData(self.polydata())
    tmapper.Update()

    tc = tmapper.GetOutput().GetPointData().GetTCoords()
    self.polydata().GetPointData().SetTCoords(tc)
    self.polydata().GetPointData().AddArray(tc)

    fn = settings.textures_path + tname + ".jpg"
    if os.path.exists(tname):
        fn = tname
    elif not os.path.exists(fn):
        colors.printc("~sad Texture", tname, "not found in", settings.textures_path, c="r")
        colors.printc("~pin Available textures:", c="m", end=" ")
        for ff in os.listdir(settings.textures_path):
            colors.printc(ff.split(".")[0], end=" ", c="m")
        print()
        return self

    if ".png" in fn.lower():
        reader = vtk.vtkPNGReader()
    elif ".jp" in fn.lower():
        reader = vtk.vtkJPEGReader()
    else:
        colors.printc("~times Supported texture files: PNG or JPG", c="r")
        return self
    reader.SetFileName(fn)
    reader.Update()
    img = reader.GetOutput()
    atext = vtk.vtkTexture()
    atext.SetInputData(img)
    self.GetProperty().SetColor(1, 1, 1)
    self.SetTexture(atext)
    self.Modified()
    return self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...