|
|
|
|
|
by samsaga2
1358 days ago
|
|
The biggest let I have seen in my life: (let [[track-name wagon-name] (if (= (get-in world [:parts part-1-name :type]) :track)
[part-1-name part-2-name]
[part-2-name part-1-name])
track (get-in world [:parts track-name])
wagon (get-in world [:parts wagon-name])
track-position (get-part-position world track-name)
wagon-position (get-part-position world wagon-name)
layer (apply min (:visible-layers world))
color-1 (new Color 10 10 10)
gear (create-part :gear color-1 layer (:info world))
gear-name (gen-keyword :gear)
track-plane (get-track-plane track)
axis (vector/normalize (get-track-direction track))
offset (vector/multiply
axis
(point-plane-distance wagon-position track-plane))
gear-transform (combine-transforms
(:transform track)
(make-transform offset [1 0 0 0]))
wagon-parent-name (get-parent-part world wagon-name)
wagon-parent (get-in world [:parts wagon-parent-name])
wagon-parent-direction (get-track-direction wagon-parent)
gear-position (get-transform-position gear-transform)
point (point-line-projection gear-position [wagon-position wagon-parent-direction])
to-wagon (vector/normalize (vector/subtract point gear-position))
d (point-plane-distance
wagon-position
(line->plane [track-position to-wagon]))
color-2 (new Color 128 128 128)
rack (create-part :rack color-2 layer (:info world))
rack-name (gen-keyword :rack)
gear-position (get-transform-position gear-transform)
h-distance (point-line-distance
(get-part-position world wagon-parent-name)
[gear-position to-wagon])
wagon-parent-length (second (:scale wagon-parent))
parallel-offset (- (/ wagon-parent-length 2) h-distance)
parallel-offset (vector/multiply
(vector/normalize wagon-parent-direction) parallel-offset)
perpendicular-offset (vector/multiply to-wagon -0.125)
wagon-rotation (get-rotation-component (:transform wagon))
rack-angle (vector/angle (apply-transform wagon-rotation [-1 0 0])
(vector/multiply to-wagon -1) wagon-parent-direction)
rack-transform (combine-transforms
(make-transform [0 0 0] [0 1 0 rack-angle])
(combine-transforms
(:transform wagon)
(make-transform (vector/add parallel-offset perpendicular-offset)
[1 0 0 0])))
tooth-height 0.09
radius (- d 0.175 tooth-height)
scale-1 [(* radius 2) 0.2 (* radius 2)]
rack-length (+ wagon-parent-length 0.0)
scale-2 [0.1 rack-length 0.2]
w (set-value-0-transform world track-name)
p1 (get-in w [:parts track-name])
track-1-rotation (get-rotation-component (:transform p1))
track-1-x (apply-transform track-1-rotation [1 0 0])
angle-offset (- (vector/angle track-1-x to-wagon axis))
sign (- (vector/dot-product to-wagon
(vector/cross-product
wagon-parent-direction
(get-track-direction track))))]
|
|