Skip to content
Snippets Groups Projects
Commit eceb24d7 authored by bobarna's avatar bobarna
Browse files

finished skeleton of the document

parent 75048331
Branches
No related tags found
No related merge requests found
...@@ -35,28 +35,36 @@ ...@@ -35,28 +35,36 @@
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Follow-the-Leader (FTL)}{2}{subsection.2.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Follow-the-Leader (FTL)}{2}{subsection.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Position Based Simulation}{2}{section.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3}Position Based Simulation}{2}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Algorithm Overview}{2}{subsection.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Algorithm Overview}{2}{subsection.3.1}\protected@file@percent }
\newlabel{section:algorithmOverview}{{3.1}{2}{Algorithm Overview}{subsection.3.1}{}}
\citation{MullerPBD}
\citation{MullerPBD}
\citation{MullerPBD} \citation{MullerPBD}
\@writefile{loa}{\contentsline {algocf}{\numberline {1}{\ignorespaces pseudo code for the PBD simulation\relax }}{3}{algocf.1}\protected@file@percent } \@writefile{loa}{\contentsline {algocf}{\numberline {1}{\ignorespaces pseudo code for the PBD simulation\relax }}{3}{algocf.1}\protected@file@percent }
\newlabel{alg:pbd}{{1}{3}{Algorithm Overview}{algocf.1}{}} \newlabel{alg:pbd}{{1}{3}{Algorithm Overview}{algocf.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}The Solver}{3}{subsection.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}The Solver}{3}{subsection.3.2}\protected@file@percent }
\newlabel{sec:solver}{{3.2}{3}{The Solver}{subsection.3.2}{}} \newlabel{sec:solver}{{3.2}{3}{The Solver}{subsection.3.2}{}}
\citation{MullerPBD} \citation{MullerPBD}
\citation{PixarVolumetricHair} \citation{UmenhofferSimulation}
\citation{FTLHair}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Distance Constraint}{4}{subsection.3.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Distance Constraint}{4}{subsection.3.3}\protected@file@percent }
\newlabel{section:DistanceConstraint}{{3.3}{4}{Distance Constraint}{subsection.3.3}{}}
\newlabel{eq:distance_constraint}{{1}{4}{Distance Constraint}{equation.3.1}{}} \newlabel{eq:distance_constraint}{{1}{4}{Distance Constraint}{equation.3.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Bending Constraint}{4}{subsection.3.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Bending Constraint}{4}{subsection.3.4}\protected@file@percent }
\newlabel{section:bendingConstraint}{{3.4}{4}{Bending Constraint}{subsection.3.4}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Collision Constraint}{4}{subsection.3.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Collision Constraint}{4}{subsection.3.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Implementation}{4}{section.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Position Constraint}{4}{subsection.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Data:}{4}{subsection.4.1}\protected@file@percent } \citation{PixarVolumetricHair}
\@writefile{toc}{\contentsline {section}{\numberline {5}Putting Hair on the Head}{4}{section.5}\protected@file@percent } \citation{FTLHair}
\@writefile{toc}{\contentsline {section}{\numberline {6}Results}{4}{section.6}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}Implementation}{5}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7}Conclusion}{4}{section.7}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Datastructures}{5}{subsection.4.1}\protected@file@percent }
\newlabel{sec:conclusion}{{7}{4}{Conclusion}{section.7}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Constraints}{5}{subsection.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8}Future Work}{4}{section.8}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Putting the Hair in the Hair Simulation}{5}{subsection.4.3}\protected@file@percent }
\newlabel{sec:future_work}{{8}{4}{Future Work}{section.8}{}} \@writefile{toc}{\contentsline {section}{\numberline {5}Results}{5}{section.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {8.1}Hair-hair collisions}{4}{subsection.8.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {6}Conclusion}{5}{section.6}\protected@file@percent }
\newlabel{subsec:future_work_collision}{{8.1}{4}{Hair-hair collisions}{subsection.8.1}{}} \newlabel{sec:conclusion}{{6}{5}{Conclusion}{section.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7}Future Work}{5}{section.7}\protected@file@percent }
\newlabel{sec:future_work}{{7}{5}{Future Work}{section.7}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}Hair-hair Collisions}{5}{subsection.7.1}\protected@file@percent }
\newlabel{subsec:future_work_collision}{{7.1}{5}{Hair-hair Collisions}{subsection.7.1}{}}
\citation{RappRealTime} \citation{RappRealTime}
\citation{UmenhofferSimulation} \citation{UmenhofferSimulation}
\bibstyle{ACM-Reference-Format} \bibstyle{ACM-Reference-Format}
...@@ -67,21 +75,27 @@ ...@@ -67,21 +75,27 @@
\bibcite{PixarVolumetricHair}{{4}{2006}{{Petrovic et~al\mbox {.}}}{{Petrovic, Henne, and Pixar}}} \bibcite{PixarVolumetricHair}{{4}{2006}{{Petrovic et~al\mbox {.}}}{{Petrovic, Henne, and Pixar}}}
\bibcite{RappRealTime}{{5}{2014}{{Rapp}}{{Rapp}}} \bibcite{RappRealTime}{{5}{2014}{{Rapp}}{{Rapp}}}
\bibcite{UmenhofferSimulation}{{6}{2016}{{Umenhoffer et~al\mbox {.}}}{{Umenhoffer, Marschal, and Suti}}} \bibcite{UmenhofferSimulation}{{6}{2016}{{Umenhoffer et~al\mbox {.}}}{{Umenhoffer, Marschal, and Suti}}}
\@writefile{toc}{\contentsline {subsection}{\numberline {8.2}Refinement and proper customizability of the propagation of hair strands on the head object.}{5}{subsection.8.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.2}Bending Constraint Improvements}{6}{subsection.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {8.3}Better customizability}{5}{subsection.8.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.3}More and better customization}{6}{subsection.7.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {8.4}Sequence for randomizing hair positions}{5}{subsection.8.4}\protected@file@percent } \newlabel{section:futureCustomization}{{7.3}{6}{More and better customization}{subsection.7.3}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {8.5}Rendering}{5}{subsection.8.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.4}Better customizability}{6}{subsection.7.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {8.6}Moving to the GPU}{5}{subsection.8.6}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.5}Sequence for randomizing hair positions}{6}{subsection.7.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{Acknowledgments}{5}{section*.8}\protected@file@percent } \newlabel{section:futureHalton}{{7.5}{6}{Sequence for randomizing hair positions}{subsection.7.5}{}}
\@writefile{toc}{\contentsline {section}{References}{5}{section*.10}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.6}Rendering}{6}{subsection.7.6}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {A}Supplementary development}{5}{appendix.A}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.7}Moving to the GPU}{6}{subsection.7.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {A.1}OBJ Reader}{5}{subsection.A.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{Acknowledgments}{6}{section*.8}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Supported OBJ Data Types\relax }}{5}{table.caption.11}\protected@file@percent } \@writefile{toc}{\contentsline {section}{References}{6}{section*.10}\protected@file@percent }
\newlabel{tab:objdatatypes}{{1}{5}{Supported OBJ Data Types\relax }{table.caption.11}{}} \@writefile{toc}{\contentsline {section}{\numberline {A}Constraint Projection}{6}{appendix.A}\protected@file@percent }
\newlabel{appendix:ConstraintProjection}{{A}{6}{Constraint Projection}{appendix.A}{}}
\@writefile{toc}{\contentsline {section}{\numberline {B}Supplementary development}{6}{appendix.B}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {B.1}OBJ Reader}{6}{subsection.B.1}\protected@file@percent }
\newlabel{section:appendixOBJ}{{B.1}{6}{OBJ Reader}{subsection.B.1}{}}
\newlabel{tocindent-1}{0pt} \newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{0pt} \newlabel{tocindent0}{0pt}
\newlabel{tocindent1}{6.95pt} \newlabel{tocindent1}{6.95pt}
\newlabel{tocindent2}{13.79999pt} \newlabel{tocindent2}{12.72998pt}
\newlabel{tocindent3}{0pt} \newlabel{tocindent3}{0pt}
\@writefile{toc}{\contentsline {subsection}{\numberline {A.2}Recording the simulation on-the-fly}{6}{subsection.A.2}\protected@file@percent } \@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Supported OBJ Data Types\relax }}{7}{table.caption.11}\protected@file@percent }
\newlabel{TotPages}{{6}{6}{}{page.6}{}} \newlabel{tab:objdatatypes}{{1}{7}{Supported OBJ Data Types\relax }{table.caption.11}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {B.2}Recording the simulation on-the-fly}{7}{subsection.B.2}\protected@file@percent }
\newlabel{TotPages}{{7}{7}{}{page.7}{}}
This diff is collapsed.
...@@ -10,20 +10,24 @@ ...@@ -10,20 +10,24 @@
\BOOKMARK [2][-]{subsection.3.3}{\376\377\0003\000.\0003\000\040\000D\000i\000s\000t\000a\000n\000c\000e\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 10 \BOOKMARK [2][-]{subsection.3.3}{\376\377\0003\000.\0003\000\040\000D\000i\000s\000t\000a\000n\000c\000e\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 10
\BOOKMARK [2][-]{subsection.3.4}{\376\377\0003\000.\0004\000\040\000B\000e\000n\000d\000i\000n\000g\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 11 \BOOKMARK [2][-]{subsection.3.4}{\376\377\0003\000.\0004\000\040\000B\000e\000n\000d\000i\000n\000g\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 11
\BOOKMARK [2][-]{subsection.3.5}{\376\377\0003\000.\0005\000\040\000C\000o\000l\000l\000i\000s\000i\000o\000n\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 12 \BOOKMARK [2][-]{subsection.3.5}{\376\377\0003\000.\0005\000\040\000C\000o\000l\000l\000i\000s\000i\000o\000n\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 12
\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 13 \BOOKMARK [2][-]{subsection.3.6}{\376\377\0003\000.\0006\000\040\000P\000o\000s\000i\000t\000i\000o\000n\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 13
\BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000D\000a\000t\000a\000:}{section.4}% 14 \BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 14
\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000P\000u\000t\000t\000i\000n\000g\000\040\000H\000a\000i\000r\000\040\000o\000n\000\040\000t\000h\000e\000\040\000H\000e\000a\000d}{}% 15 \BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000D\000a\000t\000a\000s\000t\000r\000u\000c\000t\000u\000r\000e\000s}{section.4}% 15
\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000R\000e\000s\000u\000l\000t\000s}{}% 16 \BOOKMARK [2][-]{subsection.4.2}{\376\377\0004\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000s}{section.4}% 16
\BOOKMARK [1][-]{section.7}{\376\377\0007\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 17 \BOOKMARK [2][-]{subsection.4.3}{\376\377\0004\000.\0003\000\040\000P\000u\000t\000t\000i\000n\000g\000\040\000t\000h\000e\000\040\000H\000a\000i\000r\000\040\000i\000n\000\040\000t\000h\000e\000\040\000H\000a\000i\000r\000\040\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n}{section.4}% 17
\BOOKMARK [1][-]{section.8}{\376\377\0008\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k}{}% 18 \BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000R\000e\000s\000u\000l\000t\000s}{}% 18
\BOOKMARK [2][-]{subsection.8.1}{\376\377\0008\000.\0001\000\040\000H\000a\000i\000r\000-\000h\000a\000i\000r\000\040\000c\000o\000l\000l\000i\000s\000i\000o\000n\000s}{section.8}% 19 \BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 19
\BOOKMARK [2][-]{subsection.8.2}{\376\377\0008\000.\0002\000\040\000R\000e\000f\000i\000n\000e\000m\000e\000n\000t\000\040\000a\000n\000d\000\040\000p\000r\000o\000p\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y\000\040\000o\000f\000\040\000t\000h\000e\000\040\000p\000r\000o\000p\000a\000g\000a\000t\000i\000o\000n\000\040\000o\000f\000\040\000h\000a\000i\000r\000\040\000s\000t\000r\000a\000n\000d\000s\000\040\000o\000n\000\040\000t\000h\000e\000\040\000h\000e\000a\000d\000\040\000o\000b\000j\000e\000c\000t\000.}{section.8}% 20 \BOOKMARK [1][-]{section.7}{\376\377\0007\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k}{}% 20
\BOOKMARK [2][-]{subsection.8.3}{\376\377\0008\000.\0003\000\040\000B\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y}{section.8}% 21 \BOOKMARK [2][-]{subsection.7.1}{\376\377\0007\000.\0001\000\040\000H\000a\000i\000r\000-\000h\000a\000i\000r\000\040\000C\000o\000l\000l\000i\000s\000i\000o\000n\000s}{section.7}% 21
\BOOKMARK [2][-]{subsection.8.4}{\376\377\0008\000.\0004\000\040\000S\000e\000q\000u\000e\000n\000c\000e\000\040\000f\000o\000r\000\040\000r\000a\000n\000d\000o\000m\000i\000z\000i\000n\000g\000\040\000h\000a\000i\000r\000\040\000p\000o\000s\000i\000t\000i\000o\000n\000s}{section.8}% 22 \BOOKMARK [2][-]{subsection.7.2}{\376\377\0007\000.\0002\000\040\000B\000e\000n\000d\000i\000n\000g\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000I\000m\000p\000r\000o\000v\000e\000m\000e\000n\000t\000s}{section.7}% 22
\BOOKMARK [2][-]{subsection.8.5}{\376\377\0008\000.\0005\000\040\000R\000e\000n\000d\000e\000r\000i\000n\000g}{section.8}% 23 \BOOKMARK [2][-]{subsection.7.3}{\376\377\0007\000.\0003\000\040\000M\000o\000r\000e\000\040\000a\000n\000d\000\040\000b\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000t\000i\000o\000n}{section.7}% 23
\BOOKMARK [2][-]{subsection.8.6}{\376\377\0008\000.\0006\000\040\000M\000o\000v\000i\000n\000g\000\040\000t\000o\000\040\000t\000h\000e\000\040\000G\000P\000U}{section.8}% 24 \BOOKMARK [2][-]{subsection.7.4}{\376\377\0007\000.\0004\000\040\000B\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y}{section.7}% 24
\BOOKMARK [1][-]{section*.8}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 25 \BOOKMARK [2][-]{subsection.7.5}{\376\377\0007\000.\0005\000\040\000S\000e\000q\000u\000e\000n\000c\000e\000\040\000f\000o\000r\000\040\000r\000a\000n\000d\000o\000m\000i\000z\000i\000n\000g\000\040\000h\000a\000i\000r\000\040\000p\000o\000s\000i\000t\000i\000o\000n\000s}{section.7}% 25
\BOOKMARK [1][-]{section*.10}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 26 \BOOKMARK [2][-]{subsection.7.6}{\376\377\0007\000.\0006\000\040\000R\000e\000n\000d\000e\000r\000i\000n\000g}{section.7}% 26
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000S\000u\000p\000p\000l\000e\000m\000e\000n\000t\000a\000r\000y\000\040\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t}{}% 27 \BOOKMARK [2][-]{subsection.7.7}{\376\377\0007\000.\0007\000\040\000M\000o\000v\000i\000n\000g\000\040\000t\000o\000\040\000t\000h\000e\000\040\000G\000P\000U}{section.7}% 27
\BOOKMARK [2][-]{subsection.A.1}{\376\377\000A\000.\0001\000\040\000O\000B\000J\000\040\000R\000e\000a\000d\000e\000r}{appendix.A}% 28 \BOOKMARK [1][-]{section*.8}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 28
\BOOKMARK [2][-]{subsection.A.2}{\376\377\000A\000.\0002\000\040\000R\000e\000c\000o\000r\000d\000i\000n\000g\000\040\000t\000h\000e\000\040\000s\000i\000m\000u\000l\000a\000t\000i\000o\000n\000\040\000o\000n\000-\000t\000h\000e\000-\000f\000l\000y}{appendix.A}% 29 \BOOKMARK [1][-]{section*.10}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 29
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000P\000r\000o\000j\000e\000c\000t\000i\000o\000n}{}% 30
\BOOKMARK [1][-]{appendix.B}{\376\377\000B\000\040\000S\000u\000p\000p\000l\000e\000m\000e\000n\000t\000a\000r\000y\000\040\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t}{}% 31
\BOOKMARK [2][-]{subsection.B.1}{\376\377\000B\000.\0001\000\040\000O\000B\000J\000\040\000R\000e\000a\000d\000e\000r}{appendix.B}% 32
\BOOKMARK [2][-]{subsection.B.2}{\376\377\000B\000.\0002\000\040\000R\000e\000c\000o\000r\000d\000i\000n\000g\000\040\000t\000h\000e\000\040\000s\000i\000m\000u\000l\000a\000t\000i\000o\000n\000\040\000o\000n\000-\000t\000h\000e\000-\000f\000l\000y}{appendix.B}% 33
No preview for this file type
...@@ -21,15 +21,19 @@ ...@@ -21,15 +21,19 @@
% \usepackage{algorithmic} % \usepackage{algorithmic}
\renewcommand{\b}{\boldsymbol} \renewcommand{\b}{\boldsymbol}
\setlength{\parskip}{0.2em}
%% end of the preamble, start of the body of the document source. %% end of the preamble, start of the body of the document source.
\begin{document} \begin{document}
% don't allow lines to overflow their columns
% \sloppy
% \renewcommand{\@algocf@capt@plain}{top} % formerly {bottom} % \renewcommand{\@algocf@capt@plain}{top} % formerly {bottom}
%% %%
%% The "title" command has an optional parameter, %% The "title" command has an optional parameter,
%% allowing the author to define a "short title" to be used in page headers. %% allowing the author to define a "short title" to be used in page headers.
\title[Hair Simulation]{Simulation of Curly Hair} \title[Hair Simulation]{Simulation of Curly Hair}
\subtitle{5th semester Project Laboratory report} \subtitle{5th Semester Project Laboratory Report}
%% %%
%% The "author" command and its associated commands are used to define %% The "author" command and its associated commands are used to define
...@@ -41,19 +45,22 @@ ...@@ -41,19 +45,22 @@
% \authornote{BSc student} % \authornote{BSc student}
\email{borcsok.barnabas@simonyi.bme.hu} \email{borcsok.barnabas@simonyi.bme.hu}
\affiliation{% \affiliation{%
\institution{Budapest University of Technology and Economics} \institution{}%Budapest University of Technology and Economics}
\city{} \city{}
\country{} \country{}
} }
\author{Dr. Szécsi László} \author{Dr. László Szécsi}
\email{Advisor} \email{Advisor}
\affiliation{% \affiliation{%
\institution{Budapest University of Technology and Economics} % \institution{Budapest University of Technology and Economics}
% \city{}
% \country{}
% \department[0]{Computer Graphics Group}
% \department[1]{Department of Control Engineering and Information Technology}
\institution{}
\city{} \city{}
\country{} \country{}
\department[0]{Computer Graphics Group}
\department[1]{Department of Control Engineering and Information Technology}
} }
...@@ -209,7 +216,7 @@ implementation to eliminate the stretching in the presence of greater forces. ...@@ -209,7 +216,7 @@ implementation to eliminate the stretching in the presence of greater forces.
\section{Position Based Simulation} \section{Position Based Simulation}
\subsection{Algorithm Overview} \subsection{Algorithm Overview}
\label{section:algorithmOverview}
We model an $S$ hair strand as a chain of $N$ particles and a set of $M$ We model an $S$ hair strand as a chain of $N$ particles and a set of $M$
constraints. Each particle $p \in [1,\ldots,N]$ has three atributes: mass ($m_p$), position constraints. Each particle $p \in [1,\ldots,N]$ has three atributes: mass ($m_p$), position
($\boldsymbol{x_p}$) and velocity ($\boldsymbol{v_p}$). ($\boldsymbol{x_p}$) and velocity ($\boldsymbol{v_p}$).
...@@ -228,7 +235,6 @@ strength of the constraint in a range from zero to one. ...@@ -228,7 +235,6 @@ strength of the constraint in a range from zero to one.
Given these notations, the algorithm works in the following way: Given these notations, the algorithm works in the following way:
\TODO{decide about syntax: array of particles (OOP) or array of v, x and m?}
\begin{algorithm} \begin{algorithm}
\caption{pseudo code for the PBD simulation}\label{alg:pbd} \caption{pseudo code for the PBD simulation}\label{alg:pbd}
...@@ -317,8 +323,8 @@ used. In our case, simply applying a $k_s$ damping coefficient with value ...@@ -317,8 +323,8 @@ used. In our case, simply applying a $k_s$ damping coefficient with value
between $98\%$ to $99.9\%$ seemed to be a good enough solution. between $98\%$ to $99.9\%$ seemed to be a good enough solution.
The initial constraints $C_1, \ldots, C_M$ are fixed throughout the simulation. The initial constraints $C_1, \ldots, C_M$ are fixed throughout the simulation.
In addition to these initial constraints, line \lineRef{13} generates additional In addition to these initial constraints, line \lineRefSingle{13} generates additional
$M_coll$ collisition constrants. These change from time step to time step. The $M_{coll}$ collisition constrants. These change from time step to time step. The
projection step in line \lineRefSingle{16} considers both the fixed and the projection step in line \lineRefSingle{16} considers both the fixed and the
collision constraints. Our implementation does not yet utilize this opportunity collision constraints. Our implementation does not yet utilize this opportunity
to dynamicaly generate collision constraints. This is one of the possible future to dynamicaly generate collision constraints. This is one of the possible future
...@@ -345,13 +351,29 @@ speeds up convergence significantly, because pressure waves can propagate ...@@ -345,13 +351,29 @@ speeds up convergence significantly, because pressure waves can propagate
throught the chain of particles in a single solver step, and effect which is throught the chain of particles in a single solver step, and effect which is
dependent on the order in which constraints are solved. dependent on the order in which constraints are solved.
In our hair simulation case, we solve the distance constraints putting the hair In our hair simulation case, we solve the distance constraints by putting the
particles at the desired distance from each other starting at the scalp, and hair particles at the desired distance from each other starting at the scalp,
moving outwards from there. and moving outwards from there.
\TODO{do constraint projection appendix} For projecting the constraints, we utilize the method proposed by
\citet{MullerPBD}. The details of computing the desired delta positions are
\subsection{Distance Constraint} explained in the Appendix \ref{appendix:ConstraintProjection}
\nameref{appendix:ConstraintProjection}. An example derivation is given in
Section \ref{section:DistanceConstraint} \nameref{section:DistanceConstraint}.
There are several ways of incorporating the stiffness parameter. The simplest
-- and the way we chose to utilize -- is simply multiplying the $\Delta \b{p}$
correction by the $k \in [0 \ldots 1]$ stiffness paramter. For multiple
iteration loops of the solver, the effect of $k$ becomes non-linear. The
reamining error after $n_s$ solver iterations is $\Delta \b{p}(1-k)^{n_s}$.
\citet{MullerPBD} proposes to multiply the corrections not by $k$ directly, but
by $k' = 1 - (1-k)^{1/n_s}$. With this transformation, the error becomes $\Delta
\b{p}(1-k')^{n_s} = \Delta\b{p}(1-k)$, and thus linearly dependent on $k$ and
independent of $n_s$. The resulting stiffness is still dependent on the time
step of the simulation. Real time environments typically use fixed time steps in
which case this dependency is not problematic.
\subsection{Distance Constraint} \label{section:DistanceConstraint}
One of the most basic constraint is the Distance Constraint, forcing two given One of the most basic constraint is the Distance Constraint, forcing two given
particles $d$ distance apart. It is an \emph{equality} type constraint, meaning particles $d$ distance apart. It is an \emph{equality} type constraint, meaning
that it is satisfied if $C_{distance} = 0$. that it is satisfied if $C_{distance} = 0$.
...@@ -359,26 +381,29 @@ that it is satisfied if $C_{distance} = 0$. ...@@ -359,26 +381,29 @@ that it is satisfied if $C_{distance} = 0$.
\begin{equation} \label{eq:distance_constraint} \begin{equation} \label{eq:distance_constraint}
C_{distance}(\b{p_1},\b{p_2}) = \lvert \b{p_1} - \b{p_2} \rvert - d C_{distance}(\b{p_1},\b{p_2}) = \lvert \b{p_1} - \b{p_2} \rvert - d
\end{equation} \end{equation}
We are looking for $\Delta \b{p_1}$ and $\Delta \b{p_2}$ corrections such that
Looking for $\Delta \b{p_1}$ and $\Delta \b{p_2}$ corrections such that
$$ $$
C_{distance}(\b{p_1}+\Delta \b{p_1}, \b{p_2}+\Delta \b{p_2}) = 0 C_{distance}(\b{p_1}+\Delta \b{p_1}, \b{p_2}+\Delta \b{p_2}) = 0.
$$ $$
, we follow the method proposed by \citet{MullerPBD} (see appendix \TODO{reference In finding the desired delta values to satisfy the constraint, we follow the
appendix}). The derivatives with respect to the points are method proposed by \citet{MullerPBD} \emph{(see Appendix
\nameref{appendix:ConstraintProjection})}.
The derivatives with respect to the positions are
\begin{align*} \begin{align*}
\nabla_{\b{p_1}} C_{distance}(\b{p_1}, \b{p_2}) &= \b{n} \\\\ \nabla_{\b{p_1}} C_{distance}(\b{p_1}, \b{p_2}) &= \b{n} \\\\
\nabla_{\b{p_2}} C_{distance}(\b{p_1}, \b{p_2}) &= -\b{n} \\\\ \nabla_{\b{p_2}} C_{distance}(\b{p_1}, \b{p_2}) &= -\b{n} \\\\
\b{n} = \frac{\b{p_1}-\b{p_2}}{\lvert \b{p_1}-\b{p_2} \rvert} \b{n} = \frac{\b{p_1}-\b{p_2}}{\lvert \b{p_1}-\b{p_2} \rvert}.
\end{align*} \end{align*}
This makes the scaling factor This makes the scaling factor
$s = \frac{\lvert \b{p_1} - \b{p_2}\rvert - d}{w_1 + w_2}$, and the final corrections \begin{align*}
are: s &= \frac{C(\b{p_1},\b{p_2})}
{w_1 \lvert \nabla_{p_1}C(\b{p_1}, \b{p_2})\rvert ^ 2 + w_2 \lvert
\nabla_{p_2}C(\b{p_1}, \b{p_2})\rvert ^ 2}\\\\
&= \frac{\lvert \b{p_1} - \b{p_2}\rvert - d}{w_1 + w_2}.
\end{align*}
The final corrections are:
\begin{align*} \begin{align*}
\Delta \b{p_1} &= - \frac{w_1}{w_1 + w_2} \Delta \b{p_1} &= - \frac{w_1}{w_1 + w_2}
(\lvert \b{p_1} - \b{p_2} \rvert - d) (\lvert \b{p_1} - \b{p_2} \rvert - d)
...@@ -389,27 +414,46 @@ are: ...@@ -389,27 +414,46 @@ are:
\frac{\b{p_1} - \b{p_2}}{\lvert \b{p_1} - \b{p_2} \rvert} \frac{\b{p_1} - \b{p_2}}{\lvert \b{p_1} - \b{p_2} \rvert}
\end{align*} \end{align*}
\TODO{Add figure illustrating these calculations}
Since the type of the Distance Constraint is \emph{equality}, the projection is Since the type of the Distance Constraint is \emph{equality}, the projection is
straight forward: we move both by $\b{p_1}$ and $\b{p_2}$ by $\Delta \b{p_1}$ and straight forward: we move both by $\b{p_1}$ and $\b{p_2}$ by $\Delta \b{p_1}$ and
$\Delta \b{p_2}$ respectively. $\Delta \b{p_2}$ respectively.
\subsection{Bending Constraint} \subsection{Bending Constraint} \label{section:bendingConstraint}
\citet{UmenhofferSimulation} uses the PBD technique to simulate cloth materials.
They utilize the bending constraint to define the bending resistance of the
material, giving it an extra stiffness. Their goal with the Bending Constraint
is to keep an initial angle between adjacent triangles formed by particles. They
offer the $C(p_1,p_2,p_3,p_4) = arccos(n_1 \cdot n_2) - \phi _0$ constraint,
where $n_1$ and $n_2$ are the normal vectors of the triangles, and $p_2 - p_1$
forms the common side of the two triangles. The $\phi _0$ angle is measured
between the normals of the two triangles.
At first, we thought about implementing something similar for our project, but
then simplified the ``Bending Constraint'' for our use-case to essentially
distance constraints $C_{distance}(p_{i-1}, p_{i+i})~for~i\in[1 \ldots
n_{particles}-1]$ of the same hair strand with the $d$ distance paramter of the
being lower than the $d$ parameter of other $C_distance$ constraints keeping the
particles a given $l_{seg}$ distance apart from each other, and assigning
a lower $k_{bending}$ stiffness parameter.
This idea could be further developed when considering other $(p_j,p_k)$ pairs
and different distances between them.
\TODO{add figure demonstrating the different bending constraint}
\subsection{Collision Constraint} \subsection{Collision Constraint}
Collision constraint can appear and disappear in each simulation step One huge advantage of the position based approach is how simply collision
(in \lineRef{12}{14} of Algorithm \ref{alg:pbd}). For a moving particle $\b{p}$ handling can be realized. In each simulation step $M_{coll}$ collision
and points $\b{q_1}, \b{q_2}, \b{q_3}$ forming a triangle with normal $\b{n}$, constraints are generated in the \lineRef{12}{14} lines of Algorithm
the collision constraint is \ref{alg:pbd}. For a moving particle $\b{p}$ and points $\b{q_1}, \b{q_2},
\b{q_3}$ forming a triangle with normal $\b{n}$, the collision constraint is
$$ $$
C(\b{p}, \b{q_1}, \b{q_2}, \b{q_3}) = (\b{p}-\b{q_1})\cdot \b{n} \geq 0 C_{collision}(\b{p}, \b{q_1}, \b{q_2}, \b{q_3}) = (\b{p}-\b{q_1})\cdot \b{n} \geq 0
$$ $$
, where we check whether $\b{p}$ lies on the desirable side of the given , where we check whether $\b{p}$ lies on the desired side of the given
surface, by requiring that the magnitude of the vector from an arbitrary point surface. We require that the magnitude of the vector from an arbitrary point
on the surface to $\b{p}$ projected onto the normal vector be greater than 0 by on the surface to $\b{p}$ projected onto the normal vector be greater than 0 by
utilizing the dot product operation. utilizing the dot product operation.
\TODO{is this explanation too much?} \TODO{is this explanation too much?}
...@@ -423,12 +467,32 @@ $$ ...@@ -423,12 +467,32 @@ $$
This formula moves the particle along the triangle normal exactly to the This formula moves the particle along the triangle normal exactly to the
triangle's surface. triangle's surface.
\subsection{Position Constraint}
Maybe the most straight-forward constraint is the Position Constraint, given as:
\begin{align*}
C_{collision}(\b{p}) &= \lvert \b{p} - \b{p_{goal}} \rvert = 0
\\
\Delta \b{p} &= \b{p_{goal}} - \b{p}
\end{align*}
Moving the $\b{p}$ particle to the $\b{p_{goal}}$ position.
We utilize the Position Constraint for keeping the first particle in each strand
on the surface of the head.
\section{Implementation} \section{Implementation}
After introducing the general position based dynamics simulation method, we will After introducing the general position based dynamics simulation method, we dive
dive into the specifics we settled with for our implementation for simulating into the specifics we settled on for our hair simulation.
hair.
The code is available at \url{http://git.sch.bme.hu/bobarna/brave-2}.
\subsection{Data:} \subsection{Datastructures}
The properties of particles introduced in chapter
\ref{section:algorithmOverview}
\nameref{section:algorithmOverview} got an additional color property. This is
decision was made so hair with a gradient color could be simulated.
\begin{verbatim} \begin{verbatim}
class Particle { class Particle {
...@@ -440,14 +504,49 @@ hair. ...@@ -440,14 +504,49 @@ hair.
} }
\end{verbatim} \end{verbatim}
\section{Putting Hair on the Head} The strands are stored as a vector of vector of Particles. It is practical to
keep related data packed right after each other in the memory for improving the
performance of operations and function calls.
\subsection{Constraints}
A \texttt{Constraint} class with an abstract \texttt{solve()} method was
implemented, storing each derived constraint class \emph{(e.g.
PositionConstraint, BendingConstraint)} in a heterogen
collection and calling each overriden \texttt{solve()} method when projecting
the constraints in the iteration loop (line \lineRefSingle{16} of Algorithm
\ref{alg:pbd}).
This implementation proved to be not fast enough, lagging even with low particle
counts. We could not discover the cause of this increased computing time, and
decided to settle on another solution. Instead of the above mentioned, we
store only the parameters that constraints operate on, and the simulation calls
the relevant solve functions with these stored parameters.
\subsection{Putting the Hair in the Hair Simulation}
The $PBDSimulation$ class handles the simulation and rendering of the hair. It
takes a $HeadObject$ and propagates hairstrands starting from its surface. Each
strands first particle is fixed in place with a $PositionConstraint$, not
letting it move away from the scalp.
The geometry of the $HeadObject$ is read from an \texttt{OBJ} file. (\emph{See
the Appendix \ref{section:appendixOBJ} \nameref{section:appendixOBJ}}.)
The hair strands are propagated throughout the surface of the $HeadObject$ by
proposing random $(\b{u}, \b{v}) \in [0 \ldots 1] \times [0 \ldots 1]$
coordinates and settling on them if they satisfy requirements for the position
of the hair -- like the corresponding face in world coordinates has an upward
pointing normal vector. This propagation of strands on the surface of the head
could be improved, as pointed out in sections
\nameref{section:futureCustomization} and \nameref{section:futureHalton}.
\section{Results} \section{Results}
The implementation is available at \url{git.sch.bme.hu/bobarna/brave-2}. The The implementation is available at \url{git.sch.bme.hu/bobarna/brave-2}. The
program is able to handle up to around 500 individual hair strands, each program is able to handle up to around 500 individual hair strands, each
consisting of around 30 particles in real time. With the implemented OBJ reader, consisting of around 30 particles in real time. With the implemented OBJ reader,
it is possible to achieve diverse visual results in no time. The it is possible to achieve diverse visual results in no time.
An example result shown in figure \TODO{include figure}, and can be seen in the An example result shown in figure \TODO{include figure}, and can be seen in the
supplementary videos \TODO{Google Drive (?) link with the videos}. supplementary videos \TODO{Google Drive (?) link with the videos}.
...@@ -472,7 +571,7 @@ of time was dedicated in the early stages of the project to investigate and ...@@ -472,7 +571,7 @@ of time was dedicated in the early stages of the project to investigate and
explore the subject area. This left only a sub-optimal time for implementing all explore the subject area. This left only a sub-optimal time for implementing all
desired aspects of the simulation. desired aspects of the simulation.
\subsection{Hair-hair collisions} \subsection{Hair-hair Collisions}
\label{subsec:future_work_collision} \label{subsec:future_work_collision}
As it is computationally extensive to simulate each particle colliding with all As it is computationally extensive to simulate each particle colliding with all
of the other particles, a particle density field could be used. One such method of the other particles, a particle density field could be used. One such method
...@@ -482,11 +581,27 @@ utilized in the \citet{FTLHair} paper for handling hair-hair collisions. ...@@ -482,11 +581,27 @@ utilized in the \citet{FTLHair} paper for handling hair-hair collisions.
Such a method could be used to dynamically generate collision constraints in Such a method could be used to dynamically generate collision constraints in
line \lineRefSingle{13} of Algorithm~\ref{alg:pbd}. line \lineRefSingle{13} of Algorithm~\ref{alg:pbd}.
\subsection{Refinement and proper customizability of the propagation of hair \subsection{Bending Constraint Improvements}
strands on the head object.} As already mentioned in Section \ref{section:bendingConstraint}
\nameref{section:bendingConstraint}, a huge improvement could be made by
improving the bending constraint either by further exploring the possibilities
of defining different distance constraints between pairs of particles.
An alternative route could be to explore the possibility of a different type of
bending constraint, for example by keeping a given angle between chunks of
subsequent particles.
\subsection{More and better customization}
\label{section:futureCustomization}
A drawable texture map is considered for the ability to tell the simulation A drawable texture map is considered for the ability to tell the simulation
where to put the hair strands on the surface of the head. where to put the hair strands on the surface of the head.
The \texttt{OBJ} reader could also be further developed into reading material,
texture and/or color data for the objects.
A common interface for importing and exporting different hairstyles could be
developed.
\subsection{Better customizability} \subsection{Better customizability}
In the current implementation there is no way to properly customize the look and In the current implementation there is no way to properly customize the look and
feel of the hair without accessing the source code. A possible improvement could feel of the hair without accessing the source code. A possible improvement could
...@@ -496,6 +611,7 @@ much better control of the hair. Other properties, such as length of the hair ...@@ -496,6 +611,7 @@ much better control of the hair. Other properties, such as length of the hair
segments and color of the hair could be set as well. segments and color of the hair could be set as well.
\subsection{Sequence for randomizing hair positions} \subsection{Sequence for randomizing hair positions}
\label{section:futureHalton}
In the current implementation, a standard C++ random number generator is In the current implementation, a standard C++ random number generator is
utilized. Utilizing a low-discrepancy number sequence such as the Halton utilized. Utilizing a low-discrepancy number sequence such as the Halton
sequence for randomizing hair strand positions would be an improvement. sequence for randomizing hair strand positions would be an improvement.
...@@ -512,7 +628,7 @@ parts of the (OpenGL) rendering pipeline that could be utilized. ...@@ -512,7 +628,7 @@ parts of the (OpenGL) rendering pipeline that could be utilized.
\subsection{Moving to the GPU} \subsection{Moving to the GPU}
The current implementation runs solely on the CPU. A big leap forward would be The current implementation runs solely on the CPU. A big leap forward would be
the utilization of the GPU. Compute shaders for computations are considered. The the utilization of the GPU. Compute shaders for computations are considered. The
paper by \citet{UmenhofferSimulation} discusses a parametrization of the paper by \citet{UmenhofferSimulation} discusses a parallelization of the
different constraint solves, although as they work on the same dataset, some different constraint solves, although as they work on the same dataset, some
computation problems are present during the parellelization of the computation problems are present during the parellelization of the
problem. problem.
...@@ -542,16 +658,21 @@ method and properties. ...@@ -542,16 +658,21 @@ method and properties.
%% If your work has an appendix, this is the place to put it. %% If your work has an appendix, this is the place to put it.
\appendix \appendix
\section{Constraint Projection} \label{appendix:ConstraintProjection}
asd
\section{Supplementary development} \section{Supplementary development}
\subsection{OBJ Reader} \subsection{OBJ Reader}
\label{section:appendixOBJ}
An OBJ reader utility was implemented as part of the project. As the OBJ file An OBJ reader utility was implemented as part of the project. As the OBJ file
format \footnote{\url{http://paulbourke.net/dataformats/obj/}} describes a wide range format \footnote{\url{http://paulbourke.net/dataformats/obj/}} describes a wide range
of properties for objects. The present OBJ reader handles only the subset of of properties for objects, our OBJ reader handles only the subset of
these describtion options needed for the project. Lines containing other type of these description options -- those that are needed for the project. Not
object descriptions were ignored, resulting in a successful file read if supported line types were simply ignored, still resulting in
possible. a successful file read if possible.
\begin{table}[htb] \begin{table}[htb]
\caption{Supported OBJ Data Types} \caption{Supported OBJ Data Types}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment