Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (11)
......@@ -3,13 +3,14 @@
#include "common.cuh"
// na razie sa tutaj tylko pomocnicze funkcje, ale w przyszlosci pewnie trzeba bedzie dopisac fragmenty odpowiedzialne za stworzenie gridu na podstawie pliku wejsciowego
// wystapuja w funkcjach, wyznaczane po wczytaniu siatki modelu
// siatka jest prospopadloscianem, ponizsze to liczby podzialow scian prostopadlosianu
__device__ int n_x_grid;
__device__ int n_y_grid;
__device__ int n_z_grid;
// laczna liczba wezlow siatki
__device__ int n_grid_nodes;
......@@ -18,15 +19,15 @@ __device__ int n_grid_nodes;
// TRZEBA WCZYTA
__device__ Precision h;
// funkcje pomocnicze zwiazane z dzialaniem na siatce
// zwraca indeks wezla (w tablicy wezlow) na podstawie jego bezwymiarowego polozenia (wspolrzedne x, y, z podzielone przez h)
//constexpr Precision x_simulation_box = 1.0;
//constexpr Precision y_simulation_box = 1.0;
//constexpr Precision z_simulation_box = 1.0;
__host__ __device__ int grid_index_grid(int x, int y, int z);
// odwrownie niz poprzednia, nie zwraca wartosci, wspolrzedne przekazujemy przez referencje
__host__ __device__ void get_coordinates(int index, int& x, int& y, int& z);
// do latwego dostania sie do sasiadow wezla
__host__ __device__ void get_neighbors(int index, int* neighbors);
#endif
#endif
\ No newline at end of file
......@@ -4,27 +4,6 @@
#include "common.cuh"
//#include <limits>
// struct odpowiadajacy za wezly siatki
// x - polozenie wezla
// v - predkosc w wezle (wezel nie porusza sie fizycznie, predkosc tutaj jest raczej traktowana jak pole wektorowe)
// f - sila wyliczana w trakcie obliczen w wezle
// m - masa w wezle, obliczana przy interpolacji z czastek na siatke
// v_old - pole do zapamietywania predkosci sprzed jej uaktualnienia, predkosc ta jest potrzebna w kilku innych miejscach
// vector_dist - obecnie nie uzywane
// dist - obecnie nie uzywane
// ostatnie dwa pola nie sa uzywanie w kodzie obecnie
// oto wytłumacznie
// w trakcie prac rozwazano dwa podejscia do rozwiazania SDF i siatki do Marching Cubes
// 1. uzywanie do SDF i Marching Cubes tego samego gridu co do obliczen
// (zaleta - mniej pamieci, wada - rozdzielczosc kolizji, wstawiania czastek i triangularyzacji rowna rozdzielczosci siatki obliczeniowej
// 2. uzywanie osobnych siatek do SDF i Marching Cubes
//
// Ostatecznie wybrano druga opcje
// Nie wystarczylo jednak czasu na przetstowanie, czy siatki o roznych rozdzielczosciach dzialaja
// Wszystkie obliczenia prowadzono na siatkach o tej samej rozdzielczosci
struct Node {
Vector x;
Vector v;
......@@ -45,4 +24,4 @@ struct Node {
}
};
#endif
#endif
\ No newline at end of file
......@@ -3,25 +3,6 @@
#include "common.cuh"
// struct do czasteczek, na ktorych prowadzona jest symulacja
// x - polozenie czastki
// v - predkosc czastki
// a - przyspieszenie - moze sie okazac niepotrzebne
// Fe - tensor odksztalcen sprezystych
// Fp - tensor odksztalcen plastycznych
// velocity_gradient - gradient predkosci, wyznaczany w trakcie obliczen
// m - masa czastki
// V - objetosc czastki, inicjalizowana po pierwszej interpolacji z czastek na siatke
// rho - gestosc czastki
// weight_gradients - tablica do przechowywania gradientow wag w danym kroku czasowym
// weights - tablica do przechowywania gradientow wag w danym kroku czasowym
// zapamietanie ich w czastce sprawia, ze nie trzeba ich liczyc wielokrotnie
// wyznaczane sa w trakcie wykonywania interpolacji particle to grid
// w przypadku trojwymiarowym maksymalnie moze ich byc 64, w 2D 16
// maksymalna liczba wynika z funkcji interpolacyjnych/wag, dana czastka moze wplywac
// na wezly siatki bedace w odleglosci 2h w kazda strone
struct Particle {
Vector x;
Vector v;
......@@ -78,4 +59,4 @@ struct Particle {
}
};
#endif
#endif
\ No newline at end of file
{
"material": {
"theta_c": 1.9e-2,
"theta_s": 7.5e-3,
"xi": 10.0,
"rho_0": 100,
"E_0": 150000,
"nu": 0.2
},
"time": {
"t_0": 0.0,
"t": 0.0,
"dt": 0.00025,
"t_end": 50
},
"simulation": {
"sticky": 0.0,
"alpha": 0.95,
"particle_diameter": 0.0144
},
"grid": {
"hh": 0.03125,
"isolevel": 0.001,
"MARCHING_CUBES_EPSILON": 0.000001
},
"animation": {
"step": 10
},
"base_path": "C:\\projekt_badawczy\\config\\test\\",
"paths": {
"result_name": "zderzenie_kul_prosto",
"result_path": "animacja\\",
"walls_name": "kule_wprost_walls.obj",
"walls_path": "",
"snow_objects_paths": [ "", "" ],
"snow_objects_names": [ "kule_obok_kula1.obj", "kule_obok_kula2.obj" ],
"snow_block_velocities": [
[ 0, 10, 0 ],
[ 0, -10, 0 ]
],
"snow_block_rotation": [
[ 0, 0, 0 ],
[ 0, 0, 0 ]
],
"snow_block_rho": [ 100, 100 ]
}
}
......@@ -6,14 +6,6 @@
#include "common.cuh"
#include "obj_loader.cuh"
// struct do emitera czastek
// w obecnej wersji emitery nie do konca dzialaja
// mozliwe jest dodawanie czastek na scene, ale
// poczastkowe czastki moga miec zle wyznaczona objetosc,
// poza tym trzeba dobrze dobrac liczbe czastek na krok czasowy
// na razie to tu zostawiam, ale ze wzgledu na slabe dzialanie, byc moze usuniemy z kodu
struct Emitter {
Mesh mesh;
......@@ -40,4 +32,4 @@ struct Emitter {
}
};
#endif
#endif
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -11,14 +11,12 @@ struct Vec2 {
float u, v;
};
// do przechowania trojkatow z .obj
struct Triangle {
int vertexIndices[3];
int texcoordIndices[3]; // tekstury
int normalIndices[3];
};
// do przechowywania siatki z pliku .obj
struct Mesh {
std::vector<Vector> vertices;
std::vector<Vec2> texcoords; // tekstury
......@@ -32,8 +30,6 @@ bool loadOBJ(const std::string& filename, Mesh& mesh);
// do wyznaczenia bounding box siatki
void bounding_box(const Mesh& mesh, Precision& x_min, Precision& y_min, Precision& z_min, Precision& x_max, Precision& y_max, Precision& z_max);
// do wyswietlania siatki .obj w OpenGL, obecnie nie jest wykorzystywane
// samo wyswietlanie w opengl moze sie przydac do celow debugowania
void renderOBJ(Mesh& mesh);
// iloczyn wektorowy
......@@ -45,4 +41,10 @@ Precision dot(const Vector& a, const Vector& b);
// liczymy objetosc siatki
Precision calculateVolume(const Mesh& mesh);
#endif
// najwyrazniej nie bylo potrzebne
//// bounding box
//struct bbox {
// Precision x_min, x_max, y_min, y_max, z_min, z_max;
//};
#endif
\ No newline at end of file
......@@ -8,13 +8,7 @@
#include "Grid.cuh"
// wezel do siatki do SDF
// dist_vec - wektor wodzacy, od wezla do sciany
// signed_dist - dluugosc wektora, ze znakiem, jezeli ujemna, to znaczy, ze wezel po stronie przeciwnej do wektora normalnego sciany
// innymi slowy jezeli wektor normalny najblizszej sciany jest skierowany w strone wezla
// to odleglosc jest dodatnia
// x - polozenie wezla
struct SDF_Node {
Vector dist_vec; // w niektorych sytuacjach mozna traktowac jako normalny (sa zwrocone w te sama strone)
......@@ -30,7 +24,6 @@ struct SDF_Node {
};
// do obliczen
struct ClosestPointResult {
Vector closestPoint;
Vector normal;
......@@ -68,15 +61,32 @@ const Precision wall_distance_neighbour(const Node* grid, const size_t grid_inde
//__host__ __device__ const Precision normal_vector_interpolation(const Vector& point, const Mesh& walls);
// w przypadku gdyby SDF byloby wykonywane w kazdym kroku obliczeniowym
// (np. jakby siatka sie poruszala, postac idzie w sniegu, samochod jedzie po sniegu)
// to nalezy zrownoleglic liczenie SDF np. przez FSM
// dodatkowo mozna zastosowac interpolacje pomiedzy krokami czasowymi
//void SDF(Mesh& Walls, std::vector<Node> Grid);
// chyba lepiej zrobic osobna strukture grid do sdf, nie musi wtedy miec tej samej rozdzielczosci co siatka (chociaz moze nie miec sensu zeby miala lepsza)
// 1. odleglosc punktu od trojkata
// - trzeba znalezc, przy pomocy triangle_distance
// 2. odleglosc pomiedzy sasiednimi punktami, a odleglosc od sciany
// - minimum z (odleglosc * wektor do sciany + wektor do tego saiada)
// 3. idziemy po trojkatach
// - szukamy min, max z x, y, z,
// - x / h, przerzucone na inty (do max dodac 1) - uzyskujemy indeks w grid
// - w petli w szescianie min x, max x, ..., max z liczymy odleglosci grid od trojkatow
// - ustalamy znak na podstawie wektora normalnego
// - atomicmin (pewnie z abs), albo cos takiego
// 4. FSM
//
#endif
#endif
\ No newline at end of file