Created
July 5, 2020 06:51
-
-
Save nariakiiwatani/7a9bdb8b524477be2f1b201474a415db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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