Em muitos jogos em que o jogador pode ficar embaixo d'água, parece que quando você olha onde a metade superior da tela está no ar e a metade inferior da tela está na água, é quase como se a água não existisse. jogador está ... voando devagar com sons de água?
Existe uma maneira lógica de resolver isso? Um algoritmo? Parece que nenhuma solução surgiu ainda, já que muitos jogos ainda a possuem. Eu não quero cometer o mesmo erro.
3d
rendering
terrain-rendering
water
LiquidFeline
fonte
fonte
Respostas:
Que tal simplesmente não permitir esta situação?
Não sei como você está fazendo o seu jogo, mas se você detectar que a vista ficará parcialmente embaixo d'água, poderá forçar a câmera a ficar acima da água, e somente quando toda a vista estiver abaixo da água, você poderá mudar para o visão subaquática.
Dependendo de como você faz isso, isso pode significar um atraso adicional a partir do momento em que você começa a mergulhar e quando realmente vê a cena por baixo da superfície. Isso pode ser uma coisa boa do ponto de vista da experiência do usuário, portanto, sinta-se à vontade para experimentar.
Em uma nota separada, mas relacionada, pergunto-me por que a maioria das cenas subaquáticas fica cristalina ... Se você colocar a cabeça debaixo d'água, notará que seus olhos não foram projetados para visão subaquática e, portanto, tudo parece embaçado. Você teria que usar óculos para realmente ver claramente debaixo d'água.
Além disso, as coisas parecem (e ouvem) muito diferentes debaixo d'água do que acima da água. A água absorve a luz muito mais rapidamente que o ar; portanto, quanto mais a luz viaja, menos luz chegará aos seus olhos. Isso significa que, quanto mais fundo você vai, mais azuis ficam as coisas (a luz vermelha tem menos energia e, portanto, é absorvida mais facilmente do que a luz azul). De fato, a meros 12 metros debaixo d'água, o sangue parece preto, não vermelho.
Ainda não vi um jogo não especializado que até tenta acertar ambientes subaquáticos ...
fonte
O problema a que você está se referindo tem a ver com o volume de visualização da câmera cortando o plano de água; "efeitos subaquáticos" típicos são feitos por meio de efeitos pós-processo em tela cheia e não pareceriam corretos se a exibição fosse cortada dessa maneira (seria apenas o problema oposto).
Mesmo que você se preocupe em detectar a caixa de recorte (potencialmente difícil) e em tesoura ou recortar o efeito subaquático em tela cheia, de modo que ele se aplique apenas à cena subaquática (que é uma solução potencial que você pode explorar), você ainda terá o problema do próprio plano de água. A transição ainda haveria um artefato visual estridente. Você poderia detectar esse avião e desfocá-lo intensamente; provavelmente é o mais próximo possível de uma analogia do mundo real do que pode ser a visão através de uma lente de câmera parcialmente submersa.
Como alternativa, evite que isso aconteça completamente: não deixe a câmera abaixo do plano aquático se o jogador estiver "acima" da água ou acima do plano aquático quando o jogador estiver "abaixo" da água. Isso realmente funcionará realmente se você tiver modos de operação discretos para jogadores acima / abaixo da água e funcionará melhor se houver um botão físico ou outra ação clara e óbvia que o jogador possa executar para fazer a transição entre "nadar na superfície" e "nadar abaixo" a superfície."
Em vez de pressionar uma tecla explícita para mergulhar, você pode interpretar o movimento para frente enquanto a câmera é abaixada o suficiente para significar "mergulho". Você pode usar um efeito gráfico (respingos ou o que for) para ocultar a transição da câmera através do plano aquático, que normalmente não seria capaz de atravessar.
Usamos uma técnica como esta em Guild Wars 2.
fonte
Os jogos geralmente ativam algum tipo de efeito, principalmente o nevoeiro azul, quando a câmera está embaixo da água. Para lidar com a situação em que o plano próximo passa pela superfície da água, você pode ativar o shader de nevoeiro quando a câmera se aproxima da superfície da água, mas depois adicionar algum código ao shader de pixel que calcula o ponto no plano próximo correspondente a esse pixel e ativa a névoa apenas se esse ponto estiver sob a superfície da água.
Se o nevoeiro é feito como um pós-processo, renderizando uma passagem em tela cheia, isso é especialmente fácil - basta calcular a posição no espaço mundial de cada vértice do quad ou triângulo da tela cheia no plano próximo (com o inverso matriz de visualização / projeção) e interpole esse valor até o pixel shader; então você pode verificar seu componente vertical e ver se está acima ou abaixo do plano de água.
Para pontos de bônus, você pode usar a mesma técnica para adicionar uma textura de poucos pixels de espessura para representar o menisco na superfície da água, para que não pareça muito com uma linha pontiaguda.
fonte
Eu tenho dois métodos; Um usa um sombreador, o outro pode usar uma GUI. Ambos iniciarão o mesmo:
"Simplificado" -
If, Object(Camera) is in 3d Space(Water bounding box/whatever you choose) trigger a shader/GUI.
Shader dará mais realismo, você pode aplicar uma distorção como esta
Névoa Como Com. Menino afirmou, pode ser aplicado através de GUI. Crie uma foto com transparência parcial e use-a como GUI em toda a exibição da câmera. Para a foto que você forneceu, eu tentaria uma cor marrom.
Isso foi usado em um jogo de terror chamado Drea D Out. Se o jogador se aproximasse de um fantasma, a tela ficaria embaçada. Embora não tenha sido usado debaixo d'água, deu um efeito semelhante :)
Você sempre pode escolher os dois métodos ou criar um sombreador que altere a cor.
fonte