Mercurial > cortex
view org/body.org @ 55:8b95180f5c69
getting basic hinges to work
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Tue, 15 Nov 2011 17:48:10 -0700 |
parents | 7bc3b22c507b |
children | 8b571c137f81 |
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/worm3.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 6)]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 )))239 (defn joint-control240 [joint]241 (let [physics-space (ref nil)242 enabled? (ref true)]243 (reify PhysicsControl244 (setPhysicsSpace [this space]245 (dosync246 (ref-set physics-space space))247 (.addJoint space joint))248 (update [this tpf])249 (setSpatial [this spatial])250 (render [this rm vp])251 (getPhysicsSpace [this] (deref physics-space))252 (isEnabled [this] (deref enabled?))253 (setEnabled [this state]254 (dosync (ref-set enabled? state))))))256 (defn add-joint257 "Add a joint to a particular object. When the object is added to the258 PhysicsSpace of a simulation, the joint will also be added"259 [object joint]260 (let [control (joint-control joint)]261 (.addControl object control))262 object)264 (defn hinge-world265 []266 (let [sphere1 (sphere)267 sphere2 (sphere 1 :position (Vector3f. 3 3 3))268 joint (Point2PointJoint.269 (.getControl sphere1 RigidBodyControl)270 (.getControl sphere2 RigidBodyControl)271 Vector3f/ZERO (Vector3f. 3 3 3))]272 (add-joint sphere1 joint)273 (doto (Node. "hinge-world")274 (.attachChild sphere1)275 (.attachChild sphere2))))278 (defn test-joint279 []280 (.start281 (world282 (doto (Node.)283 (.attachChild288 #+end_src297 * COMMENT generate Source.298 #+begin_src clojure :tangle ../src/cortex/body.clj299 <<body-main>>300 #+end_src