annotate org/body.org @ 52:00d0e1639d4b

simplified world, got buggy physics ragdoll working
author Robert McIntyre <rlm@mit.edu>
date Mon, 14 Nov 2011 21:30:23 -0700
parents 2a6ede6d8ad8
children bb24106cbd6a
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@52 61 (defn skel [node]
rlm@52 62 (doto
rlm@52 63 (.getSkeleton
rlm@52 64 (.getControl node SkeletonControl))
rlm@52 65 ;; this is necessary to force the skeleton to have accurate world
rlm@52 66 ;; transforms before it is rendered to the screen.
rlm@52 67 (.resetAndUpdate)))
rlm@52 68
rlm@50 69 (defprotocol Textual
rlm@50 70 (text [something]
rlm@50 71 "Display a detailed textual analysis of the given object."))
rlm@50 72
rlm@50 73 (extend-type com.jme3.scene.Node
rlm@50 74 Textual
rlm@50 75 (text [node]
rlm@50 76 (println "Total Vertexes: " (.getVertexCount node))
rlm@50 77 (println "Total Triangles: " (.getTriangleCount node))
rlm@50 78 (println "Controls :")
rlm@50 79 (dorun (map #(text (.getControl node %)) (range (.getNumControls node))))
rlm@50 80 (println "Has " (.getQuantity node) " Children:")
rlm@50 81 (doall (map text (.getChildren node)))))
rlm@50 82
rlm@50 83 (extend-type com.jme3.animation.AnimControl
rlm@50 84 Textual
rlm@50 85 (text [control]
rlm@50 86 (let [animations (.getAnimationNames control)]
rlm@52 87 (println "Animation Control with " (count animations) " animation(s):")
rlm@50 88 (dorun (map println animations)))))
rlm@50 89
rlm@50 90 (extend-type com.jme3.animation.SkeletonControl
rlm@50 91 Textual
rlm@50 92 (text [control]
rlm@50 93 (println "Skeleton Control with the following skeleton:")
rlm@50 94 (println (.getSkeleton control))))
rlm@50 95
rlm@52 96 (extend-type com.jme3.bullet.control.KinematicRagdollControl
rlm@52 97 Textual
rlm@52 98 (text [control]
rlm@52 99 (println "Ragdoll Control")))
rlm@52 100
rlm@52 101
rlm@50 102 (extend-type com.jme3.scene.Geometry
rlm@50 103 Textual
rlm@50 104 (text [control]
rlm@50 105 (println "...geo...")))
rlm@50 106
rlm@50 107
rlm@50 108
rlm@50 109
rlm@50 110 (defn body
rlm@52 111 "given a node with a SkeletonControl, will produce a body sutiable
rlm@52 112 for AI control with movement and proprioception."
rlm@50 113 [node]
rlm@50 114 (let [skeleton-control (.getControl node SkeletonControl)
rlm@50 115 krc (KinematicRagdollControl. (float 0.5))]
rlm@50 116 (dorun
rlm@50 117 (map #(.addBoneName krc %)
rlm@52 118 ["mid1" "mid2" "mid3" "tail" "head"]
rlm@52 119 ;; ["Ulna.L"
rlm@52 120 ;; "Ulna.R"
rlm@52 121 ;; "Chest"
rlm@52 122 ;; "Foot.L"
rlm@52 123 ;; "Foot.R"
rlm@52 124 ;; "Hand.R"
rlm@52 125 ;; "Hand.L"
rlm@52 126 ;; "Neck"
rlm@52 127 ;; "Root"
rlm@52 128 ;; "Stomach"
rlm@52 129 ;; "Waist"
rlm@52 130 ;; "Humerus.L"
rlm@52 131 ;; "Humerus.R"
rlm@52 132 ;; "Thigh.L"
rlm@52 133 ;; "Thigh.R"
rlm@52 134 ;; "Calf.L"
rlm@52 135 ;; "Calf.R"
rlm@52 136 ;; "Clavicle.L"
rlm@52 137 ;; "Clavicle.R"]
rlm@52 138 ))
rlm@52 139
rlm@52 140
rlm@52 141
rlm@50 142 (.addControl node krc)
rlm@52 143 (.setRagdollMode krc)
rlm@52 144 )
rlm@50 145 node
rlm@50 146 )
rlm@50 147
rlm@52 148 (defn green-x-ray []
rlm@51 149 (doto (Material. (asset-manager)
rlm@51 150 "Common/MatDefs/Misc/Unshaded.j3md")
rlm@51 151 (.setColor "Color" ColorRGBA/Green)
rlm@52 152 (-> (.getAdditionalRenderState)
rlm@52 153 (.setDepthTest false))))
rlm@51 154
rlm@50 155 (defn view-skeleton [node]
rlm@50 156 (let [sd
rlm@51 157
rlm@50 158 (doto
rlm@51 159 (SkeletonDebugger. "aurellem-skel-debug"
rlm@51 160 (skel node))
rlm@51 161 (.setMaterial (green-x-ray)))]
rlm@51 162 (view (doto (Node. "view node")
rlm@51 163 (.attachChild sd)
rlm@50 164
rlm@51 165
rlm@51 166
rlm@51 167
rlm@51 168 ;;(.attachChild node)
rlm@51 169 ))))
rlm@51 170
rlm@50 171
rlm@50 172 (defn init-debug-skel-node
rlm@50 173 [f debug-node skeleton]
rlm@50 174 (let [bones
rlm@50 175 (map #(.getBone skeleton %)
rlm@50 176 (range (.getBoneCount skeleton)))]
rlm@50 177 (dorun (map #(.setUserControl % true) bones))
rlm@50 178 (dorun (map (fn [b]
rlm@50 179 (println (.getName b)
rlm@50 180 " -- " (f b)))
rlm@50 181 bones))
rlm@51 182
rlm@50 183 (dorun
rlm@50 184 (map #(.attachChild
rlm@50 185 debug-node
rlm@51 186 (doto
rlm@51 187 (sphere 0.1
rlm@51 188 :position (f %)
rlm@51 189 :physical? false)
rlm@51 190 (.setMaterial (green-x-ray))))
rlm@50 191 bones)))
rlm@50 192 debug-node)
rlm@50 193
rlm@52 194 (import jme3test.bullet.PhysicsTestHelper)
rlm@50 195
rlm@50 196 (defn test-ragdoll []
rlm@50 197
rlm@50 198 (let [the-worm
rlm@50 199 (body
rlm@52 200 ;;(.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml")
rlm@50 201 ;;(worm-blender)
rlm@52 202 (worm)
rlm@52 203 ;;(oto)
rlm@52 204 ;;(sinbad)
rlm@50 205 )
rlm@50 206 ]
rlm@50 207
rlm@50 208
rlm@50 209 (.start
rlm@50 210 (world
rlm@50 211 (doto (Node.)
rlm@50 212 (.attachChild the-worm))
rlm@50 213 {"mouse-left" (fire-cannon-ball)}
rlm@50 214 (fn [world]
rlm@50 215 (light-up-everything world)
rlm@52 216 (PhysicsTestHelper/createPhysicsTestWorld
rlm@52 217 (.getRootNode world)
rlm@52 218 (asset-manager)
rlm@52 219 (.getPhysicsSpace
rlm@52 220 (.getState (.getStateManager world) BulletAppState)))
rlm@50 221 ;;(.setTimer world (NanoTimer.))
rlm@50 222 ;;(org.lwjgl.input.Mouse/setGrabbed false)
rlm@50 223 )
rlm@50 224 no-op
rlm@50 225 )
rlm@50 226
rlm@50 227
rlm@50 228 )))
rlm@50 229
rlm@50 230
rlm@50 231
rlm@49 232
rlm@50 233
rlm@50 234
rlm@50 235
rlm@49 236
rlm@49 237
rlm@49 238
rlm@0 239 #+end_src
rlm@0 240
rlm@0 241
rlm@0 242
rlm@0 243
rlm@0 244
rlm@0 245
rlm@0 246
rlm@0 247
rlm@0 248 * COMMENT generate Source.
rlm@44 249 #+begin_src clojure :tangle ../src/cortex/body.clj
rlm@0 250 <<body-main>>
rlm@0 251 #+end_src
rlm@0 252