rlm@0: #+title: The BODY!!! rlm@0: #+author: Robert McIntyre rlm@0: #+email: rlm@mit.edu rlm@4: #+description: Simulating a body (movement, touch, propioception) in jMonkeyEngine3. rlm@4: #+SETUPFILE: ../../aurellem/org/setup.org rlm@4: #+INCLUDE: ../../aurellem/org/level-0.org rlm@4: rlm@45: * Body rlm@0: rlm@0: #+srcname: body-main rlm@0: #+begin_src clojure rlm@44: (ns cortex.body rlm@44: (use (cortex world util import))) rlm@44: rlm@0: (use 'clojure.contrib.def) rlm@0: (cortex.import/mega-import-jme3) rlm@0: (rlm.rlm-commands/help) rlm@0: rlm@44: ;;(.loadModel rlm@44: ;; (doto (asset-manager) rlm@44: ;; (.registerLoader BlenderModelLoader (into-array String ["blend"]))) rlm@44: ;; "Models/person/person.blend") rlm@44: rlm@44: (defn view-model [^String model] rlm@44: (view rlm@44: (.loadModel rlm@44: (doto (asset-manager) rlm@44: (.registerLoader BlenderModelLoader (into-array String ["blend"]))) rlm@44: model))) rlm@49: rlm@49: (defn load-blender-scene [^String model] rlm@49: (.loadModel rlm@49: (doto (asset-manager) rlm@49: (.registerLoader BlenderLoader (into-array String ["blend"]))) rlm@49: model)) rlm@49: rlm@49: (defn load-blender-model rlm@49: [^String model] rlm@49: (.loadModel rlm@49: (doto (asset-manager) rlm@49: (.registerLoader BlenderModelLoader (into-array String ["blend"]))) rlm@49: model)) rlm@49: rlm@49: (defn worm rlm@49: [] rlm@50: (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml")) rlm@49: rlm@50: (defn oto rlm@49: [] rlm@49: (.loadModel (asset-manager) "Models/Oto/Oto.mesh.xml")) rlm@49: rlm@50: (defn sinbad rlm@50: [] rlm@50: (.loadModel (asset-manager) "Models/Sinbad/Sinbad.mesh.xml")) rlm@50: rlm@50: (defn worm-blender rlm@50: [] rlm@50: (first (seq (.getChildren (load-blender-model rlm@50: "Models/anim2/worm3.blend"))))) rlm@50: rlm@50: rlm@50: (defprotocol Textual rlm@50: (text [something] rlm@50: "Display a detailed textual analysis of the given object.")) rlm@50: rlm@50: (extend-type com.jme3.scene.Node rlm@50: Textual rlm@50: (text [node] rlm@50: (println "Total Vertexes: " (.getVertexCount node)) rlm@50: (println "Total Triangles: " (.getTriangleCount node)) rlm@50: (println "Controls :") rlm@50: (dorun (map #(text (.getControl node %)) (range (.getNumControls node)))) rlm@50: (println "Has " (.getQuantity node) " Children:") rlm@50: (doall (map text (.getChildren node))))) rlm@50: rlm@50: (extend-type com.jme3.animation.AnimControl rlm@50: Textual rlm@50: (text [control] rlm@50: (let [animations (.getAnimationNames control)] rlm@50: (println "Animation Control with " (count animations) " animations:") rlm@50: (dorun (map println animations))))) rlm@50: rlm@50: (extend-type com.jme3.animation.SkeletonControl rlm@50: Textual rlm@50: (text [control] rlm@50: (println "Skeleton Control with the following skeleton:") rlm@50: (println (.getSkeleton control)))) rlm@50: rlm@50: (extend-type com.jme3.scene.Geometry rlm@50: Textual rlm@50: (text [control] rlm@50: (println "...geo..."))) rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: (defn body rlm@50: "given a node with a skeleton, will produce a body sutiable for AI rlm@50: control with movement and proprioception." rlm@50: [node] rlm@50: (let [skeleton-control (.getControl node SkeletonControl) rlm@50: krc (KinematicRagdollControl. (float 0.5))] rlm@50: (dorun rlm@50: (map #(.addBoneName krc %) rlm@50: ["mid1" "mid2" "mid3" "tail" "head"])) rlm@50: (.addControl node krc) rlm@50: (.setRagdollMode krc)) rlm@50: node rlm@50: ) rlm@50: rlm@50: (defn view-skeleton [node] rlm@50: (let [sd rlm@50: (doto rlm@50: (SkeletonDebugger. "aurellem-skel-debug" (skel node)) rlm@50: (.setMaterial rlm@50: (doto (Material. (asset-manager) rlm@50: "Common/MatDefs/Misc/Unshaded.j3md") rlm@50: (-> (.getAdditionalRenderState) (.setDepthTest rlm@50: false)))))] rlm@50: rlm@50: (.attachChild debug-node sd))) rlm@50: rlm@50: rlm@50: (defn init-debug-skel-node rlm@50: [f debug-node skeleton] rlm@50: (let [bones rlm@50: (map #(.getBone skeleton %) rlm@50: (range (.getBoneCount skeleton)))] rlm@50: (dorun (map #(.setUserControl % true) bones)) rlm@50: (dorun (map (fn [b] rlm@50: (println (.getName b) rlm@50: " -- " (f b))) rlm@50: bones)) rlm@50: rlm@50: (dorun rlm@50: (map #(.attachChild rlm@50: debug-node rlm@50: (sphere 0.1 rlm@50: :position (f %) rlm@50: :rotation (.getWorldBindRotation %) rlm@50: :physical? false)) rlm@50: bones))) rlm@50: debug-node) rlm@50: rlm@50: (defn skel [node] rlm@50: (.getSkeleton (.getControl node SkeletonControl))) rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: (view rlm@50: (init-debug-skel-node rlm@50: (fn [b] (.getWorldBindPosition b)) rlm@50: (Node. "skel-debug") (skel (worm)))) rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: (defn test-ragdoll [] rlm@50: rlm@50: (let [the-worm rlm@50: (body rlm@50: (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml") rlm@50: ;;(worm-blender) rlm@50: ) rlm@50: ] rlm@50: rlm@50: rlm@50: (.start rlm@50: (world rlm@50: (doto (Node.) rlm@50: (.attachChild the-worm)) rlm@50: {"mouse-left" (fire-cannon-ball)} rlm@50: (fn [world] rlm@50: (light-up-everything world) rlm@50: ;;(.setTimer world (NanoTimer.)) rlm@50: ;;(org.lwjgl.input.Mouse/setGrabbed false) rlm@50: ) rlm@50: no-op rlm@50: ) rlm@50: rlm@50: rlm@50: ))) rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@50: rlm@49: rlm@49: rlm@49: (defn test-worm-anim [] rlm@49: rlm@50: (let [the-worm rlm@50: ;; (oto) rlm@50: (worm-blender) rlm@50: anim-control (.getControl the-worm AnimControl) rlm@49: channel (doto (.createChannel anim-control) rlm@50: ;; (.setAnim "Walk") rlm@50: (.setAnim "moveHead") rlm@50: ) rlm@49: rlm@49: play-anim rlm@50: no-op rlm@50: ;; (fn [world pressed] rlm@50: ;; (if (not pressed) rlm@50: ;; (do rlm@50: ;; (println-repl "space") rlm@50: ;; ;; (.setAnim channel "moveHead") rlm@50: ;; (.setAnim channel "Walk" (float 0.5)) rlm@50: ;; ))) rlm@49: rlm@49: ] rlm@49: rlm@49: (.start rlm@49: (world rlm@49: (doto (Node.) rlm@49: (.attachChild the-worm)) rlm@50: {"key-space" play-anim rlm@50: "mouse-left" (fire-cannon-ball)} rlm@50: (fn [world] rlm@50: (light-up-everything world) rlm@50: ;;(.setTimer world (NanoTimer.)) rlm@50: (org.lwjgl.input.Mouse/setGrabbed false) rlm@50: ) rlm@49: no-op rlm@49: ) rlm@49: rlm@49: rlm@49: ))) rlm@49: rlm@50: rlm@50: rlm@50: rlm@49: rlm@49: rlm@49: rlm@0: #+end_src rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: * COMMENT generate Source. rlm@44: #+begin_src clojure :tangle ../src/cortex/body.clj rlm@0: <> rlm@0: #+end_src rlm@0: