Mercurial > cortex
view org/body.org @ 57:37a3256e1ed3
problems resolved
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Wed, 16 Nov 2011 02:42:50 -0700 |
parents | 8b571c137f81 |
children | 25142dad240a |
line wrap: on
line source
1 #+title: The BODY!!!2 #+author: Robert McIntyre3 #+email: rlm@mit.edu4 #+description: Simulating a body (movement, touch, propioception) in jMonkeyEngine3.5 #+SETUPFILE: ../../aurellem/org/setup.org6 #+INCLUDE: ../../aurellem/org/level-0.org8 * COMMENT Body10 #+srcname: body-main11 #+begin_src clojure12 (ns cortex.body13 (use (cortex world util import)))15 (use 'clojure.contrib.def)16 (cortex.import/mega-import-jme3)17 (rlm.rlm-commands/help)19 ;;(.loadModel20 ;; (doto (asset-manager)21 ;; (.registerLoader BlenderModelLoader (into-array String ["blend"])))22 ;; "Models/person/person.blend")24 (defn view-model [^String model]25 (view26 (.loadModel27 (doto (asset-manager)28 (.registerLoader BlenderModelLoader (into-array String ["blend"])))29 model)))31 (defn load-blender-scene [^String model]32 (.loadModel33 (doto (asset-manager)34 (.registerLoader BlenderLoader (into-array String ["blend"])))35 model))37 (defn load-blender-model38 [^String model]39 (.loadModel40 (doto (asset-manager)41 (.registerLoader BlenderModelLoader (into-array String ["blend"])))42 model))44 (defn worm45 []46 (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml"))48 (defn oto49 []50 (.loadModel (asset-manager) "Models/Oto/Oto.mesh.xml"))52 (defn sinbad53 []54 (.loadModel (asset-manager) "Models/Sinbad/Sinbad.mesh.xml"))56 (defn worm-blender57 []58 (first (seq (.getChildren (load-blender-model59 "Models/anim2/simple-worm.blend")))))61 (defn skel [node]62 (doto63 (.getSkeleton64 (.getControl node SkeletonControl))65 ;; this is necessary to force the skeleton to have accurate world66 ;; transforms before it is rendered to the screen.67 (.resetAndUpdate)))69 (defprotocol Textual70 (text [something]71 "Display a detailed textual analysis of the given object."))73 (extend-type com.jme3.scene.Node74 Textual75 (text [node]76 (println "Total Vertexes: " (.getVertexCount node))77 (println "Total Triangles: " (.getTriangleCount node))78 (println "Controls :")79 (dorun (map #(text (.getControl node %)) (range (.getNumControls node))))80 (println "Has " (.getQuantity node) " Children:")81 (doall (map text (.getChildren node)))))83 (extend-type com.jme3.animation.AnimControl84 Textual85 (text [control]86 (let [animations (.getAnimationNames control)]87 (println "Animation Control with " (count animations) " animation(s):")88 (dorun (map println animations)))))90 (extend-type com.jme3.animation.SkeletonControl91 Textual92 (text [control]93 (println "Skeleton Control with the following skeleton:")94 (println (.getSkeleton control))))96 (extend-type com.jme3.bullet.control.KinematicRagdollControl97 Textual98 (text [control]99 (println "Ragdoll Control")))102 (extend-type com.jme3.scene.Geometry103 Textual104 (text [control]105 (println "...geo...")))110 (defn body111 "given a node with a SkeletonControl, will produce a body sutiable112 for AI control with movement and proprioception."113 [node]114 (let [skeleton-control (.getControl node SkeletonControl)115 krc (KinematicRagdollControl.)]116 (comment117 (dorun118 (map #(.addBoneName krc %)119 ["mid2" "tail" "head" "mid1" "mid3" "mid4" "Dummy-Root" ""]120 ;;"mid2" "mid3" "tail" "head"]121 )))122 (.addControl node krc)123 (.setRagdollMode krc)124 )125 node126 )128 (defn green-x-ray []129 (doto (Material. (asset-manager)130 "Common/MatDefs/Misc/Unshaded.j3md")131 (.setColor "Color" ColorRGBA/Green)132 (-> (.getAdditionalRenderState)133 (.setDepthTest false))))135 (defn show-skeleton [node]136 (let [sd138 (doto139 (SkeletonDebugger. "aurellem-skel-debug"140 (skel node))141 (.setMaterial (green-x-ray)))]142 (.attachChild node sd)143 node))147 (defn init-debug-skel-node148 [f debug-node skeleton]149 (let [bones150 (map #(.getBone skeleton %)151 (range (.getBoneCount skeleton)))]152 (dorun (map #(.setUserControl % true) bones))153 (dorun (map (fn [b]154 (println (.getName b)155 " -- " (f b)))156 bones))157 (dorun158 (map #(.attachChild159 debug-node160 (doto161 (sphere 0.1162 :position (f %)163 :physical? false)164 (.setMaterial (green-x-ray))))165 bones)))166 debug-node)168 (import jme3test.bullet.PhysicsTestHelper)171 (defn test-zzz [the-worm world value]172 (if (not value)173 (let [skeleton (skel the-worm)]174 (println-repl "enabling bones")175 (dorun176 (map177 #(.setUserControl (.getBone skeleton %) true)178 (range (.getBoneCount skeleton))))181 (let [b (.getBone skeleton 2)]182 (println-repl "moving " (.getName b))183 (println-repl (.getLocalPosition b))184 (.setUserTransforms b185 Vector3f/UNIT_X186 Quaternion/IDENTITY187 ;;(doto (Quaternion.)188 ;; (.fromAngles (/ Math/PI 2)189 ;; 0190 ;; 0192 (Vector3f. 1 1 1))193 )195 (println-repl "hi! <3"))))198 (defn test-ragdoll []200 (let [the-worm202 ;;(.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml")203 (doto (show-skeleton (worm-blender))204 (.setLocalTranslation (Vector3f. 0 10 0))205 ;;(worm)206 ;;(oto)207 ;;(sinbad)208 )209 ]212 (.start213 (world214 (doto (Node.)215 (.attachChild the-worm))216 {"key-return" (fire-cannon-ball)217 "key-space" (partial test-zzz the-worm)218 }219 (fn [world]220 (light-up-everything world)221 (PhysicsTestHelper/createPhysicsTestWorld222 (.getRootNode world)223 (asset-manager)224 (.getPhysicsSpace225 (.getState (.getStateManager world) BulletAppState)))226 (set-gravity world Vector3f/ZERO)227 ;;(.setTimer world (NanoTimer.))228 ;;(org.lwjgl.input.Mouse/setGrabbed false)229 )230 no-op231 )234 )))236 (defn joint-control237 [joint]238 (let [physics-space (ref nil)]239 (reify PhysicsControl240 (setPhysicsSpace [this space]241 (dosync242 (ref-set physics-space space))243 (.addJoint space joint))244 (update [this tpf])245 (setSpatial [this spatial])246 (render [this rm vp])247 (getPhysicsSpace [this] (deref physics-space))248 (isEnabled [this] true)249 (setEnabled [this state]))))251 (defn add-joint252 "Add a joint to a particular object. When the object is added to the253 PhysicsSpace of a simulation, the joint will also be added"254 [object joint]255 (let [control (joint-control joint)]256 (.addControl object control))257 object)259 (defn hinge-world260 []261 (let [sphere1 (sphere)262 sphere2 (sphere 1 :position (Vector3f. 3 3 3))263 joint (Point2PointJoint.264 (.getControl sphere1 RigidBodyControl)265 (.getControl sphere2 RigidBodyControl)266 Vector3f/ZERO (Vector3f. 3 3 3))]267 (add-joint sphere1 joint)268 (doto (Node. "hinge-world")269 (.attachChild sphere1)270 (.attachChild sphere2))))272 (defn test-joint []273 (view (hinge-world)))278 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;279 ;;; here is the ragdoll stuff281 (def worm-mesh (.getMesh (.getChild (worm-blender) 0)))282 (def mesh worm-mesh)284 (.getFloatBuffer mesh VertexBuffer$Type/Position)285 (.getFloatBuffer mesh VertexBuffer$Type/BoneWeight)286 (.getData (.getBuffer mesh VertexBuffer$Type/BoneIndex))289 (defn position [index]290 (.get291 (.getFloatBuffer worm-mesh VertexBuffer$Type/Position)292 index))294 (defn bones [index]295 (.get296 (.getData (.getBuffer mesh VertexBuffer$Type/BoneIndex))297 index))299 (defn bone-weights [index]300 (.get301 (.getFloatBuffer mesh VertexBuffer$Type/BoneWeight)302 index))306 (defn vertex-bones [vertex]307 (vec (map (comp int bones) (range (* vertex 4) (+ (* vertex 4) 4)))))309 (defn vertex-weights [vertex]310 (vec (map (comp float bone-weights) (range (* vertex 4) (+ (* vertex 4) 4)))))312 (defn vertex-position [index]313 (let [offset (* index 3)]314 (Vector3f. (position offset)315 (position (inc offset))316 (position (inc(inc offset))))))318 (def vertex-info (juxt vertex-position vertex-bones vertex-weights))320 (defn bone-control-color [index]321 (get {[1 0 0 0] ColorRGBA/Red322 [1 2 0 0] ColorRGBA/Magenta323 [2 0 0 0] ColorRGBA/Blue}324 (vertex-bones index)325 ColorRGBA/White))327 (defn influence-color [index bone-num]328 (get329 {(float 0) ColorRGBA/Blue330 (float 0.5) ColorRGBA/Green331 (float 1) ColorRGBA/Red}332 ;; find the weight of the desired bone333 ((zipmap (vertex-bones index)(vertex-weights index))334 bone-num)335 ColorRGBA/Blue))340 (def worm-vertices (set (map vertex-info (range 60))))343 (defn test-info []344 (let [points (Node.)]345 (dorun346 (map #(.attachChild points %)347 (map #(sphere 0.01348 :position (vertex-position %)349 :color (influence-color % 1)350 :physical? false)351 (range 60))))352 (view points)))361 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;370 #+end_src379 * COMMENT generate Source.380 #+begin_src clojure :tangle ../src/cortex/body.clj381 <<body-main>>382 #+end_src