Renderização suave do terreno


7

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


11
Por um lado, a fórmula que você forneceu é a distância ao quadrado, não a distância. Deveria ser $dist = \sqrt{a^2 + b^2 + c^2}$.
James King

2
Sua captura de tela está quebrada. Eu sugiro enviá-lo para imgur ou algo assim.
Tetrad

Respostas:


4

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.

texto alternativo

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.


Não, não estou renderizando um mapa de altura. Eu só tenho alguns "pontos de altura", eles indicam onde pode estar o topo de uma colina ou vale, mas não há um valor de altura para cada vértice. Eu postei uma captura de tela, pode ajudar.
dotminic

Sim, eu resolvi isso sozinho depois que postei essa pergunta, usando uma curva Quartic de um mecanismo de interpolação AS3. Eu ainda estava sentindo falta da queda predeterminada. Muito obrigado por sua ajuda.
dotminic

2

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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.