Estou tentando renderizar um terreno suave com o Direct3D. Eu tenho uma grade 50 * 50 com todos os valores de y = 0 e um conjunto de pontos 3D que indicam a localização na grade e a profundidade ou altura do "vale" ou "colina". Eu preciso aumentar ou diminuir os valores y dos vértices da grade, dependendo de quão próximos eles estejam de cada ponto 3D. Assim, no final, eu deveria ter um renderizador de terreno suave.
Não tenho certeza de que maneira eu posso fazer isso. Eu tentei alterar a altura dos vértices com base na distância de cada ponto usando apenas esta fórmula básica:
dist = sqrt(a² + b² + c²)
onde a, bec são as distâncias x, ye z de um vértice a um ponto 3D. O resultado que recebo com isso não é nada fácil.
Estou pensando que provavelmente existe uma maneira melhor.
Aqui está uma captura de tela do que eu tenho no momento: https://dl.dropbox.com/u/2562049/terrain.jpg
fonte
$dist = \sqrt{a^2 + b^2 + c^2}$
.Respostas:
Existe algo de especial nesses pontos 3D porque parece que você está apenas tentando renderizar um mapa de altura. Fazer vários cálculos de distância até um número arbitrário de pontos 3D não é a melhor maneira de fazer isso.
Aqui está um tutorial simples do DX9 sobre como renderizar um mapa de altura.
O conceito básico é que você tem uma imagem 2D que representa deslocamento. Portanto, a localização do pixel (X, Y) corresponde a um vértice (X, Z) e a cor do pixel representa um valor de altura (Y) para o vértice.
A parte boa do uso de uma imagem é que é muito intuitivo para o desenvolvedor criar e / ou modificar visualmente o terreno.
Edição: olhou para a imagem. Parece estar funcionando para mim, presumo que você não esteja feliz com a queda do efeito? Alise ao nível do solo e depois um pico no seu ponto 3D.
Se você pegasse alguma de suas montanhas / vales e as imaginasse em 2D e as cortasse ao meio, veria uma curva que se parece com a da esquerda e acho que você quer uma que se pareça com a da direita.
Em vez de procurar a distância 3D para o seu ponto 3D, sugiro olhar para a distância 2D, ignorando a altura. Então, para cada vértice dentro de alguma queda pré-determinada, aplique a altura aos seus vértices com base em uma curva de entrada / saída fácil.
fonte
Se você deseja criar colinas suaves, pode usar o método de filtragem de caixa. Entretanto, esteja avisado: se você quiser bordas afiadas do penhasco, o método apenas suavizará as bordas.
Aqui está o link para ele no GameDev.net: Filtragem de caixas para Rolling Hills Suave
O código pressupõe que você esteja usando um mapa de altura, mas a partir de sua solução, uma mudança fácil de fazer é apenas percorrer a lista de pontos 3D (mapeando esses pontos 3D para o vértice apropriado, como você está fazendo agora).
fonte