2016-11-24 10 views
5

के साथ एकाधिक 3 डी टेक्स्ट ऑब्जेक्ट्स को प्रस्तुत करने के लिए मैं vtk ऑब्जेक्ट vtkVectorText का उपयोग करके पाठ प्रस्तुत करने का प्रयास कर रहा हूं। यह एक 3 डी स्थान के लिए ठीक काम करता है। मुझे 3 डी (vtkPoint) बिंदुओं के ऊपर 3 डी टेक्स्ट रखने की आवश्यकता है। मैंने vtkTextActor3d के साथ ऐसा करने की कोशिश की लेकिन प्रत्येक टेक्स्ट ऑब्जेक्ट को एक अलग अभिनेता की आवश्यकता होती है और मैं 10k कलाकारों के साथ समाप्त हुआ, जो दृश्य को घुमाने के लिए उदाहरण के लिए प्रयास करते समय बहुत खराब और लगी हुई है।वीटीके - एकल अभिनेता

मैं भी एक vtkVectorText सारिणी निर्मित appendFilter की वस्तु से असंरचित ग्रिड और फिर आदेश मेरा वांछित बिंदु स्थानों के साथ असंरचित ग्रिड रेंडर करने के लिए में polydata करने के लिए इसे परिवर्तित करने के लिए कुछ appendFilter लागू करने की कोशिश। यह कुछ भी नहीं दिखाता है क्योंकि मैं यह नहीं समझ सकता कि ऐसा करने का सबसे अच्छा तरीका क्या है।

क्या कोई इस से मेरी सहायता कर सकता है?

यहाँ अंतिम भाग से मेरे कोड है:

vtkSmartPointer<vtkPolyData> pointsHolder = vtkSmartPointer<vtkPolyData>::New(); 
pointsHolder->SetPoints(points); // I assume that these are the points where you want the object to be rendered 
vtkSmartPointer<vtkGlyph3DMapper> glyphMapper = vtkSmartPointer<vtkGlyph3DMapper>::New(); 
glyphMapper->SetSourceConnection(vecText->GetOutputPort()); // this says WHAT should be rendered 
glyphMapper->SetInputData(pointsHolder); // this says WHERE 
textActor->SetMapper(glyphMapper); 

इस प्रस्तुत करना होगा: पाठ प्रत्येक बिंदु के लिए एक ही है

vtkSmartPointer<vtkAppendFilter> appendFilter = vtkSmartPointer<vtkAppendFilter>::New(); 
//for each point 
for (int i = 0; i < N;i++) { 
    vtkSmartPointer<vtkVectorText> vecText = vtkSmartPointer<vtkVectorText>::New(); 
    vecText->SetText("My text, needs to appear multiple times"); 
    vecText->Update(); 
    appendFilter->AddInputData(vecText->GetOutput()); 
    appendFilter->Update(); 
} 
vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid = appendFilter->GetOutput(); 
unstructuredGrid->Allocate(N); 
unstructuredGrid->SetPoints(points); 
vtkSmartPointer<vtkGeometryFilter> geometryFilter = vtkSmartPointer<vtkGeometryFilter>::New(); 
geometryFilter->SetInputData(unstructuredGrid); 
geometryFilter->Update(); 
vtkSmartPointer<vtkPolyDataMapper> textMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 
textMapper->SetInputConnection(geometryFilter->GetOutputPort()); 
vtkSmartPointer<vtkActor> textActor = vtkSmartPointer<vtkActor>::New(); 
textActor->SetMapper(textMapper); 
textActor->GetProperty()->SetColor(0, 1, 0); 

renderer->AddActor(textActor); 

उत्तर

1

हैं, तो मैं एक ग्लिफ़ के रूप में उपयोग का प्रस्ताव होगा "पॉइंट्स" सरणी में सभी बिंदुओं पर टेक्स्ट (जो मुझे लगता है कि उन पदों के साथ एक vtkPoints सरणी है जहां आप टेक्स्ट को प्रस्तुत करना चाहते हैं)। इस तरह आप सभी प्रकार की चीजें कर सकते हैं जिन्हें आप एक जाल में जोड़ते समय नहीं कर सकते हैं, जैसे कि प्रत्येक ग्लिफ के लिए एक स्केल सरणी प्रदान करके अलग-अलग आकार सेट करना या उन्हें मास्क सरणी आदि प्रदान करके इंटरैक्टिव रूप से चालू/बंद करना, देखें http://www.vtk.org/doc/nightly/html/classvtkGlyph3DMapper.html

यदि पाठ प्रत्येक बिंदु के लिए अलग हो सकता है, तो आपको शायद इसे जोड़ने का तरीका करना होगा। मैं आपके संलग्न कोड में कुछ बग देख सकता हूं:

1) पहले एक छोटा प्रदर्शन एक - संलग्न करें फ़िल्टर-> अद्यतन(); केवल एक बार, सभी इनपुट सेट करने के बाद।

2)

unstructuredGrid->Allocate(N); 
unstructuredGrid->SetPoints(points); 

आवंटित बुला करके, आप बस सब कुछ appendfilter आप के लिए किया है resetted। इसके बिना भी, दूसरी पंक्ति टेक्स्ट के लिए जेनरेट किए गए सभी बिंदुओं के लिए पदों को फिर से लिख देगी। एपेंड फ़िल्टर का आउटपुट बस आपको अपने मैपर को सीधे असाइन करना चाहिए, इन दो लाइनों को हटा देना होगा। बस साथ ही vtkGeometryFilter, मुझे इसके लिए कोई कारण नहीं दिख रहा है (मुझे लगता है कि आपने vtkUnructructuredGrid के बजाय vtkPolyData प्राप्त करने के लिए इसका उपयोग किया - vtkAppendFilter के बजाय vtkAppendPolydata का उपयोग करें, यह सीधे पॉलीडाटा का उत्पादन करेगा)।

3) हालांकि, अब "अंक" सरणी का उपयोग नहीं किया जाता है, यानी आपका टेक्स्ट सही स्थिति में नहीं होगा। इससे पहले कि आप इसे संलग्न फ़िल्टर में असाइन करने से पहले प्रत्येक टेक्स्ट इंस्टेंस के लिए पॉलीडेटा को बदलना होगा। सरल "आपके" बिंदु "सरणी के बिंदुओं का उपयोग अनुवाद वैक्टर के रूप में करना होगा, इसलिए आप एपेंड फ़िल्टर में भेजने से पहले vecText-> GetOutput() के प्रत्येक बिंदु पर बिंदु के निर्देशांक जोड़ देंगे, इसलिए कुछ ऐसा:

vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New(); 
//for each point 
for (int i = 0; i < N;i++) { 
    vtkSmartPointer<vtkVectorText> vecText = vtkSmartPointer<vtkVectorText>::New(); 
    vecText->SetText("My text, needs to appear multiple times"); 
    vecText->Update(); 
    vtkPolyData *output = vecText->GetOutput(); 
    double *location = points->GetPoint(i); 
    for (int j = 0; j < output->GetNumberOfPoints(); j++) { 
     double *point = output->GetPoint(j); 
     output->GetPoints()->SetPoint(j, point[0] + location[0], point[1] + location[1], points[2] + location[2]); 
    } 
    appendFilter->AddInputData(output); 
} 
appendFilter->Update(); 

यदि आप उदाहरण के लिए टेक्स्ट को केंद्र में रखना चाहते हैं तो कुछ और चालाक की आवश्यकता होगी।

संबंधित मुद्दे