diff thesis/cortex.org @ 469:ae10f35022ba

completed first draft of body section.
author Robert McIntyre <rlm@mit.edu>
date Fri, 28 Mar 2014 16:34:35 -0400
parents 258078f78b33
children 3401053124b0
line wrap: on
line diff
     1.1 --- a/thesis/cortex.org	Fri Mar 28 16:25:31 2014 -0400
     1.2 +++ b/thesis/cortex.org	Fri Mar 28 16:34:35 2014 -0400
     1.3 @@ -23,8 +23,6 @@
     1.4    #+ATTR_LaTeX: :width 10cm
     1.5    [[./images/aurellem-gray.png]]
     1.6  
     1.7 -
     1.8 -
     1.9  * COMMENT Empathy and Embodiment as problem solving strategies
    1.10    
    1.11    By the end of this thesis, you will have seen a novel approach to
    1.12 @@ -445,7 +443,7 @@
    1.13     simulations of very simple creatures in =CORTEX= generally run at
    1.14     40x on my machine!
    1.15  
    1.16 -** What is a sense?
    1.17 +** COMMENT What is a sense?
    1.18     
    1.19     If =CORTEX= is to support a wide variety of senses, it would help
    1.20     to have a better understanding of what a ``sense'' actually is!
    1.21 @@ -523,7 +521,6 @@
    1.22     #+ATTR_LaTeX: :width 10cm
    1.23     [[./images/finger-1.png]]
    1.24  
    1.25 -
    1.26  ** COMMENT Video game engines are a great starting point
    1.27     
    1.28     I did not need to write my own physics simulation code or shader to
    1.29 @@ -590,7 +587,7 @@
    1.30     write my code in clojure, an implementation of =LISP= that runs on
    1.31     the JVM.
    1.32  
    1.33 -** =CORTEX= uses Blender to create creature models
    1.34 +** COMMENT =CORTEX= uses Blender to create creature models
    1.35  
    1.36     For the simple worm-like creatures I will use later on in this
    1.37     thesis, I could define a simple API in =CORTEX= that would allow
    1.38 @@ -627,8 +624,7 @@
    1.39     #+ATTR_LaTeX: :width 10cm
    1.40     [[./images/empty-sense-nodes.png]]
    1.41  
    1.42 -
    1.43 -** Bodies are composed of segments connected by joints
    1.44 +** COMMENT Bodies are composed of segments connected by joints
    1.45  
    1.46     Blender is a general purpose animation tool, which has been used in
    1.47     the past to create high quality movies such as Sintel
    1.48 @@ -690,19 +686,11 @@
    1.49     to simulate retractable claws or =EVE='s hands, which are able to
    1.50     coalesce into one object in the movie.
    1.51  
    1.52 -*** Solidifying/Connecting the body   
    1.53 +*** Solidifying/Connecting a body
    1.54  
    1.55 -   #+caption: View of the hand model in Blender showing the main ``joints''
    1.56 -   #+caption: node (highlighted in yellow) and its children which each
    1.57 -   #+caption: represent a joint in the hand. Each joint node has metadata
    1.58 -   #+caption: specifying what sort of joint it is.
    1.59 -   #+name: blender-hand
    1.60 -   #+ATTR_LaTeX: :width 10cm
    1.61 -   [[./images/hand-screenshot1.png]]
    1.62 -   
    1.63 -   =CORTEX= creates a creature in two steps: first, it traverses the
    1.64 -   nodes in the blender file and creates physical representations for
    1.65 -   any of them that have mass defined.
    1.66 +    =CORTEX= creates a creature in two steps: first, it traverses the
    1.67 +    nodes in the blender file and creates physical representations for
    1.68 +    any of them that have mass defined in their blender meta-data.
    1.69  
    1.70     #+caption: Program for iterating through the nodes in a blender file
    1.71     #+caption: and generating physical jMonkeyEngine3 objects with mass
    1.72 @@ -729,20 +717,35 @@
    1.73     #+end_src
    1.74     #+end_listing
    1.75     
    1.76 -   The next step to making a proper body is to connect those pieces
    1.77 -   together with joints. jMonkeyEngine has a large array of joints
    1.78 -   available via =bullet=, such as Point2Point, Cone, Hinge, and a
    1.79 -   generic Six Degree of Freedom joint, with or without spring
    1.80 -   restitution. =CORTEX='s procedure for binding the creature together
    1.81 -   with joints is as follows:
    1.82 +    The next step to making a proper body is to connect those pieces
    1.83 +    together with joints. jMonkeyEngine has a large array of joints
    1.84 +    available via =bullet=, such as Point2Point, Cone, Hinge, and a
    1.85 +    generic Six Degree of Freedom joint, with or without spring
    1.86 +    restitution. 
    1.87  
    1.88 -   - Find the children of the "joints" node.
    1.89 -   - Determine the two spatials the joint is meant to connect.
    1.90 -   - Create the joint based on the meta-data of the empty node.
    1.91 +    Joints are treated a lot like proper senses, in that there is a
    1.92 +    top-level empty node named ``joints'' whose children each
    1.93 +    represent a joint.
    1.94  
    1.95 -   The higher order function =sense-nodes= from =cortex.sense=
    1.96 -   simplifies finding the joints based on their parent ``joints''
    1.97 -   node.
    1.98 +    #+caption: View of the hand model in Blender showing the main ``joints''
    1.99 +    #+caption: node (highlighted in yellow) and its children which each
   1.100 +    #+caption: represent a joint in the hand. Each joint node has metadata
   1.101 +    #+caption: specifying what sort of joint it is.
   1.102 +    #+name: blender-hand
   1.103 +    #+ATTR_LaTeX: :width 10cm
   1.104 +    [[./images/hand-screenshot1.png]]
   1.105 +
   1.106 +
   1.107 +    =CORTEX='s procedure for binding the creature together with joints
   1.108 +    is as follows:
   1.109 +    
   1.110 +    - Find the children of the ``joints'' node.
   1.111 +    - Determine the two spatials the joint is meant to connect.
   1.112 +    - Create the joint based on the meta-data of the empty node.
   1.113 +
   1.114 +    The higher order function =sense-nodes= from =cortex.sense=
   1.115 +    simplifies finding the joints based on their parent ``joints''
   1.116 +    node.
   1.117  
   1.118     #+caption: Retrieving the children empty nodes from a single 
   1.119     #+caption: named empty node is a common pattern in =CORTEX=
   1.120 @@ -769,20 +772,20 @@
   1.121     #+end_src
   1.122     #+end_listing
   1.123  
   1.124 -   To find a joint's targets targets, =CORTEX= creates a small cube,
   1.125 -   centered around the empty-node, and grows the cube exponentially
   1.126 -   until it intersects two /physical/ objects. The objects are ordered
   1.127 -   according to the joint's rotation, with the first one being the
   1.128 -   object that has more negative coordinates in the joint's reference
   1.129 -   frame. Since the objects must be physical, the empty-node itself
   1.130 -   escapes detection. Because the objects must be physical,
   1.131 -   =joint-targets= must be called /after/ =physical!= is called.
   1.132 +    To find a joint's targets, =CORTEX= creates a small cube, centered
   1.133 +    around the empty-node, and grows the cube exponentially until it
   1.134 +    intersects two physical objects. The objects are ordered according
   1.135 +    to the joint's rotation, with the first one being the object that
   1.136 +    has more negative coordinates in the joint's reference frame.
   1.137 +    Since the objects must be physical, the empty-node itself escapes
   1.138 +    detection. Because the objects must be physical, =joint-targets=
   1.139 +    must be called /after/ =physical!= is called.
   1.140     
   1.141 -   #+caption: Program to find the targets of a joint node by 
   1.142 -   #+caption: exponentiallly growth of a search cube.
   1.143 -   #+name: joint-targets
   1.144 -   #+begin_listing clojure
   1.145 -   #+begin_src clojure
   1.146 +    #+caption: Program to find the targets of a joint node by 
   1.147 +    #+caption: exponentiallly growth of a search cube.
   1.148 +    #+name: joint-targets
   1.149 +    #+begin_listing clojure
   1.150 +    #+begin_src clojure
   1.151  (defn joint-targets
   1.152    "Return the two closest two objects to the joint object, ordered
   1.153    from bottom to top according to the joint's rotation."
   1.154 @@ -807,17 +810,17 @@
   1.155                (.dot (Vector3f. 1 1 1) joint-ref-frame-position))                  
   1.156             (take 2 targets))
   1.157            (recur (float (* radius 2))))))))
   1.158 -   #+end_src
   1.159 -   #+end_listing
   1.160 +    #+end_src
   1.161 +    #+end_listing
   1.162     
   1.163 -   Once =CORTEX= finds all joints and targets, it creates them using a
   1.164 -   simple dispatch on the metadata of the joint node. 
   1.165 +    Once =CORTEX= finds all joints and targets, it creates them using
   1.166 +    a dispatch on the metadata of each joint node.
   1.167  
   1.168 -   #+caption: Program to dispatch on blender metadata and create joints
   1.169 -   #+caption: sutiable for physical simulation.
   1.170 -   #+name: joint-dispatch
   1.171 -   #+begin_listing clojure
   1.172 -   #+begin_src clojure
   1.173 +    #+caption: Program to dispatch on blender metadata and create joints
   1.174 +    #+caption: sutiable for physical simulation.
   1.175 +    #+name: joint-dispatch
   1.176 +    #+begin_listing clojure
   1.177 +    #+begin_src clojure
   1.178  (defmulti joint-dispatch
   1.179    "Translate blender pseudo-joints into real JME joints."
   1.180    (fn [constraints & _] 
   1.181 @@ -847,17 +850,17 @@
   1.182                        rotation rotation)
   1.183        (.setLimit (float limit-xz) (float limit-xy)
   1.184                   (float twist)))))
   1.185 -   #+end_src
   1.186 -   #+end_listing
   1.187 +    #+end_src
   1.188 +    #+end_listing
   1.189  
   1.190 -   All that is left for joints it to combine the above pieces into a
   1.191 -   something that can operate on the collection of nodes that a
   1.192 -   blender file represents.
   1.193 +    All that is left for joints it to combine the above pieces into a
   1.194 +    something that can operate on the collection of nodes that a
   1.195 +    blender file represents.
   1.196  
   1.197 -   #+caption: Program to completely create a joint given information 
   1.198 -   #+caption: from a blender file.
   1.199 -   #+name: connect
   1.200 -   #+begin_listing clojure
   1.201 +    #+caption: Program to completely create a joint given information 
   1.202 +    #+caption: from a blender file.
   1.203 +    #+name: connect
   1.204 +    #+begin_listing clojure
   1.205     #+begin_src clojure
   1.206  (defn connect
   1.207    "Create a joint between 'obj-a and 'obj-b at the location of
   1.208 @@ -888,20 +891,20 @@
   1.209                          control-a control-b
   1.210                          pivot-a pivot-b
   1.211                          joint-rotation))))
   1.212 -   #+end_src
   1.213 -   #+end_listing
   1.214 +    #+end_src
   1.215 +    #+end_listing
   1.216  
   1.217 -   In general, whenever =CORTEX= exposes a sense (or in this case
   1.218 -   physicality), it provides a function of the type =sense!=, which
   1.219 -   takes in a collection of nodes and augments it to support that
   1.220 -   sense. The function returns any controlls necessary to use that
   1.221 -   sense. In this case =body!= cerates a physical body and returns no
   1.222 -   control functions.
   1.223 +    In general, whenever =CORTEX= exposes a sense (or in this case
   1.224 +    physicality), it provides a function of the type =sense!=, which
   1.225 +    takes in a collection of nodes and augments it to support that
   1.226 +    sense. The function returns any controlls necessary to use that
   1.227 +    sense. In this case =body!= cerates a physical body and returns no
   1.228 +    control functions.
   1.229  
   1.230 -   #+caption: Program to give joints to a creature.
   1.231 -   #+name: name
   1.232 -   #+begin_listing clojure
   1.233 -   #+begin_src clojure
   1.234 +    #+caption: Program to give joints to a creature.
   1.235 +    #+name: name
   1.236 +    #+begin_listing clojure
   1.237 +    #+begin_src clojure
   1.238  (defn joints!
   1.239    "Connect the solid parts of the creature with physical joints. The
   1.240     joints are taken from the \"joints\" node in the creature."
   1.241 @@ -919,25 +922,23 @@
   1.242    [#^Node creature]
   1.243    (physical! creature)
   1.244    (joints! creature))
   1.245 -   #+end_src
   1.246 -   #+end_listing
   1.247 +    #+end_src
   1.248 +    #+end_listing
   1.249  
   1.250 -   All of the code you have just seen amounts to only 130 lines, yet
   1.251 -   because it builds on top of Blender and jMonkeyEngine3, those few
   1.252 -   lines pack quite a punch!
   1.253 +    All of the code you have just seen amounts to only 130 lines, yet
   1.254 +    because it builds on top of Blender and jMonkeyEngine3, those few
   1.255 +    lines pack quite a punch!
   1.256  
   1.257 -   The hand from figure \ref{blender-hand}, which was modeled after my
   1.258 -   own right hand, can now be given joints and simulated as a
   1.259 -   creature.
   1.260 +    The hand from figure \ref{blender-hand}, which was modeled after
   1.261 +    my own right hand, can now be given joints and simulated as a
   1.262 +    creature.
   1.263     
   1.264 -   #+caption: With the ability to create physical creatures from blender,
   1.265 -   #+caption: =CORTEX= gets one step closer to a full creature simulation
   1.266 -   #+caption: environment.
   1.267 -   #+name: name
   1.268 -   #+ATTR_LaTeX: :width 15cm
   1.269 -   [[./images/physical-hand.png]]
   1.270 -
   1.271 -
   1.272 +    #+caption: With the ability to create physical creatures from blender,
   1.273 +    #+caption: =CORTEX= gets one step closer to becomming a full creature
   1.274 +    #+caption: simulation environment.
   1.275 +    #+name: name
   1.276 +    #+ATTR_LaTeX: :width 15cm
   1.277 +    [[./images/physical-hand.png]]
   1.278  
   1.279  ** Eyes reuse standard video game components
   1.280