É possível usar um Multipatch para implementar o IFeatureRenderer.Draw em um renderizador personalizado

8

Eu tenho um renderizador personalizado que precisa renderizar geometria modificada. Todos os recursos de entrada são recebidos através dos IFeatureCursorelementos as polygon. (Isso é semelhante a este exemplo , embora eu não esteja renderizando pontos.)

Eu posso renderizar polígonos, linhas e pontos facilmente, passando a nova geometria IFeatureDraw.Drawou chamando IDisplay.DrawPolygon/ IDisplay.DrawPoint/ etc.

No entanto, IDisplaynão fornece um mecanismo para desenhar um multipatch e transmiti-lo como geometria para IFeatureDraw.Drawresultar em nada desenhado na tela.

Existe uma maneira de "desenhar" diretamente um elemento multipatch (preferencialmente com texturização) dentro desse método?

Reed Copsey
fonte
Isso está no monitor 2D (ArcMap) ou no ArcScene ou Globe?
Craig Williams
@ Craig: Isso precisa ser suportado nos três, embora eu esteja disposto a usar vários caminhos de código para lidar com isso. Isso é para uma fonte de dados de plug-in, portanto, o suporte precisará ser "global".
Reed Copsey

Respostas:

3

Como Craig diz, o OpenGL é o caminho a seguir para o 3D.

Consulte Criando um aplicativo ArcGIS Engine com C-Sharp e OpenGL . As versões anteriores do ArcGIS Explorer também suportavam chamadas OpenGL , mas na última vez que verifiquei, o Esri não é mais compatível.

Não sei por que eles fizeram isso - o desenho do OpenGL realmente ajudou a diferenciar o AGX do Google Earth.

Atualizar

Mesmo que o seu plugin retorne multipatches corretamente, não acho que o ArcObjects ofereça métodos para suportar o desenho de multipatches com chamadas OpenGL. Provavelmente seria mais fácil usar apenas o formato nativo (ignorar o plug-in em outras palavras). Eu nunca o usei, mas aqui está um script que mostra como usar o OpenGL com ArcScene .

Kirk Kuykendall
fonte
1

A exibição 2D (IDisplay) não oferece suporte para desenhar multipatches diretamente. Você precisará encobri-las em pegadas (consulte IMultipatch :: XYFootprint para saber como extrair a pegada). Se você deseja uma renderização 2D das texturas de várias patches, precisará criar uma imagem a partir de uma projeção 2D da multipatch e desenhá-la.

Para o 3D, você deve poder retornar vários pacotes múltiplos no cursor e isso funcionará, mas honestamente, a maioria das pessoas implementa uma camada personalizada para o globo e faz seu próprio trabalho no OpenGL.

Craig Williams
fonte
Estou tentando apoiar o ArcScene principalmente (não o Globe), mas também o map / globe como secundário. Infelizmente, retornando multipatches no cursor não trabalho em um conjunto de dados plug-in adequadamente, desde que eu posso dizer ...
Reed Copsey