Skip to content

Instantly share code, notes, and snippets.

@nariakiiwatani
Created July 5, 2020 06:51
Show Gist options
  • Save nariakiiwatani/7a9bdb8b524477be2f1b201474a415db to your computer and use it in GitHub Desktop.
Save nariakiiwatani/7a9bdb8b524477be2f1b201474a415db to your computer and use it in GitHub Desktop.
(defn ccd-ik-root
{:inverse (fn [[target edge] [pos length angle]]
(let [p0 pos
diffAngle (- (vec2/angle (vec2/- target p0)) (vec2/angle (vec2/- edge p0)))
newAngle (+ angle diffAngle)]
[pos length newAngle]))}
[pos length angle]
(let [p0 pos
p1 (vec2/+ p0 (vec2/dir angle length))]
{:p0 p0 :p1 p1 :angle angle
:path [(line p0 p1)]}
))
(defn ccd-ik-limb
{:inverse (fn [[target edge] [length angle parent]]
(let [p0 (get parent :p1)
diffAngle (- (vec2/angle (vec2/- target p0)) (vec2/angle (vec2/- edge p0)))
newAngle (+ angle diffAngle)
newEdge (vec2/rotate p0 diffAngle edge)
param [target newEdge]]
[length newAngle param]))}
[length angle parent]
(let [p0 (get parent :p1)
angle (+ angle (get parent :angle))
p1 (vec2/+ p0 (vec2/dir angle length))]
{:p0 p0 :p1 p1 :angle angle
:path (concat (get parent :path) [(line p0 p1)])}
))
(defn ccd-ik-edge
{:inverse (fn [target [length angle parent]]
(let [p0 (get parent :p1)
absAngle (vec2/angle (vec2/- target p0))
relAngle (- absAngle (get parent :angle))
edge (vec2/+ p0 (vec2/dir absAngle length))
param [target edge]]
[length relAngle param]))}
[length angle parent]
(let [p0 (get parent :p1)
angle (+ angle (get parent :angle))
p1 (vec2/+ p0 (vec2/dir angle length))]
{:p0 p0 :p1 p1 :angle angle
:path (concat (get parent :path) [(line p0 p1)])}
))
(defn ccd-ik-target
{:handles {:draw (fn [{:params [pos edge]}] [{:type "point" :pos pos}])
:drag (fn [{:pos p :params [pos edge]}] [p p])}}
[pos edge]
(get edge :path)
)
(style (stroke "salmon" 5)
(ccd-ik-target [-369.5 33.3125] (ccd-ik-edge 10 (deg -3239.2754086096165) (ccd-ik-limb 10 (deg -369.67028704771707) (ccd-ik-limb 20 (deg 1799.9923213958866) (ccd-ik-limb 30 (deg 730.2140285230621) (ccd-ik-limb 40 (deg 720.1639597252323) (ccd-ik-limb 50 (deg 713.8889350806504) (ccd-ik-root [0 0] 60 -3.19727183964033)))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment