Mercurial > cortex
view org/movement.org @ 223:14718d7b19eb
minor fix
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 11 Feb 2012 12:26:54 -0700 |
parents | 66fbab414d45 |
children | 959127e21f81 |
line wrap: on
line source
1 #+title: Movement!2 #+author: Robert McIntyre3 #+email: rlm@mit.edu4 #+description: muscles for a simulated creature5 #+keywords: simulation, jMonkeyEngine3, clojure6 #+SETUPFILE: ../../aurellem/org/setup.org7 #+INCLUDE: ../../aurellem/org/level-0.org10 Surprisingly enough, terristerial creatures only move by using torque11 applied about their joints. There's not a single straight line of12 force in the human body at all! (A straight line of force would13 correspond to some sort of jet or rocket propulseion.)16 Here's how motor-control/ proprioception will work: Each muscle is17 defined by a 1-D array of numbers (the "motor pool") each of which18 represent muscle fibers. A muscle also has a scalar :strength factor19 which determines how strong the muscle as a whole is. The effector20 function for a muscle takes a number < (count motor-pool) and that21 number is said to "activate" all the muscle fibers whose index is22 lower than the number. Each fiber will apply force in proportion to23 its value in the array. Lower values cause less force. The lower24 values can be put at the "beginning" of the 1-D array to simulate the25 layout of actual human muscles, which are capable of more percise26 movements when exerting less force.28 #+name: movement29 #+begin_src clojure30 (ns cortex.movement31 "Give simulated creatures defined in special blender files the power32 to move around in a simulated environment."33 {:author "Robert McIntyre"}34 (:use (cortex world util sense body))35 (:use clojure.contrib.def)36 (:import java.awt.image.BufferedImage)37 (:import com.jme3.scene.Node)38 (:import com.jme3.math.Vector3f)39 (:import com.jme3.bullet.control.RigidBodyControl))41 (defn muscle-profile42 "Return a vector where each entry is the strength of the \"motor43 pool\" at that part in the muscle."44 [#^BufferedImage profile]45 (vec46 (let [width (.getWidth profile)]47 (for [x (range width)]48 (- 25549 (bit-and50 0x0000FF51 (.getRGB profile x 0)))))))53 (defvar54 ^{:arglists '([creature])}55 muscles56 (sense-nodes "muscles")57 "Return the children of the creature's \"muscles\" node.")59 (defn movement-fn60 "Returns a function which when called with a integer value inside a61 running simulation will cause movement in the creature according62 to the muscle's position and strength profile. Each function63 returns the amount of force applied / max force."64 [#^Node parts #^Node muscle]65 (let [target (closest-node parts muscle)66 axis67 (.mult (.getWorldRotation muscle) Vector3f/UNIT_Y)68 strength (meta-data muscle "strength")69 image-name (read-string (meta-data muscle "muscle"))70 image (load-image image-name)71 fibers (muscle-profile image)72 fiber-integral (reductions + fibers)73 force-index74 (vec (map #(float (* strength (/ % (last fiber-integral))))75 fiber-integral))76 control (.getControl target RigidBodyControl)]77 (fn [n]78 (let [pool-index (max 0 (min n (dec (count fibers))))79 force (force-index pool-index)]80 (.applyTorque control (.mult axis force))81 (float (/ force strength))))))84 (defn movement!85 "Endow the creature with the power of movement. Returns a sequence86 of functions, each of which accept an integer value and will87 activate their corresponding muscle."88 [#^Node creature]89 (for [muscle (muscles creature)]90 (movement-fn creature muscle)))92 (defn movement-display-kernel93 "Display muscle exertion data as a bar filling up with red."94 [exertion]95 (let [height 2096 width 30097 image (BufferedImage. width height98 BufferedImage/TYPE_INT_RGB)99 fill (min (int (* width exertion)) width)]100 (dorun101 (for [x (range fill)102 y (range height)]103 (.setRGB image x y 0xFF0000)))104 image))106 (defn view-movement107 "Creates a function which accepts a list of muscle-exertion data and108 displays each element of the list to the screen."109 []110 (view-sense movement-display-kernel))112 #+end_src118 * COMMENT code generation119 #+begin_src clojure :tangle ../src/cortex/movement.clj120 <<movement>>121 #+end_src