basic progress

This commit is contained in:
2017-05-10 21:29:32 -07:00
parent ce482079d3
commit fc372abee3

View File

@ -1,5 +1,6 @@
(ns voxelburst.core (ns voxelburst.core
(:require (:require
[clojure.set :as set]
[clojure.java.io :as io] [clojure.java.io :as io]
[clojure.string :as string] [clojure.string :as string]
[clojure.tools.trace :refer :all] [clojure.tools.trace :refer :all]
@ -14,16 +15,17 @@
;;[thi.ng.luxor.core :refer :all] ;;[thi.ng.luxor.core :refer :all]
;;[thi.ng.luxor.io :as lio] ;;[thi.ng.luxor.io :as lio]
[thi.ng.math.core :as m] [thi.ng.math.core :as m]
[clojure.math.numeric-tower :as math]
;;[termite.sim :as sim] ;;[termite.sim :as sim]
;;[termite.ui :as ui] ;;[termite.ui :as ui]
) )
(:gen-class)) (:gen-class))
(def res (double 1/2)) #_(def res (double 1/2))
(def num-holes 30) #_(def num-holes 30)
(defn voxel-sphere #_(defn voxel-sphere
[tree op origin radius res] [tree op origin radius res]
(let [rg (range (- radius) (+ radius res) res) (let [rg (range (- radius) (+ radius res) res)
coll (for [x rg, y rg, z rg coll (for [x rg, y rg, z rg
@ -31,7 +33,7 @@
:when (<= (g/mag v) radius)] (g/+ origin v))] :when (<= (g/mag v) radius)] (g/+ origin v))]
(svo/apply-voxels op tree coll))) (svo/apply-voxels op tree coll)))
(time #_(time
(def v (def v
(reduce (reduce
(fn [tree [op o r]] (voxel-sphere tree op o r res)) (fn [tree [op o r]] (voxel-sphere tree op o r res))
@ -47,7 +49,7 @@
(vec3 (m/random 32) (m/random 32) (m/random 32)) (vec3 (m/random 32) (m/random 32) (m/random 32))
(m/random 4 8))))))) (m/random 4 8)))))))
(def construct #_(def construct
(let [tree (svo/voxeltree 8 res)] (let [tree (svo/voxeltree 8 res)]
(svo/set-at tree (vec3 4 4 4)))) (svo/set-at tree (vec3 4 4 4))))
@ -67,7 +69,61 @@
;; {:pos v :vel v :rad r} ;; {:pos v :vel v :rad r}
(def gravity [1 1 1.2]) ;;;
;;; geometry
;;;
(defn v-mag [v]
(math/sqrt (reduce + (map #(* % %) v))))
(defn v-+ [v1 v2]
(mapv + v1 v2))
(defn round-point [v]
(map math/round v))
(defn sphere
"Return a set of points contained in the sphere."
[origin radius]
(let [rg (range (- radius) radius)]
(set (for [x rg, y rg, z rg
:let [v (vector x y z)]
:when (<= (v-mag v) radius)] (v-+ origin v)))))
;;;
;;; trace
;;;
(def start-radius 2)
(def start-lifespan 20)
(defrecord Trace [position velocity radius lifespan])
(defn new-trace [origin]
(Trace. origin (random-vel) start-radius start-lifespan))
(defn update-trace [trace bounds]
(let [t (Trace. (next-pos (:position trace) (:velocity trace))
(next-vel (:velocity trace))
start-radius
(dec start-lifespan))]
(when (and (in-bounds? (:position t) bounds)
(> (:radius t) 0)
(> (:lifespan t) 0))
t)))
;;;
;;; physics
;;;
(def gravity [0 0 -0.2])
(defn random-vel
[]
#_(mapv #(* 2 (- % 0.5)) (repeatedly 3 rand))
(vector (* 2 (- (rand) 0.5))
(* 2 (- (rand) 0.5))
(* 4 (rand))))
(defn next-pos (defn next-pos
"Position at t+1" "Position at t+1"
@ -77,7 +133,7 @@
(defn next-vel (defn next-vel
"Velocity at t+1" "Velocity at t+1"
[vel] [vel]
(mapv * vel gravity)) (mapv + vel gravity))
(defn single-in-bounds? (defn single-in-bounds?
"Is a single value in bounds?" "Is a single value in bounds?"
@ -89,7 +145,7 @@
[p bounds] [p bounds]
(every? true? (map #(single-in-bounds? %1 %2) p bounds))) (every? true? (map #(single-in-bounds? %1 %2) p bounds)))
(deftrace next-point #_(defn next-point
"Return the next position and velocity, or nil if it falls outside "Return the next position and velocity, or nil if it falls outside
the domain bounds." the domain bounds."
[pos vel bounds] [pos vel bounds]
@ -98,10 +154,10 @@
(when (in-bounds? next-pos bounds) (when (in-bounds? next-pos bounds)
[next-pos next-vel]))) [next-pos next-vel])))
(defn trajectory #_(defn trajectory
"Return the points of the trajectory from the initial point until "Return the points of the trajectory from the initial point until
the point exits the domain." the point exits the domain."
[pos vel bounds] [trace bounds]
(loop [pts [] (loop [pts []
p pos p pos
v vel] v vel]
@ -110,17 +166,69 @@
pts pts
(recur (conj pts next-pos) next-pos next-vel))))) (recur (conj pts next-pos) next-pos next-vel)))))
(defn make-tree [size count] (defn trace-trajectory
[trace bounds]
(loop [pts []
trace trace]
(let [new-trace (update-trace trace bounds)]
(if (not new-trace)
pts
(recur (conj pts (:position trace)) new-trace)))))
(defn trajectory-voxels [trajectory]
(reduce set/union (map #(sphere (round-point %) 3) trajectory)))
(defn sample-trace []
(let [bounds [[10 490][10 490][10 490]]
origin [250 250 250]]
(trajectory-voxels (trace-trajectory (new-trace origin) bounds))))
(defn sample-traces [count]
(reduce set/union (repeatedly count sample-trace)))
(defn trajectories
[origin count bounds]
(repeatedly count
#(trace-trajectory (new-trace origin) bounds)))
;;;
;;; tie it together
;;;
(defn sample-tree [count]
(let [tree (svo/voxeltree 500 1.0)
trace (sample-traces count)]
(svo/apply-voxels svo/set-at tree trace)))
(def sampletree (sample-tree 10))
(defn sample-write-ply
[count]
(time
(with-open [o (io/output-stream "sample.ply")]
(let [tree #_sampletree (sample-tree count)]
(mio/write-ply o (g/tessellate (iso/surface-mesh tree 5 0.85)))))))
;;;
;;;
;;;
#_(defn voxelburst
"Return a set of points."
[origin trace-count bounds]
(reduce set/union (trajectories origin trace-count bounds)))
#_(defn make-tree [size count]
(let [tree (svo/voxeltree size (double 1/2))] (let [tree (svo/voxeltree size (double 1/2))]
(svo/set-at tree (vec3 4 4 4)))) (svo/set-at tree (vec3 4 4 4))))
(defn write-ply #_(defn write-ply
[name tree & [resolution inside-val]] [name tree & [resolution inside-val]]
(time (time
(doseq [i (list resolution)] (doseq [i (list resolution)]
(with-open [o (io/output-stream (string/join (list name "-" i ".ply")))] (with-open [o (io/output-stream (string/join (list name "-" i ".ply")))]
(mio/write-ply o (g/tessellate (iso/surface-mesh tree i (or inside-val 0.5)))))))) (mio/write-ply o (g/tessellate (iso/surface-mesh tree i (or inside-val 0.5))))))))
(defn -main #_(defn -main
[& [name count grid-size resolution]] [& [name count grid-size resolution]]
(write-ply name (make-tree) resolution)) (write-ply name (make-tree) resolution))