From 5357157f112c944395e4f703346b3f7a0f9dc989 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Thu, 21 Nov 2013 20:52:46 -0500 Subject: [PATCH] fix model origin by centering --- src/cko2dae/core.clj | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/cko2dae/core.clj b/src/cko2dae/core.clj index 9c59c6e..7deed83 100644 --- a/src/cko2dae/core.clj +++ b/src/cko2dae/core.clj @@ -4,7 +4,9 @@ fs.core) (:import java.text.SimpleDateFormat java.util.Calendar - java.util.TimeZone) + java.util.TimeZone + java.lang.Math + java.lang.Double) (:gen-class)) (defrecord vec3 [x y z]) @@ -26,6 +28,28 @@ qRight (rgpoly-quad (->vec3 x_ y z) (->vec3 x_ y_ z) (->vec3 x_ y z_) (->vec3 x_ y_ z_) mat)] (concat qTop qBot qFront qBack qLeft qRight))) +(defn minmax [rgval] + (reduce (fn [{:keys [min max]} val] {:min (Math/min min val) :max (Math/max max val)}) + {:min java.lang.Double/POSITIVE_INFINITY :max java.lang.Double/NEGATIVE_INFINITY} + rgval)) + +(defn delta-from-minmax [{:keys [min max]}] + (- (/ (- min max) 2) min)) + +(defn rgpoly-center [rgpoly] + (let [rgvec3 (apply concat (for [poly rgpoly] (:rgvec3 poly))) + {dx :x dy :y dz :z} + (reduce (fn [deltas key] + (let [rgval (map #(double (get % key)) rgvec3)] + (assoc deltas key (-> rgval minmax delta-from-minmax)))) + {} + [:x :y :z])] + (for [poly rgpoly] + (let [rgvec3New + (for [{:keys [x y z]} (:rgvec3 poly)] + (->vec3 (+ dx x) (+ dy y) (+ dz z)))] + (->poly rgvec3New (:mat poly)))))) + (defn dedup [rgval] (loop [i 0 rgval rgval @@ -120,6 +144,7 @@ (-> (slurp filenameIn) rgcube-from-cko rgpoly-from-rgcube + rgpoly-center (write-dae name filenameOut)))) (defn write-dae [rgpoly name filename] @@ -135,15 +160,8 @@ (defn -main "I don't do a whole lot ... yet." [& args] - (let [xml (-> - ;(slurp "C:/dev/unity/w.cko") - ;rgcube-from-cko - ;rgpoly-from-rgcube - (rgpoly-cube (->vec3 0 0 0) nil) - (dae-from-rgpoly "cube") - xml/sexp-as-element - xml/emit-str)] - (spit "C:/dev/unity/cube.dae" xml))) + (doseq [filename args] + (convert-cko-to-dae filename))) ;(convert-cko-to-dae "C:/dev/unity/genie-hand.cko") ;(write-test-cube)