annotate org/body.org @ 51:2a6ede6d8ad8

problem was that the skeleton was not 'ready'
author Robert McIntyre <rlm@mit.edu>
date Mon, 14 Nov 2011 19:44:30 -0700
parents b1b90c4ab0bf
children 00d0e1639d4b
rev   line source
rlm@0 1 #+title: The BODY!!!
rlm@0 2 #+author: Robert McIntyre
rlm@0 3 #+email: rlm@mit.edu
rlm@4 4 #+description: Simulating a body (movement, touch, propioception) in jMonkeyEngine3.
rlm@4 5 #+SETUPFILE: ../../aurellem/org/setup.org
rlm@4 6 #+INCLUDE: ../../aurellem/org/level-0.org
rlm@4 7
rlm@45 8 * Body
rlm@0 9
rlm@0 10 #+srcname: body-main
rlm@0 11 #+begin_src clojure
rlm@44 12 (ns cortex.body
rlm@44 13 (use (cortex world util import)))
rlm@44 14
rlm@0 15 (use 'clojure.contrib.def)
rlm@0 16 (cortex.import/mega-import-jme3)
rlm@0 17 (rlm.rlm-commands/help)
rlm@0 18
rlm@44 19 ;;(.loadModel
rlm@44 20 ;; (doto (asset-manager)
rlm@44 21 ;; (.registerLoader BlenderModelLoader (into-array String ["blend"])))
rlm@44 22 ;; "Models/person/person.blend")
rlm@44 23
rlm@44 24 (defn view-model [^String model]
rlm@44 25 (view
rlm@44 26 (.loadModel
rlm@44 27 (doto (asset-manager)
rlm@44 28 (.registerLoader BlenderModelLoader (into-array String ["blend"])))
rlm@44 29 model)))
rlm@49 30
rlm@49 31 (defn load-blender-scene [^String model]
rlm@49 32 (.loadModel
rlm@49 33 (doto (asset-manager)
rlm@49 34 (.registerLoader BlenderLoader (into-array String ["blend"])))
rlm@49 35 model))
rlm@49 36
rlm@49 37 (defn load-blender-model
rlm@49 38 [^String model]
rlm@49 39 (.loadModel
rlm@49 40 (doto (asset-manager)
rlm@49 41 (.registerLoader BlenderModelLoader (into-array String ["blend"])))
rlm@49 42 model))
rlm@49 43
rlm@49 44 (defn worm
rlm@49 45 []
rlm@50 46 (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml"))
rlm@49 47
rlm@50 48 (defn oto
rlm@49 49 []
rlm@49 50 (.loadModel (asset-manager) "Models/Oto/Oto.mesh.xml"))
rlm@49 51
rlm@50 52 (defn sinbad
rlm@50 53 []
rlm@50 54 (.loadModel (asset-manager) "Models/Sinbad/Sinbad.mesh.xml"))
rlm@50 55
rlm@50 56 (defn worm-blender
rlm@50 57 []
rlm@50 58 (first (seq (.getChildren (load-blender-model
rlm@50 59 "Models/anim2/worm3.blend")))))
rlm@50 60
rlm@50 61 (defprotocol Textual
rlm@50 62 (text [something]
rlm@50 63 "Display a detailed textual analysis of the given object."))
rlm@50 64
rlm@50 65 (extend-type com.jme3.scene.Node
rlm@50 66 Textual
rlm@50 67 (text [node]
rlm@50 68 (println "Total Vertexes: " (.getVertexCount node))
rlm@50 69 (println "Total Triangles: " (.getTriangleCount node))
rlm@50 70 (println "Controls :")
rlm@50 71 (dorun (map #(text (.getControl node %)) (range (.getNumControls node))))
rlm@50 72 (println "Has " (.getQuantity node) " Children:")
rlm@50 73 (doall (map text (.getChildren node)))))
rlm@50 74
rlm@50 75 (extend-type com.jme3.animation.AnimControl
rlm@50 76 Textual
rlm@50 77 (text [control]
rlm@50 78 (let [animations (.getAnimationNames control)]
rlm@50 79 (println "Animation Control with " (count animations) " animations:")
rlm@50 80 (dorun (map println animations)))))
rlm@50 81
rlm@50 82 (extend-type com.jme3.animation.SkeletonControl
rlm@50 83 Textual
rlm@50 84 (text [control]
rlm@50 85 (println "Skeleton Control with the following skeleton:")
rlm@50 86 (println (.getSkeleton control))))
rlm@50 87
rlm@50 88 (extend-type com.jme3.scene.Geometry
rlm@50 89 Textual
rlm@50 90 (text [control]
rlm@50 91 (println "...geo...")))
rlm@50 92
rlm@50 93
rlm@50 94
rlm@50 95
rlm@50 96 (defn body
rlm@50 97 "given a node with a skeleton, will produce a body sutiable for AI
rlm@50 98 control with movement and proprioception."
rlm@50 99 [node]
rlm@50 100 (let [skeleton-control (.getControl node SkeletonControl)
rlm@50 101 krc (KinematicRagdollControl. (float 0.5))]
rlm@50 102 (dorun
rlm@50 103 (map #(.addBoneName krc %)
rlm@50 104 ["mid1" "mid2" "mid3" "tail" "head"]))
rlm@50 105 (.addControl node krc)
rlm@50 106 (.setRagdollMode krc))
rlm@50 107 node
rlm@50 108 )
rlm@50 109
rlm@51 110 (defn
rlm@51 111 green-x-ray []
rlm@51 112 (doto (Material. (asset-manager)
rlm@51 113 "Common/MatDefs/Misc/Unshaded.j3md")
rlm@51 114 (.setColor "Color" ColorRGBA/Green)
rlm@51 115 (-> (.getAdditionalRenderState) (.setDepthTest
rlm@51 116 false))))
rlm@51 117
rlm@50 118 (defn view-skeleton [node]
rlm@50 119 (let [sd
rlm@51 120
rlm@50 121 (doto
rlm@51 122 (SkeletonDebugger. "aurellem-skel-debug"
rlm@51 123 (skel node))
rlm@51 124 (.setMaterial (green-x-ray)))]
rlm@51 125 (view (doto (Node. "view node")
rlm@51 126 (.attachChild sd)
rlm@50 127
rlm@51 128
rlm@51 129
rlm@51 130
rlm@51 131 ;;(.attachChild node)
rlm@51 132 ))))
rlm@51 133
rlm@50 134
rlm@50 135 (defn init-debug-skel-node
rlm@50 136 [f debug-node skeleton]
rlm@50 137 (let [bones
rlm@50 138 (map #(.getBone skeleton %)
rlm@50 139 (range (.getBoneCount skeleton)))]
rlm@50 140 (dorun (map #(.setUserControl % true) bones))
rlm@50 141 (dorun (map (fn [b]
rlm@50 142 (println (.getName b)
rlm@50 143 " -- " (f b)))
rlm@50 144 bones))
rlm@51 145
rlm@50 146 (dorun
rlm@50 147 (map #(.attachChild
rlm@50 148 debug-node
rlm@51 149 (doto
rlm@51 150 (sphere 0.1
rlm@51 151 :position (f %)
rlm@51 152 :physical? false)
rlm@51 153 (.setMaterial (green-x-ray))))
rlm@50 154 bones)))
rlm@50 155 debug-node)
rlm@50 156
rlm@50 157 (defn skel [node]
rlm@51 158 (doto
rlm@51 159 (.getSkeleton
rlm@51 160 (.getControl node SkeletonControl))
rlm@51 161 ;; this is necessary to force the skeleton to have accurate world
rlm@51 162 ;; transforms before it is rendered to the screen.
rlm@51 163 (.resetAndUpdate)))
rlm@51 164
rlm@50 165
rlm@50 166
rlm@50 167
rlm@50 168
rlm@50 169 (view
rlm@50 170 (init-debug-skel-node
rlm@50 171 (fn [b] (.getWorldBindPosition b))
rlm@50 172 (Node. "skel-debug") (skel (worm))))
rlm@50 173
rlm@50 174
rlm@50 175
rlm@50 176
rlm@50 177
rlm@50 178 (defn test-ragdoll []
rlm@50 179
rlm@50 180 (let [the-worm
rlm@50 181 (body
rlm@50 182 (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml")
rlm@50 183 ;;(worm-blender)
rlm@50 184 )
rlm@50 185 ]
rlm@50 186
rlm@50 187
rlm@50 188 (.start
rlm@50 189 (world
rlm@50 190 (doto (Node.)
rlm@50 191 (.attachChild the-worm))
rlm@50 192 {"mouse-left" (fire-cannon-ball)}
rlm@50 193 (fn [world]
rlm@50 194 (light-up-everything world)
rlm@50 195 ;;(.setTimer world (NanoTimer.))
rlm@50 196 ;;(org.lwjgl.input.Mouse/setGrabbed false)
rlm@50 197 )
rlm@50 198 no-op
rlm@50 199 )
rlm@50 200
rlm@50 201
rlm@50 202 )))
rlm@50 203
rlm@50 204
rlm@50 205
rlm@50 206
rlm@50 207
rlm@50 208
rlm@50 209
rlm@50 210
rlm@50 211
rlm@50 212
rlm@50 213
rlm@50 214
rlm@50 215
rlm@50 216
rlm@50 217
rlm@50 218
rlm@49 219
rlm@49 220
rlm@49 221 (defn test-worm-anim []
rlm@49 222
rlm@50 223 (let [the-worm
rlm@50 224 ;; (oto)
rlm@50 225 (worm-blender)
rlm@50 226 anim-control (.getControl the-worm AnimControl)
rlm@49 227 channel (doto (.createChannel anim-control)
rlm@50 228 ;; (.setAnim "Walk")
rlm@50 229 (.setAnim "moveHead")
rlm@50 230 )
rlm@49 231
rlm@49 232 play-anim
rlm@50 233 no-op
rlm@50 234 ;; (fn [world pressed]
rlm@50 235 ;; (if (not pressed)
rlm@50 236 ;; (do
rlm@50 237 ;; (println-repl "space")
rlm@50 238 ;; ;; (.setAnim channel "moveHead")
rlm@50 239 ;; (.setAnim channel "Walk" (float 0.5))
rlm@50 240 ;; )))
rlm@49 241
rlm@49 242 ]
rlm@49 243
rlm@49 244 (.start
rlm@49 245 (world
rlm@49 246 (doto (Node.)
rlm@49 247 (.attachChild the-worm))
rlm@50 248 {"key-space" play-anim
rlm@50 249 "mouse-left" (fire-cannon-ball)}
rlm@50 250 (fn [world]
rlm@50 251 (light-up-everything world)
rlm@50 252 ;;(.setTimer world (NanoTimer.))
rlm@50 253 (org.lwjgl.input.Mouse/setGrabbed false)
rlm@50 254 )
rlm@49 255 no-op
rlm@49 256 )
rlm@49 257
rlm@49 258
rlm@49 259 )))
rlm@49 260
rlm@50 261
rlm@50 262
rlm@50 263
rlm@49 264
rlm@49 265
rlm@49 266
rlm@0 267 #+end_src
rlm@0 268
rlm@0 269
rlm@0 270
rlm@0 271
rlm@0 272
rlm@0 273
rlm@0 274
rlm@0 275
rlm@0 276 * COMMENT generate Source.
rlm@44 277 #+begin_src clojure :tangle ../src/cortex/body.clj
rlm@0 278 <<body-main>>
rlm@0 279 #+end_src
rlm@0 280