Загрузка данных
(defun c:DONUTHAND ( / old_osmode old_cmdecho
make-torus make-ellipsoid make-tube-3p
i ang r x y z ucol c a1 a2 p1 p2)
(setq old_osmode (getvar "OSMODE"))
(setq old_cmdecho (getvar "CMDECHO"))
(setvar "OSMODE" 0)
(setvar "CMDECHO" 0)
;; --------------------------------------------------------------------------
;; 1. ФУНКЦИЯ ГЕНЕРАЦИИ 3D-ТОРА (ПОНЧИКА И ГЛАЗУРИ С ВОЛНАМИ)
;; --------------------------------------------------------------------------
(defun make-torus (cen Rmaj Rmin zscale col wave / m n i j u v r z p)
(setq m 36 n 20)
(entmake (list '(0 . "POLYLINE") '(66 . 1) '(70 . 49) (cons 62 col) (cons 71 m) (cons 72 n)))
(setq i 0)
(while (< i m)
(setq u (* 2.0 pi (/ (float i) m)))
(setq j 0)
(while (< j n)
(setq v (* 2.0 pi (/ (float j) n)))
(setq r (+ Rmaj (* Rmin (cos v))))
(setq z (* zscale Rmin (sin v)))
;; Если это глазурь (wave > 0), делаем красивые потеки по внешнему краю
(if (and (> wave 0.0) (< (sin v) 0.2) (> (cos v) -0.3))
(setq z (+ z (* wave (sin (* 9.0 u)) (exp (* -2.0 (abs (sin v)))))))
)
(setq p (list (+ (car cen) (* r (cos u)))
(+ (cadr cen) (* r (sin u)))
(+ (caddr cen) z)))
(entmake (list '(0 . "VERTEX") (cons 10 p) '(70 . 64) (cons 62 col)))
(setq j (1+ j))
)
(setq i (1+ i))
)
(entmake '((0 . "SEQEND")))
)
;; --------------------------------------------------------------------------
;; 2. ФУНКЦИЯ ГЕНЕРАЦИИ 3D-ЭЛЛИПСОИДА / СФЕРЫ (ЛАДОНЬ, СУСТАВЫ, НОГТИ)
;; --------------------------------------------------------------------------
(defun make-ellipsoid (cen rx ry rz col / m n i j u v x y z p)
(setq m 14 n 12)
(entmake (list '(0 . "POLYLINE") '(66 . 1) '(70 . 33) (cons 62 col) (cons 71 m) (cons 72 n)))
(setq i 0)
(while (< i m)
(setq u (* pi (/ (float i) (1- m))))
(setq j 0)
(while (< j n)
(setq v (* 2.0 pi (/ (float j) n)))
(setq x (+ (car cen) (* rx (sin u) (cos v))))
(setq y (+ (cadr cen) (* ry (sin u) (sin v))))
(setq z (+ (caddr cen) (* rz (cos u))))
(setq p (list x y z))
(entmake (list '(0 . "VERTEX") (cons 10 p) '(70 . 64) (cons 62 col)))
(setq j (1+ j))
)
(setq i (1+ i))
)
(entmake '((0 . "SEQEND")))
)
;; --------------------------------------------------------------------------
;; 3. ФУНКЦИЯ ГЕНЕРАЦИИ ПЛАВНЫХ ИЗОГНУТЫХ 3D-ПАЛЬЦЕВ И ЗАПЯСТЬЯ
;; --------------------------------------------------------------------------
(defun make-tube-3p (p0 p1 p2 r0 r1 r2 col / m n i j tval omt c0 c1 c2 cen rad
dx dy dz len1 vx vy vz len2
ux uy uz wx wy wz ang px py pz)
(setq m 14 n 14)
(entmake (list '(0 . "POLYLINE") '(66 . 1) '(70 . 33) (cons 62 col) (cons 71 m) (cons 72 n)))
(setq dx (- (car p2) (car p0))
dy (- (cadr p2) (cadr p0))
dz (- (caddr p2) (caddr p0)))
(setq len1 (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))
(if (< len1 0.001) (setq len1 1.0))
(setq vx (/ dx len1) vy (/ dy len1) vz (/ dz len1))
(if (< (abs vz) 0.9)
(setq ux (- vy) uy vx uz 0.0)
(setq ux 1.0 uy 0.0 uz 0.0)
)
(setq len2 (sqrt (+ (* ux ux) (* uy uy) (* uz uz))))
(setq ux (/ ux len2) uy (/ uy len2) uz (/ uz len2))
(setq wx (- (* vy uz) (* vz uy))
wy (- (* vz ux) (* vx uz))
wz (- (* vx uy) (* vy ux)))
(setq i 0)
(while (< i m)
(setq tval (/ (float i) (1- m)))
(setq omt (- 1.0 tval))
(setq c0 (* omt omt)
c1 (* 2.0 omt tval)
c2 (* tval tval))
(setq cen (list (+ (* c0 (car p0)) (* c1 (car p1)) (* c2 (car p2)))
(+ (* c0 (cadr p0)) (* c1 (cadr p1)) (* c2 (cadr p2)))
(+ (* c0 (caddr p0)) (* c1 (caddr p1)) (* c2 (caddr p2)))))
(setq rad (+ (* c0 r0) (* c1 r1) (* c2 r2)))
;; Плавное скругление кончика пальца на самом последнем шаге
(if (= i (1- m)) (setq rad (* rad 0.35)))
(setq j 0)
(while (< j n)
(setq ang (* 2.0 pi (/ (float j) n)))
(setq px (+ (car cen) (* rad (+ (* ux (cos ang)) (* wx (sin ang))))))
(setq py (+ (cadr cen) (* rad (+ (* uy (cos ang)) (* wy (sin ang))))))
(setq pz (+ (caddr cen) (* rad (+ (* uz (cos ang)) (* wz (sin ang))))))
(entmake (list '(0 . "VERTEX") (cons 10 (list px py pz)) '(70 . 64) (cons 62 col)))
(setq j (1+ j))
)
(setq i (1+ i))
)
(entmake '((0 . "SEQEND")))
)
;; ==========================================================================
;; ПОСТРОЕНИЕ СЦЕНЫ (ТОЧЬ-В-ТОЧЬ ПО КОМПОЗИЦИИ С ФОТО)
;; ==========================================================================
;; 1. ТЕСТО ПОНЧИКА (румяно-оранжевый цвет ACI 30 + светлая полоска ACI 51)
(make-torus '(0.0 0.0 24.0) 44.0 20.5 0.92 30 0.0)
(make-torus '(0.0 0.0 24.0) 44.6 19.0 0.32 51 0.0)
;; 2. РОЗОВАЯ ГЛАЗУРЬ С ВОЛНИСТЫМИ КАПЛЯМИ (нежно-розовый ACI 241)
(make-torus '(0.0 0.0 27.5) 44.3 20.2 0.88 241 3.8)
;; 3. РАЗНОЦВЕТНАЯ ПОСЫПКА (продолговатые 3D-драже на поверхности глазури)
(setq ucol '(7 2 4 3 200 30 240)) ;; Белый, Желтый, Голубой, Зеленый, Фиолетовый, Оранжевый
(setq i 0)
(while (< i 55)
(setq ang (* i 1.6180339)) ;; Золотое сечение для красивого разброса
(setq r (+ 28.0 (* 28.0 (abs (sin (* i 0.77))))))
(setq x (* r (cos ang)))
(setq y (* r (sin ang)))
(setq z (+ 27.8 (* 0.88 (sqrt (max 1.0 (- (* 20.2 20.2) (expt (- r 44.3) 2)))))))
(setq c (nth (rem i (length ucol)) ucol))
(setq a2 (+ ang (* i 0.9)))
(setq p1 (list (- x (* 1.8 (cos a2))) (- y (* 1.8 (sin a2))) (+ z 0.8)))
(setq p2 (list (+ x (* 1.8 (cos a2))) (+ y (* 1.8 (sin a2))) (+ z 0.8)))
(make-tube-3p p1 (list x y (+ z 1.1)) p2 1.2 1.4 1.2 c)
(setq i (1+ i))
)
;; 4. 3D-РУКА, ЛАДОНЬ И ЗАПЯСТЬЕ (персиково-телесный цвет кожи ACI 41)
;; Предплечье и запястье (уходят вправо-вниз, как на картинке)
(make-tube-3p '(68.0 -42.0 -72.0) '(36.0 -22.0 -42.0) '(12.0 -8.0 -18.0) 19.0 16.5 18.5 41)
;; Мягкий объем ладони и подушечки большого пальца
(make-ellipsoid '(8.0 -12.0 -15.0) 24.0 20.0 13.0 41)
(make-ellipsoid '(-15.0 -10.0 -12.0) 24.0 22.0 12.0 41)
(make-ellipsoid '(-32.0 4.0 -8.0) 20.0 24.0 11.0 41)
(make-ellipsoid '(16.0 -26.0 -14.0) 16.0 15.0 12.0 41)
;; ПАЛЕЦ 1: Передний (Большой палец — поддерживает пончик спереди-снизу)
(make-tube-3p '(14.0 -26.0 -15.0) '(-6.0 -52.0 -6.0) '(-10.0 -57.0 22.0) 11.5 9.2 7.2 41)
;; Ноготок (нежно-бежевый ACI 51)
(make-ellipsoid '(-10.5 -61.5 19.5) 3.8 1.5 4.8 51)
;; ПАЛЕЦ 2: Указательный палец (слева от большого, красиво изгибается вверх)
(make-tube-3p '(-18.0 -16.0 -12.0) '(-45.0 -50.0 0.0) '(-42.0 -48.0 32.0) 9.8 8.4 6.6 41)
(make-ellipsoid '(-45.5 -51.5 29.0) 3.6 1.5 4.6 51)
;; ПАЛЕЦ 3: Средний палец (выше и левее)
(make-tube-3p '(-28.0 -4.0 -10.0) '(-64.0 -26.0 4.0) '(-58.0 -22.0 38.0) 10.0 8.5 6.6 41)
(make-ellipsoid '(-62.0 -24.5 35.0) 3.6 1.5 4.6 51)
;; ПАЛЕЦ 4: Безымянный палец (огибает левый край пончика)
(make-tube-3p '(-32.0 10.0 -8.0) '(-68.0 4.0 6.0) '(-62.0 6.0 36.0) 9.2 7.8 6.0 41)
(make-ellipsoid '(-66.0 6.0 33.0) 3.2 1.4 4.2 51)
;; ПАЛЕЦ 5: Мизинец (на заднем плане слева)
(make-tube-3p '(-28.0 22.0 -6.0) '(-58.0 28.0 8.0) '(-54.0 26.0 30.0) 8.0 6.8 5.2 41)
;; 5. ПОВОРОТ 3D-КАМЕРЫ ТОЧНО ПОД РАКУРС ФОТО И ВКЛЮЧЕНИЕ ЗАЛИВКИ
(vl-cmdf ".VPOINT" '(-1.15 -1.85 0.68))
(vl-cmdf ".SHADEMODE" "G")
(vl-cmdf ".ZOOM" "E")
(vl-cmdf ".ZOOM" "0.9x")
(setvar "OSMODE" old_osmode)
(setvar "CMDECHO" old_cmdecho)
(princ "\n[УСПЕШНО!] 3D-рука с пончиком построена!")
(princ)
)
;; Автозапуск сразу после вставки:
(c:DONUTHAND)