Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible issue with velocity decay #12

Open
jwretham opened this issue Jun 5, 2023 · 0 comments
Open

Possible issue with velocity decay #12

jwretham opened this issue Jun 5, 2023 · 0 comments

Comments

@jwretham
Copy link

jwretham commented Jun 5, 2023

Hi Thomas, hope you're good.

I make generative art/animation (mostly in R) and I've been exploring your brilliant Particles library (inspired by your art) as I think there's massive potential for some really interesting pieces. Hoping I can get your help with an issue which could be a bug (but more likely I'm just misunderstanding something)

I'm working on some code where I want to create a simulation which reacts to a new (randomly generated) field force every 10 evolutions (10 is an arbitrary number - eventually this will be triggered by an audio input). Each evolution is plotted and exporting, capturing the simulation.

The idea is that the particles in the simulation will be 're-energised' every 10 frames, energetically reacting to the new field force.

What I'm finding however is that even though I have the velocity decay set to 0, the velocity decays to 0 after 20 frames or so and the following field forces don't have any effect.

I suspect I'm doing something wrong with the 'reheat' function but I can't find much in the way of documentation/examples.

Was wondering if you could possibly take a look at my code and let me know if you can see where I'm going wrong?

library(particles)
library(tidygraph)
library(ggplot2)
library(tidyr)
library(scales)
library(av)

root_dir <- "C:\\Local workspace\\Art\\simulations\\frames"

# function  to create flow field
generate_field_function <- function(size=10){
  
  # generate input
  grid <- long_grid(seq(1, size, length.out = size*size), seq(1, size, length.out = size*size))
  
  # generate perlin grid
  grid$noise <- gen_perlin(grid$x, grid$y)
  
  # rescale and reformat
  grid <- as.data.frame(grid)
  grid$noise <- scales::rescale(grid$noise, to=c(0,7))
  grid <- grid %>% pivot_wider(names_from = x, values_from = noise)
  colnames(grid) <- paste0("V",1:size*size)
  grid <- as.matrix(grid)
}


plot_function <- function(sim){
  
  # count number of existing files (used as counter)
  count_existing_files <- length(list.files(root_dir))
  new_file <- count_existing_files + 1
  
  # plot
  plt <-
    ggplot(as_tibble(sim)) + 
    geom_point(aes(x, y), size = 0.5, stroke=0.5, alpha=1) +
    theme_void()
  
  # save plot to directory
  frame_no <- str_pad(new_file, 4, pad = "0")
  dir.create(file.path(root_dir), showWarnings = FALSE)
  ggsave(paste0(frame_no,".png"),  plot = plt,  device = png, path = root_dir, height=600, width=600,  units="px")
  
  # if frame multiple of 10 then generate new flow field and reheat simulation
  if(new_file %% 10 == 0){
    
    print("new grid")
    
    new_grid <- generate_field_function(10)
    
    new_sim <- sim %>%
      unwield(1) %>%
      wield(field_force, angle=new_grid, vel=1) %>%
      reheat(1) 
    
    return(new_sim)
  }
}

# generate initial flow gird
grid <- generate_field_function(10)
  
# run simulation
create_empty(1000) %>% 
  simulate(setup = aquarium_genesis(), alpha_decay=0) %>% 
  wield(field_force, angle=grid, vel=1) %>% 
  evolve(100, on_generation= plot_function) 

# generate video from exported plots
png_files <- list.files(root_dir, pattern = ".*png$", full.names = TRUE)
av_encode_video(png_files, "C:\\Local workspace\\Art\\simulations\\simulation_export_1.mp4",
                framerate = 10)

Any ideas/tips you can give are appreciated

Thanks

Joe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant