Show HN: simulação de plantas 3D no navegador
(plant.max-richter.dev)- Plantarium é um sistema para montar plantas 3D com nós no navegador, e é necessário um output node para criar a planta final
- A estrutura básica da planta é criada pelo nó Stem, e as entradas
origin,height,thiccness,minThiccnesseamountajustam posição, altura, espessura e quantidade dos caules - A repetição e variação de valores ficam por conta dos nós Vec3 e Parameter, adicionando mudanças aleatórias aos valores padrão para que a planta pareça menos uniforme
- As mudanças de forma são controladas pelos nós Rotate, Gravity e Noise, que recebem como entrada eixo e ângulo de rotação, modo de gravidade, tamanho e intensidade do ruído
- As folhas são criadas com os nós Leaf, Shape e Instance e posicionadas ao longo do caule ou dos galhos, com possibilidade de definir tamanho, intervalo, quantidade, rotação e condições de profundidade
Saída final do grafo de nós
- Todo sistema de nós precisa de um nó
outputpara gerar o resultado final outputrecebe a entradaplante compõe o resultado completo da planta
Geração de caules e controle de posição
- O nó Stem cria o caule principal da planta
_origin_: posição em que o caule será colocado; é possível conectar um nóvec3height: altura do caulethiccness: espessura do cauleminThiccness: espessura mínima_amount_: quantidade de caules a instanciar
- O nó Vec3 produz valores
x,yez- Para distribuir os caules, é possível conectar um nó
randomouparameter
- Para distribuir os caules, é possível conectar um nó
Variação de valores e aleatoriedade
- O nó Parameter produz um valor aplicando uma variação aleatória fixa sobre o valor base
_value_: valor base ao qual a variação será aplicada_variation_: quantidade de variação aplicada ao valor base
Parameteré usado repetidamente em várias entradas, como caule, rotação, gravidade, curvas e valores de slider
Mudando a forma com rotação, gravidade e ruído
- O nó Rotate gira a planta de acordo com o eixo e o ângulo definidos
input: alvo da rotação_axis_: eixo de rotação_aroundOrigin_: se deve rotacionar em torno de0,0,0smooth: entrada relacionada à suavidade da rotação_spread_: quando vários objetos estão conectados, define se giram como um só ou se são espalhados ao girar_angle_: ângulo de rotação
- O nó Gravity aplica uma gravidade simples a galhos e caules
input: alvo da gravidadecurviness: grau de curvatura_type_: modo de cálculo da gravidade; atualmente apenassimpleetestfuncionamstrength: intensidade da gravidade
- O nó Noise aplica ruído aos galhos de entrada
plant: planta de entradasize: tamanho do ruídostrength: intensidade do ruído
Criação de folhas e posicionamento no caule
- O nó Leaf gera o modelo da folha, que pode ser instanciado ao longo do caule com o nó
Instance_shape_: forma de cada folha; é possível conectar um nóshape_curvature_: curvatura da folha nas direções x/y; é possível conectar um nóvec2
- O nó Shape produz uma única forma que pode ser conectada ao nó
Leaf - O nó Instance posiciona o modelo de entrada ao longo de um caule ou galho
input: entrada de referência para o posicionamentomodel: modelo a ser posicionadoalignRotation: alinhamento de rotaçãoalternateRotation: rotação alternada_size_: tamanho de cada folha_instanceRange_: intervalo em que as instâncias serão posicionadas_amount_: quantidade de folhas a posicionarrotation: valor de rotaçãooffsetBySize: deslocamento de acordo com o tamanho_depth_: define em quantas camadas de galhos as folhas serão colocadas
- Alpha possui valores
minemax
1 comentários
Opiniões no Hacker News
Realmente útil e incrível em vários aspectos
O editor de grafos de nós baseado no navegador é bem-feito, permite criar malhas 3D procedurais, ainda faz exportação para .obj, e a licença é permissiva, então parece que pode virar a semente de várias ferramentas procedurais
Tenho muitas ideias do que dá para fazer com esta ferramenta e provavelmente vou acabar escrevendo minha monografia de graduação sobre ela
A complexidade impressiona
Para quem quiser mexer rapidamente, o tutorial é bom, mas leva alguns minutos até chegar à parte divertida; então vale ajustar os sliders no painel da direita para ver como a samambaia muda
Além disso, ao clicar em library para carregar outros modelos, você entende na hora o que dá para fazer
Pelo fato de ainda não haver modelos de brincadeira entre os enviados por usuários, dá para sentir que é um projeto que acabou de sair
Espero que aguente bem ;)
Parece muito bom, mas há um pequeno problema
Quando se altera um valor, a forma da planta muda e a câmera fica se reajustando o tempo todo, parecendo que a câmera está tremendo, e pessoalmente isso me incomoda bastante
Seria bom poder fixar a câmera enquanto os parâmetros são alterados
Acho que seria bom adicionar debounce ao recentramento automático da câmera :)
Projeto legal, mas agora parece que as plantas não estão sendo renderizadas
Há 20 minutos elas renderizavam, então provavelmente foi afetado pelo tráfego do HN
O código está todo online e a documentação também é excelente. Na verdade, este projeto também tem um backend de servidor
https://github.com/jim-fx/plantarium/tree/main
https://github.com/jim-fx/plantarium/blob/main/ARCHITECTURE....
Vou voltar daqui a alguns dias para ver quando estiver funcionando
Há um ano, fiz algo parecido porque queria experimentar Rust como engine de webapp
Compilava para wasm e rodava em um servidor web em Rust; o resultado está em https://blomma.lorentz.app
Mas este projeto é muito melhor do ponto de vista de produto, especialmente porque o editor de grafos de nós é um verdadeiro ponto forte
Ele se integra bem ao fluxo de trabalho e faz parecer um produto que qualquer pessoa pode usar, não apenas uma ferramenta de depuração
Se houver algo melhor do meu lado, talvez seja apenas o uso de curvas de Bézier tanto para o formato das folhas quanto para o formato dos caules
Acertar a topologia e a triangulação foi bem difícil, mas foi ótimo para uma introdução a quatérnios e para revisar trigonometria. Recomendo tentar criar um nó de curva de Bézier
Reescrever o gerador de geometria em Rust/Wasm está bem seriamente no roadmap
No momento estou me familiarizando com Rust fazendo Advent of Code
Muito legal! Gostei do parâmetro de thiccness do caule :)
Acho que programadores tendem a levar seus projetos, ou a si mesmos, a sério demais, então gosto de colocar um pouco de brincadeira aqui e ali
Gostei muito!
Tenho algumas sugestões de melhoria de usabilidade
Primeiro, se você move o mouse sem querer para fora da caixa e solta, o arrasto passa a se comportar como um bug. O mouse-up não é reconhecido, então o parâmetro fica preso no estado de mouse-down
Isso dificulta desenhar no editor de folhas ou alterar parâmetros arrastando, como em sliders. Talvez baste registrar o handler de evento de mouse-up em um ancestral comum, em vez de na caixa do editor de nós do grafo
Segundo, os pequenos handles circulares de porta de parâmetro usados para arrastar conexões são um pouco pequenos. Especialmente quando você dá zoom out para ver uma boa parte da cena
Acho que aumentar só a área de clique em cerca de 25%, sem mudar o elemento gráfico em si, melhoraria a usabilidade
Para referência, estou usando Firefox. O problema do mouse handler também acontece no Chromium, mas o arrasto de conexões entre nós parece um pouco mais usável no Chromium
Eu costumo ficar meio cego para esses pequenos bugs de usabilidade, então isso é muito valioso
Acho que os dois serão corrigidos nos próximos dias :)
Para quem não sabia: o painel da direita pode ser deslizado para revelar mais parâmetros e controles
Fantástico
Mal posso esperar para ver uma floresta inteira feita de plantas algorítmicas crowdsourced
Está ligado a algum projeto científico? Também seria legal ter um recurso de botânico de IA que diga qual a chance de a planta sobreviver, qual seria a classificação taxonômica mais próxima, ou uma boa receita para acompanhar arroz branco
Não está ligado a um projeto científico; foi feito apenas por um nerd que gosta de plantas
Ainda assim, dá para anexar um ID do gbif.org ao projeto, e então informações adicionais são carregadas pela API do gbif :)
Excelente! Se também fosse possível adicionar um nó de tempo, acho que animações básicas se tornariam possíveis
No geral, é um projeto adorável
A parte complicada provavelmente seria integrar animação sem recriar a malha inteira a cada frame
Mas exportar um skeleton pelo gerador e depois animar a planta com ele parece que seria bem fácil