2.3.3. Thuật toán
2.3.3.1. Hệ thống mass-spring
Trước tiên, các spring được tạo và sau đó là các particle. Mỗi vòng lặp của hệ
thống massy-spring thì được thực hiện với một giải thuật Euler sửa đổi.
Ở đây, chỉ có các spring tuyến tính mới được sử dụng. Chúng được xây dựng dựa trên cơ sở số lượng tóc được nhìn thấy. Độ dài rest của các spring thì dựa vào giới hạn độ dài được lựa chọn trước đó.
Sau khi các spring được xây dựng thì các particle thực tế được tạo ra. Các particle thì được chia ra n particle cho mỗi sợi, với điều kiện n=8. Particle đầu tiên của mỗi sợi thì được cố định trên bề mặt. Các particle còn lại trong sợi này thì lớn lên ra ngoài về hướng bình thường của hình dạng cơ sở. Độ quăn và độ dài của mỗi particle này được xác định dựa trên giới hạn độ dài và góc rest được lựa chọn trước đó. Mass của mỗi particle thì được thiết lập tới 1 (tập hợp tới 1). Các véctơ lực và vận tốc của mọi particle thì được thiết lập tới 0.
Thuật toán 1: Mô tả quá trình xây dựng các particle.
COPYV(particles[i*parts].p , surf[k]); MAKEV(particles[i*parts].v, 0.0f, 0.0f, 0.0f) MAKEV(particles[i*parts].f, 0.0f, 0.0f, 0.0f) for (j=1..parts) MAKEV(particles[i*parts+j].v, 0.0f, 0.0f, 0.0f) MAKEV(particles[i*parts+j].f, 0.0f, 0.0f, 0.0f) if (nx==0) particles[i*parts+j].p.x=
randomp(restang)+particles[i*parts].p.x; else particles[i*parts+j].p.x= -nx*randomp(leng)+particles[i*parts+j-1].p.x; if (ny==0) particles[i*parts+j].p.y = randomp(restang)+particles[i*parts].p.y; else particles[i*parts+j].p.y = -ny*randomp(leng)+particles[i*parts+j-1].p.y; if (nz==0) particles[i*parts+j].p.z = randomp(restang)+particles[i*parts].p.z; else particles[i*parts+j].p.z = -nz*randomp(leng)+particles[i*parts+j-1].p.z; 2.3.3.2. Các lực ngoài
Người dùng lựa chọn lực ngoài, như: gravity, wind và damping. Wind và gravity thay đổi hướng với mười lần vòng lặp của hệ thống mass-spring.
Giải thuật tiếp theo, cho phép lực được thêm vào thực sự đối các lực bên trong của mỗi particle mà nó không cố định trên bề mặt. Ở lực thứ nhất của mỗi particle được thiết lập tới 0, sau đó nếu particle này không cố định trên bề mặt thì lực wind và gravity được thêm vào.
Thuật toán 2: Mô tả quá trình thêm lực vào mỗi particle
For (i=0 ... particles)
MAKEV(particles[i].f, 0.0f, 0.0f, 0.0f) if (particles[i].fixed) continue;
ADDV(particles[i].f, wind);
particles[i].f.y +=gravity *particles[i].m;
2.3.3.3. Các điểm điều khiển
Mỗi sợi riêng lẻ sẽ được xây dựng mô hình bằng bề mặt hình trụ NURBS xoắn
với n điểm điều khiển, độ 2 và chia thành 20x20. Mỗi hình trụ này gồm một độ dày
và độ dài nhất định. Một đường tròn xác định bề dày của sợi hình trụ này. Trước
được tạo ra. Sau đó, các điểm nút v đối với các điểm điều khiển đường tròn này được tạo ra.