Compare commits

..

182 Commits

Author SHA1 Message Date
Tonton Th
98f0354f91 camera change 2025-11-14 13:16:47 +01:00
Tonton Th
0e3a481e14 change colormap 2025-11-13 21:41:35 +01:00
Tonton Th
858c4201db correct the camera 2025-11-13 21:40:52 +01:00
Tonton Th
b123e035d2 symplify camera 2025-11-13 21:40:14 +01:00
Tonton Th
212993963d cosmetic 2025-11-13 19:20:50 +01:00
Tonton Th
9560b26090 slower gyros 2025-11-13 18:16:15 +01:00
Tonton Th
730b4d5a23 camera adjustements 2025-11-13 17:50:23 +01:00
Tonton Th
7fbcbec840 better ring 2025-11-13 17:32:16 +01:00
Tonton Th
46b0f2005b ajustements 2025-11-13 17:31:44 +01:00
Tonton Th
0b04ffd359 a lot of little changes 2025-11-13 02:15:11 +01:00
Tonton Th
030f2fb2cf add a new target 2025-11-13 00:19:21 +01:00
Tonton Th
b3e2cd4ac9 cosmetic 2025-11-12 22:27:10 +01:00
Tonton Th
75b1b9f741 a lot of minor changes 2025-11-04 13:28:16 +01:00
Tonton Th
8532b81c36 add a moving wagonnet 2025-11-04 13:26:11 +01:00
Tonton Th
29bed43554 add a missing png file 2025-11-02 14:47:32 +01:00
Tonton Th
40bf162ba8 moving a wagonet to a better file 2025-11-02 13:58:23 +01:00
Tonton Th
1a2fbe84b9 camera tuning 2025-11-02 09:54:01 +01:00
Tonton Th
4581bb3e37 make your things at the correct size 2025-11-01 18:30:14 +01:00
Tonton Th
63b99262a9 move things to the context 2025-10-31 20:45:03 +01:00
Tonton Th
bebb802f36 add new thins to the context 2025-10-31 20:29:14 +01:00
Tonton Th
048148967b a lot of cosmetic changes 2025-10-31 14:14:07 +01:00
Tonton Th
5706911bde enhance doc 2025-10-31 14:12:39 +01:00
Tonton Th
9f177bc3fd ajust useless messages 2025-10-31 12:34:52 +01:00
Tonton Th
876d574eec trying new things 2025-10-31 12:08:50 +01:00
Tonton Th
7c2fc424b3 some work on textures 2025-10-27 18:35:51 +01:00
Tonton Th
5aa179c8e8 fine tuning 2025-10-27 18:34:15 +01:00
Tonton Th
70469c7904 add splined sequence 2025-10-25 13:45:46 +02:00
Tonton Th
7a17acc39e patch for the futur ? 2025-10-25 11:18:40 +02:00
Tonton Th
da5afe8283 change default POV clock 2025-10-25 11:17:28 +02:00
Tonton Th
fcb1fb7467 enhance your spline seq 2025-10-22 03:00:56 +02:00
Tonton Th
fc8ae98193 camera change 2025-10-22 01:58:17 +02:00
Tonton Th
74892d028c add random texture 2025-10-22 01:56:13 +02:00
Tonton Th
be152900c4 + plot-timing 2025-10-22 01:55:18 +02:00
Tonton Th
fef45190f3 fix an off-by-one error 2025-10-22 01:53:39 +02:00
Tonton Th
3ab7c627d9 a lot of tweaks 2025-10-22 01:52:56 +02:00
Tonton Th
85c447f825 change text color 2025-10-22 01:51:36 +02:00
Tonton Th
b03e7f5571 better EGA colors 2025-10-21 14:45:49 +02:00
Tonton Th
2b1ffaf4cb tragic error, sorry 2025-10-20 12:19:19 +02:00
Tonton Th
d0bd061b50 mute useless message 2025-10-20 07:20:11 +02:00
Tonton Th
f127948f49 oups again... 2025-10-20 04:47:52 +02:00
Tonton Th
c30c7a7b11 oups... 2025-10-20 04:45:59 +02:00
Tonton Th
ac5272c2c5 add normalization 2025-10-20 04:41:59 +02:00
Tonton Th
aefee1de0b camera tweaking 2025-10-20 04:40:59 +02:00
Tonton Th
912eea2f3d better spline usage 2025-10-20 04:40:03 +02:00
Tonton Th
1f534e88cf add a new sequence 2025-10-19 21:42:42 +02:00
Tonton Th
150c546fb4 camera adjustements 2025-10-19 19:11:08 +02:00
Tonton Th
18c84133b6 more experiment 2025-10-19 19:09:46 +02:00
Tonton Th
d911af44c6 tuning colors 2025-10-19 19:08:42 +02:00
Tonton Th
319e44a072 patching the hexfighter 2025-10-19 19:07:53 +02:00
Tonton Th
75d51755cb bla 2025-10-19 19:06:55 +02:00
Tonton Th
90af7dd796 better EGA transcoding tool 2025-10-19 16:46:51 +02:00
Tonton Th
b2cbcd928f switch to EGA mode 2025-10-19 14:44:34 +02:00
Tonton Th
0f72fd1ed0 work on Chose, part 2 2025-10-19 06:33:12 +02:00
Tonton Th
c3b4d94977 work on Chose 2025-10-19 06:32:17 +02:00
Tonton Th
9a00f7317f adjust colorimetry 2025-10-19 06:31:44 +02:00
Tonton Th
1c2a4f9be2 tweaks... 2025-10-18 16:15:59 +02:00
Tonton Th
fd7c2fe707 La Chose est maintenant une macro 2025-10-18 16:14:59 +02:00
Tonton Th
3eae9b7308 making gif89a NOW ! 2025-10-18 16:13:10 +02:00
Tonton Th
b324d4a5df increase font size 2025-10-18 11:30:06 +02:00
Tonton Th
877b5aaef6 add more choses 2025-10-18 01:54:04 +02:00
Tonton Th
50199c18d4 better camera 2025-10-18 01:53:15 +02:00
Tonton Th
d823515699 move hexabenz 2025-10-18 01:52:36 +02:00
Tonton Th
34c94e0338 increase Y of camera 2025-10-18 01:51:55 +02:00
Tonton Th
48c5ccbe66 move camera hardly 2025-10-12 16:52:52 +02:00
Tonton Th
c156230406 ajout piliers sur rail circular 2025-10-12 16:49:28 +02:00
Tonton Th
8c60007b71 thi is a really big commit 2025-10-10 12:52:49 +02:00
Tonton Th
a5f2e41502 complexification de la chose 2025-10-07 11:01:51 +02:00
Tonton Th
302b25a790 kill useless message 2025-10-07 10:47:26 +02:00
Tonton Th
266c9cb543 add a debug msg 2025-09-27 16:03:09 +02:00
Tonton Th
f0e69c9478 a good camera 2025-09-27 02:19:49 +02:00
Tonton Th
6dde4cbf0f add a few explanation 2025-09-23 04:34:41 +02:00
Tonton Th
cb43cb4481 cutting sphere tuning 2025-09-23 03:18:44 +02:00
Tonton Th
97f6018cc9 some tuning 2025-09-23 03:17:34 +02:00
Tonton Th
a459f22073 add debug printf 2025-09-23 03:16:15 +02:00
Tonton Th
5b2ef0c558 add a new sequence 2025-09-23 00:51:38 +02:00
Tonton Th
55a174f4f2 adjustements MUST be tested 2025-09-16 14:21:20 +02:00
Tonton Th
7d6e50cb7d moving camera 2025-09-16 14:14:30 +02:00
Tonton Th
d620783ab8 je deviens vieux et pinailleur 2025-09-16 14:13:09 +02:00
Tonton Th
898828b49d a lot of cosmetic 2025-09-12 03:56:21 +02:00
Tonton Th
11717a4f6a use the new Define 2025-09-12 03:53:53 +02:00
Tonton Th
879dab3239 add a Define 2025-09-12 03:53:05 +02:00
Tonton Th
cf0bcb9cab enhance your tools 2025-09-12 03:52:23 +02:00
Tonton Th
32606a5a18 very small tuning 2025-09-09 22:05:29 +02:00
Tonton Th
abaa6437fd texturing is a mess 2025-09-06 20:38:46 +02:00
Tonton Th
f28b260f8d a lot of tweaks 2025-09-06 01:00:39 +02:00
Tonton Th
540c16b47f get more cpu powa 2025-09-05 14:23:33 +02:00
Tonton Th
29d23630b4 ajuster la camera 2025-09-02 16:07:50 +02:00
Tonton Th
d25c217e6a tuning textures 2025-09-02 11:32:58 +02:00
Tonton Th
d30036415a preparation edition automnale 2025-08-29 22:57:24 +02:00
Tonton Th
bf7550e52e small tuning 2025-08-29 17:40:26 +02:00
Tonton Th
5d105ccde9 small tuning 2025-08-29 17:39:37 +02:00
Tonton Th
bbd9cf40e5 small tuning 2025-08-29 17:38:35 +02:00
Tonton Th
fe94d3036e cosmetic 2025-06-21 02:45:41 +02:00
Tonton Th
3510b57523 cosmetic 2025-06-21 02:30:40 +02:00
Tonton Th
71cce4f60c very small refactoring 2025-06-19 14:54:49 +02:00
Tonton Th
3535e16a20 camera tuning 2025-06-19 14:34:53 +02:00
Tonton Th
92a015b46a add a sequence 2025-06-19 14:33:30 +02:00
Tonton Th
435d5b56b3 horloge 2025-05-24 14:20:20 +02:00
Tonton Th
3fd4ce827f + sequence carto 2025-05-21 14:39:34 +02:00
Tonton Th
9cb2d9f123 cam tuning 2025-05-17 19:19:27 +02:00
Tonton Th
9a3b4807e4 trying a new sky 2025-05-09 20:07:33 +02:00
Tonton Th
3ce1994e97 moving "Horloge" to a better place 2025-05-09 20:06:14 +02:00
Tonton Th
03c8c1cbd8 oups... 2025-05-07 17:24:15 +02:00
Tonton Th
3143bb87ba enhanced hexapole 2025-05-04 18:36:13 +02:00
Tonton Th
c2731bbfc2 move the cam ! 2025-05-04 12:58:14 +02:00
Tonton Th
2a3b3a65b4 adjust camera 2025-04-28 20:23:01 +02:00
Tonton Th
89e4e1420e cosmetic on texts 2025-04-28 20:09:04 +02:00
Tonton Th
41af9f42d2 adjust camera 2025-04-28 20:08:15 +02:00
Tonton Th
5de41466dd adjust a texture 2025-04-28 03:58:49 +02:00
Tonton Th
5c3a56bbef cosmetic 2025-04-27 20:55:04 +02:00
Tonton Th
1b50ba7616 ajust parameters of the bubble-cuting sphere 2025-04-27 20:33:52 +02:00
Tonton Th
802a4ab8c2 HexaPole is now a macro 2025-04-25 21:39:34 +02:00
Tonton Th
ffd73e832c add a new texture 2025-04-25 21:38:12 +02:00
Tonton Th
c82f6f4de5 le commit en chocolat 2025-04-22 00:49:18 +02:00
Tonton Th
a9ec016184 change textcolors, add bubblecut 2025-04-13 10:09:13 +02:00
Tonton Th
134fd180c1 oups... 2025-04-12 21:20:43 +02:00
Tonton Th
5361536d30 cosmetic 2025-04-06 13:17:03 +02:00
Tonton Th
ff733efaa7 add a new sequence 2025-04-04 00:50:48 +02:00
Tonton Th
363274e273 premier commit du printemps 2025-03-31 03:55:29 +02:00
Tonton Th
3c4012945f fine tuning 2025-03-27 00:47:41 +01:00
Tonton Th
f338b1e925 add hexawood view 2025-03-25 14:50:14 +01:00
Tonton Th
05ab348be3 cosmetic change of look_at 2025-03-21 20:49:03 +01:00
Tonton Th
80cd442a73 meilleur cadrage ? 2025-03-21 19:55:38 +01:00
Tonton Th
34e3ef5bf4 other kerning is cool 2025-03-21 19:21:09 +01:00
Tonton Th
a8009c0803 others colors are cool 2025-03-21 19:15:19 +01:00
Tonton Th
ebe9eba8da tweaking the trident 2025-03-20 21:23:43 +01:00
Tonton Th
bb68a37188 better rotation and look of gyrophares 2025-03-20 21:22:02 +01:00
Tonton Th
b072c816a4 patch the groundbase 2025-03-18 23:20:18 +01:00
Tonton Th
b385c14f79 oups... 2025-03-18 21:33:34 +01:00
Tonton Th
c03f402b4c commit du dimanche soir de la flemme 2025-03-16 21:32:23 +01:00
Tonton Th
095dfbdd39 remove faulty include 2025-03-16 10:30:15 +01:00
Tonton Th
8e7ccfda66 adjust camera 2025-03-13 02:25:56 +01:00
Tonton Th
04abd21718 cosmetic 2025-03-12 23:54:35 +01:00
Tonton Th
90eb52f548 add debug tool 2025-03-12 23:54:05 +01:00
Tonton Th
455578dc33 adjust cam position 2025-03-12 22:34:57 +01:00
Tonton Th
ba9c8e47c7 working on groundbase 2025-03-12 20:54:30 +01:00
Tonton Th
afbeaaf887 renaming a file 2025-03-12 15:36:32 +01:00
Tonton Th
c65090e4a2 commit big mess before refactoring 2025-03-07 10:51:57 +01:00
Tonton Th
f417711da3 cosmetic 2025-02-27 13:26:21 +01:00
Tonton Th
8bcb56e9ea timing adjust 2025-02-27 13:25:57 +01:00
Tonton Th
db5eedffe1 a lot of change, stay tuned 2025-02-19 02:49:16 +01:00
Tonton Th
532560518c cosmetic 2025-02-19 02:48:45 +01:00
Tonton Th
479e4ee18d cosmetic 2025-02-19 02:48:26 +01:00
Tonton Th
3ff83f012d the best cosmetic change ever 2025-02-15 02:55:07 +01:00
Tonton Th
cd65855f2c release of the official "full-v2" video 2025-02-14 19:47:29 +01:00
Tonton Th
14a03b78eb add the "hexawood" to the family 2025-02-12 14:09:11 +01:00
Tonton Th
39adef1e90 unused parts update 2025-02-11 18:04:48 +01:00
Tonton Th
a95ff22653 better API 2025-02-10 23:57:32 +01:00
Tonton Th
e7ccaf8089 misc changes 2025-02-10 16:11:51 +01:00
Tonton Th
14c6cbb818 more explanations 2025-02-10 16:10:46 +01:00
Tonton Th
f9755cf0a2 La cabane part en prod' un lundi matin 2025-02-10 04:16:53 +01:00
Tonton Th
7e7f9fbe40 little tweak 2025-02-10 04:15:42 +01:00
Tonton Th
6407a3ed3a cosmetic 2025-02-10 04:15:02 +01:00
Tonton Th
701b6187a5 plot the last timing value 2025-02-10 04:14:38 +01:00
Tonton Th
6f637ca79a more doc, really ? 2025-02-10 02:25:39 +01:00
Tonton Th
97950f2483 cosmetic and addition of "survol" seq 2025-02-10 02:15:10 +01:00
Tonton Th
15eedb2034 change a default value 2025-02-09 22:15:04 +01:00
Tonton Th
f487f35ccd centering 2025-02-09 20:44:55 +01:00
Tonton Th
66f54c283d fine tuning 2025-02-09 20:44:05 +01:00
Tonton Th
955af75151 tune the cam, bro 2025-02-09 19:06:00 +01:00
Tonton Th
e3b13c0631 tuning the groundbase 2025-02-09 19:05:10 +01:00
Tonton Th
72d99f9400 add a "start from here" option 2025-02-09 19:03:26 +01:00
Tonton Th
f737579090 etude pour une cabane 2025-02-09 19:02:32 +01:00
Tonton Th
46bb5ee3da cosmetic: change display of frame number 2025-02-07 23:16:17 +01:00
Tonton Th
8b5dbb7a99 reduction of image height for better aspect ratio 2025-02-07 23:14:59 +01:00
Tonton Th
3117141b52 commit du soir, espoir 2025-02-04 01:06:18 +01:00
Tonton Th
aed3fa6cf7 add done files 2025-02-03 22:49:23 +01:00
Tonton Th
3ab1079214 view from the sky 2025-02-01 17:31:21 +01:00
Tonton Th
32f4b403e2 ready for prime time ? 2025-01-27 16:38:55 +01:00
Tonton Th
949d5b328d preparing the next release, stay tuned 2025-01-27 03:34:51 +01:00
Tonton Th
1944fdd337 add a new sequence : cutoff 2025-01-27 03:33:53 +01:00
Tonton Th
b344d0b762 a lot a better things 2025-01-26 19:32:18 +01:00
Tonton Th
9962480356 remove useless message 2025-01-25 07:05:30 +01:00
Tonton Th
8e02e9e466 very fine tuning 2025-01-23 21:49:59 +01:00
Tonton Th
45ac640ba6 affiner le contexte... 2025-01-22 19:46:55 +01:00
Tonton Th
27891b70dc cosmetic 2025-01-22 19:30:23 +01:00
Tonton Th
05f40fae75 add intertitres 2025-01-22 19:29:20 +01:00
Tonton Th
070679ec5b add a new sequence 2025-01-19 21:45:56 +01:00
Tonton Th
1eac9d4cfc increase video size 2025-01-16 15:07:06 +01:00
Tonton Th
cf899967ce moving the gyrophare to the right file 2025-01-16 13:01:46 +01:00
Tonton Th
af4f9fc282 oups... 2025-01-16 01:11:56 +01:00
Tonton Th
b9299568f4 using anti-aliasing 2025-01-16 01:04:49 +01:00
43 changed files with 2590 additions and 416 deletions

4
.gitignore vendored
View File

@@ -6,9 +6,13 @@ datas/*.xcf
datas/*.ttf
datas/*.jpg
datas/*.webp
!datas/README.md
!datas/ega-16colors.png
WS/*timing
WS/log*
WS/*.done
WS/*.log
*.png
*.gif

View File

@@ -1,22 +1,43 @@
DIMS = -W1600 -H1200
POVOPT = +q9 +a0.02 -d
POVDEP = contexte.inc elements.inc hexabenz.inc \
globals.inc datas/hf.png
CK=180
POVOPT = +q9 +A Declare=NbFrames=450 -d
POVDEP = contexte.inc hexacone.inc hexabenz.inc \
globals.inc hexawood.inc datas/hf.png \
dynamic.inc trident.inc groundbase.inc \
gadgets.inc xperiment.inc
# ! Define a default value for the POV clock
# ! You can overide with this command line :
# $ make CK=449 essai.png
CK=225
PNG: essai.png scene.png topview.png passage.png \
orbite.png hexabenz.png escadrille.png \
hexacone.png
hexacone.png remote.png survol.png cutoff.png \
carto.png hexawood.png bubblecut.png \
circular.png panoramic.png splined.png
echo "make PNG ck=$(CK) done" >> WS/log
splined.png: splined.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
topview.png: topview.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
cutoff.png: cutoff.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
bubblecut.png: bubblecut.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
essai.png: essai.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
noise.png: essai.png Makefile
convert -verbose -noise 5x15 $< $@
hexabenz.png: hexabenz.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
@@ -24,6 +45,9 @@ hexabenz.png: hexabenz.pov Makefile $(POVDEP)
hexacone.png: hexacone.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
hexawood.png: hexawood.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
passage.png: passage.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) -K$(CK) -i$< -o$@
@@ -36,4 +60,19 @@ scene.png: scene.pov Makefile $(POVDEP)
escadrille.png: escadrille.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
remote.png: remote.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
survol.png: survol.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
carto.png: carto.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
circular.png: circular.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@
panoramic.png: panoramic.pov Makefile $(POVDEP)
povray $(POVOPT) $(DIMS) +K$(CK) -i$< -o$@

View File

@@ -9,12 +9,15 @@ et vous pouvez
suivre son évolution par l'intermédiaire de
[Mastodon](https://mastodon.tetaneutral.net/@tth)
avec le croisimot `#hexacone`.
Quelques images sont disponibles sur mon serveur de
[cuisine](http://maison.tth.netlib.re/pov/hexacone.html).
## Prérequis
Avant toute chose, il faut avoir installé les logiciels
suivants : bash, awk, gnuplot, imagemagick, et, bien
suivants : bash, awk, gnuplot, imagemagick, ffmpeg, et bien
entendu, [povray](https://povray.org/).
Une bonne maitrise des scripts shell sera un plus.
## Utilisation
@@ -24,8 +27,8 @@ par un classique [`Makefile`](./Makefile) et les séquences animées
produites par un [script shell](./mkloop.sh).
Avant toute chose, vous devrez vérifier la présence de plusieurs
répertoires : d'un coté `./frames/<name>` pour stocker les images calculées :
répertoires : d'un coté `./frames/<name>` pour stocker les images calculées et `./frames/Spool` pour l'assemblage
de la vidéo intégrale :
```
frames/
@@ -39,6 +42,18 @@ répertoires : d'un coté `./frames/<name>` pour stocker les images calculées :
```
et de l'autre coté `./WS/` pour ranger les fichiers de travail.
Ensuite, il faut assembler toutes ces images calculées en une vidéo
de qualité (ce que fait je très empiriquement). Tout d'abord, on encode
(avec ce [script](./tools/encode.sh)) chaque séquence individuelle
pour les mettre dans le grand Ternet mondial à partir de mon
[ADSL](http://maison.tth.netlib.re/pov/hexacone.html) de campagne.
Ensuite, un autre [script](./tools/linkfarmer.sh) assemble toute
les sequence dans le produit final, en ajoutant générique et
inter-titres.
À vous de jouer maintenant.
## Contact
* La [mailing-list du tetalab](https://lists.tetalab.org/postorius/lists/tetalab.tetalab.org/) ;

View File

@@ -1,3 +1,3 @@
# Workspace
workspace
For intermediates files, and timing log.

64
bubblecut.pov Normal file
View File

@@ -0,0 +1,64 @@
/*
* H E X A C O N E - C U T O F F
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
// =======================================================
#declare POS_Cutoff = <-20, 0, -7>;
#local TY = 1.55;
#declare Position = <0.50, -0.70, 0.75>;
#declare Rayon = 0.70 + 1.52 * NormClock; // rayon de la sphere
// de découpe
#debug concat("Rayon decoupe = ", str(Rayon, 8, 3), "\n\n")
difference {
object { HexaBenz () }
sphere { Position, Rayon }
translate y*TY + POS_Cutoff
}
/*
sphere { Position, 0.020 translate y*TY + POS_Cutoff
texture { T_WIP_alert } }
*/
/* this one is for debugging */
// object { OpenBox translate y*TY + POS_Cutoff }
// object { Repere translate y*2.8 + POS_Cutoff }
// =======================================================
light_source {
<-24, 0.4, -1>
colour Orange
parallel
point_at y*TY + POS_Cutoff
}
object { Le_Decor }
// =======================================================
#local CamX = -27.4 + (3.29*Cos_01(NormClock));
#local CamY = 2.7 - (0.24*sqrt(NormClock));
#local CamZ = -0.85 + (2.02*NormClock);
camera {
location <CamX, CamY, CamZ>
look_at <0, 1.5, 0> + POS_Cutoff
angle 35 - 5*Cos_01(NormClock)
}

38
carto.pov Normal file
View File

@@ -0,0 +1,38 @@
/*
* H E X A C O N E
* nouveau projet Thu Dec 5 11:37:05 AM UTC 2024
*
* cartographie de l'hexamonde
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "xperiment.inc"
#include "dynamic.inc"
// ---------------------------------------------------------
// dessiner une grille
#for (Foo, -150, 150, 10)
cylinder { <-150, 0, Foo>, <150, 0, Foo>, 0.10 }
cylinder { <Foo, 0, -150>, <Foo, 0, 150>, 0.10 }
#end
// ---------------------------------------------------------
object { Repere scale 10 translate y*7 }
object { Le_Decor }
camera {
location <45, 179+(51*NormClock), 18-(21*NormClock)>
look_at <0, 1.18, 0.17 + (2.9*NormClock)>
angle 50
}

41
circular.pov Normal file
View File

@@ -0,0 +1,41 @@
/*
* H E X A C O N E - E S S A I
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "gadgets.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
// =======================================================
#include "dynamic.inc"
object { Le_Decor }
// =======================================================
#declare R_circ = R_circular + 0.07;
#declare CK = 0.777 + (1.23 * sqrt(NormClock * 3.141592654));
#declare CamX = R_circ * cos(CK);
#declare CamY = 3.08 + abs(sin(CK/4.00));
#declare CamZ = R_circ * sin(CK);
#declare AV = 0.070;
#declare LatX = R_circ * 0.96 * cos(CK + AV);
#declare LatY = 2;
#declare LatZ = R_circ * 0.97 * sin(CK + AV);
camera {
location <CamX, CamY, CamZ>
look_at <LatX, LatY, LatZ>
angle 66
}

View File

@@ -4,8 +4,152 @@
/* voir aussi le fichier 'globals.inc' */
/* ------------------------------------------------------------ */
/* ======================================================= */
#include "groundbase.inc"
#include "xperiment.inc"
#include "gadgets.inc"
/* ======================================================= */
/*
* essai du 12 mars 2025
*/
#declare RedB_0_X = 19;
#declare RedB_0_Z = 29;
#declare RedB_1_X = -24;
#declare RedB_1_Z = 7;
#declare Pos_RedB_0 = <RedB_0_X, 0, RedB_0_Z>;
#declare Pos_RedB_1 = <RedB_1_X, 0, RedB_1_Z>;
#macro RedBase_0 ( T )
difference {
#local R = 2.46;
cylinder { 0, y*0.40, R }
cylinder { 0, y*0.36, R*0.99 }
cone { y*0.37, R*0.80, y*0.425, R*0.83 }
#for (Foo, 0, 359, 10)
#local Dx = R * sin(radians(Foo));
#local Dz = R * cos(radians(Foo));
cone { 0, 0.01, y*0.41, 0.10 translate <Dx, 0, Dz> }
#end
}
// pigment { color Red*0.8 }
texture { T }
#end // macro
/* ======================================================= */
#macro GyroPhare_mat ()
union {
cylinder { 0, y*H_gyro, R_gyro }
intersection {
sphere { 0, R_gyro scale <1, 1.414, 1> }
box { <-1, 0, -1>, <1, 1.94, 1> }
translate y*(H_gyro+H_gylampe+0.04)
}
#local R = rand(Rng1);
#if (R < 0.33333)
texture { T_Stone25 scale 1+rand(Rng1) }
#elseif (R < 0.66666)
texture { T_Stone15 scale 1+rand(Rng1) }
#else
texture { T_Stone6 }
#end
#undef R
}
#end // macro
#macro GyroPhare_lampe ()
union {
difference {
cylinder { 0, y*H_gylampe, R_gyro * 1.12345678 }
cylinder { y*0.01, y*(H_gylampe-0.01), R_gyro*0.97 }
#local WB = 0.017;
union {
box { <-1, 0.03, -WB>, <1, (H_gylampe-0.03), WB> }
box { <-WB, 0.03, -1>, <WB, (H_gylampe-0.03), 1> }
}
#undef WB
pigment { color Gray90 }
#local Ro = 0.5 + (1.0 * rand(Rng1));
#if (rand(Rng1) < 0.50)
#local Ro = -Ro;
#end
rotate y * Ro * clock
#undef Ro
}
light_source { y*0.10
rgb <0.8, 0.9, 0.999999999>
fade_distance 3.90
fade_power 1.55
}
}
#end // macro
#macro GyroPhare ()
union {
object { GyroPhare_mat () }
object { GyroPhare_lampe ()
// rotate y*rand(Rng1)*clock
translate y*(H_gyro+0.02) }
}
#end // macro
#macro Les_GyroPhares ()
union {
#local E = SzSol * 0.431;
#for (Idx, 0, 359, 60)
#local Ang = radians(Idx+9.33);
#local Dx = E * sin(Ang);
#local Dz = E * cos(Ang);
object { GyroPhare () translate <Dx, H_sol, Dz> }
#end
#undef E
}
#end
/* ======================================================= */
/* 11 avril 2025, je pose un grand cercle d'hexapoles
* 9 octobre 2025, je rajoute un rail circulaire
*/
#declare Les_HexaPoles = object
{
union {
#for (Ang, 0, 359, 6)
#local De = 3.6 + (0.5*rand(Rng1));
#if (rand(Rng1) < 0.50)
#local E = R_circular + De;
#else
#local E = R_circular - De;
#end
#local Ra = radians(Ang);
#local Xp = E * cos(Ra);
#local Zp = E * sin(Ra);
object { HexaPole () translate <Xp, 0, Zp> }
#end // for
torus { R_circular, 0.28
scale <1, 0.3210, 1>
translate 0.33*y
// !!! pigment { color Cyan }
texture { T_Planete_A scale 3 }
}
#for (Ang, 0,359, 2)
#local Ra = radians(Ang);
#local Xp = R_circular * cos(Ra);
#local Zp = R_circular * sin(Ra);
cylinder { 0, 0.33*y, 0.10
translate <Xp, 0, Zp>
texture { T_Planete_A scale 3 }
}
#end
}
}
/* ======================================================= */
#declare Rhxba = 0.30;
#declare R2hxba = Rhxba * 0.48;
@@ -20,6 +164,7 @@ merge {
sphere { 0, R2hxba translate < 0, E, 0> }
sphere { 0, R2hxba translate < 0, 0, -E> }
sphere { 0, R2hxba translate < 0, 0, E> }
#undef E
}
}
@@ -27,15 +172,15 @@ merge {
{
union {
object { HexaBalls
texture { Lightning1 scale 0.33 }
rotate <clock/3, clock/6, clock/9>
translate <5, -1.2+1.01*Cos_010(NormClock), 7>
texture { Lightning1 scale 0.44 }
rotate <clock/3, clock/4, clock/9>
translate <2, 1.21*Cos_010(NormClock), 4>
}
object { HexaBalls
texture { Lightning2 scale 0.56 }
// rotate <-clock, clock*0.33333, clock>
translate <7, -1+0.89*Cos_010(NormClock), -6>
rotate <-clock, clock*0.33333, clock*3>
translate <4, 1.41*Cos_010(NormClock), -3>
}
}
}
@@ -60,60 +205,125 @@ blob {
}
}
// =======================================================
/* ======================================================= */
#declare Le_Sol = object
/* ======================================================= */
#declare UnderHoles = array[6]
/*
* on rempli le tableau avec la place des trous
*/
#fopen Holes "WS/holes.log" write
#for (Idx, 0, 5)
#local Angle = (Idx + 0.19) * 1.090;
#local Px = sin(Angle) * (SzSol * 0.97);
#local Pz = cos(Angle) * (SzSol * 1.04);
#declare UnderHoles[Idx] = <Px, 0, Pz>;
#write (Holes, Idx, " ", Angle, " ", UnderHoles[Idx], "\n")
#end
#fclose Holes
#declare Underground = object
{
height_field {
png "datas/hf.png"
smooth
translate <-.5, 0, -.5>
scale <SzSol, 0.98, SzSol>
texture {
pigment {
// color DarkGreen
image_map { png "datas/cmap.png" }
translate <-.5, 0, -.5>
scale <SzSol, 0.98, SzSol>
difference {
// plane { y, 0 }
#local Big = 300;
box { <-Big, -0.15, -Big>, < Big, 0.0000, Big> }
#undef Big
#for (Foo, 0, 5)
cylinder { -y*5, y*5, 3.2 translate UnderHoles[Foo] }
#end
}
// normal { bumps 0.035 scale 0.186 }
texture { T_Planete_B scale 0.42 }
/*
texture {
pigment { color Gray20 }
normal { bumps 0.38 scale 2.6 }
finish { phong 0.125 }
}
*/
}
}
/* ======================================================= */
#declare Repere = object
{
union {
cylinder { 0, <1, 0, 0>, 0.008 pigment { color Red } }
cylinder { 0, <0, 0, 1>, 0.008 pigment { color Blue } }
#local R = 0.010;
cylinder { 0, <1, 0, 0>, R pigment { color Red } }
cylinder { 0, <0, 1, 0>, R pigment { color Green } }
cylinder { 0, <0, 0, 1>, R pigment { color Blue } }
}
}
/* ======================================================= */
/*
* nouvel éclairage du 10 février 2025
*/
#declare Quad_lampe = object
{
light_source {
0
color White
fade_distance SzSol * 0.40
fade_power 1.22
}
}
#declare QuadriLight = object
{
#local T = E_QuadriLight;
#local H = H_QuadriLight;
union {
object { Quad_lampe translate <-T, H, -T> }
object { Quad_lampe translate < T, H, -T> }
object { Quad_lampe translate <-T, H, T> }
object { Quad_lampe translate < T, H, T> }
}
rotate -19 * y
}
/* ======================================================= */
/* new Fri Oct 17 07:13:51 PM CEST 2025 */
#declare Les_Choses = object
{
union {
/* a l'interieur du 'circular' */
object { Chose () translate <-25, 0, -31> }
object { Chose () translate < 20, 0, -32> }
/* a l'exterieur du 'circular' */
#for (foo, 0, 359, 18)
#local CK = radians(foo + (5*rand(Rng1)));
#local DX = 66 * sin(CK);
#local DZ = 64 * cos(CK);
// #local Texte = str(CK, 5, 3);
// #debug concat ("Les Choses, CK = ", Texte, "\n")
object { Chose () translate < DX, 0, DZ> } // XXX
#end
}
}
/* ======================================================= */
#declare Les_Lumieres = object
{
union {
#if (1)
light_source {
<0.3, 3.50, 2.8> color Gray90
<2.3, 5.50, 2.8> color Gray70
spotlight
radius 14 falloff 10 tightness 10
radius 14 falloff 10 tightness 8
point_at <0, 0.95, 0.22222222>
}
#end
#if ( (clock>166) & (clock<213) )
light_source {
<2, 10.30, -2> color Yellow
spotlight
radius 12 falloff 20 tightness 10
point_at <-0.08, 0.80, 0.17>
}
#end
#if (1)
light_source {
<-5, 5.60, 8>
<-5, 5.60, 18>
#if ( (clock > 290) & (clock<344) )
#local Couleur = rgb <0.20, 0.20, 0.90>;
#else
@@ -125,23 +335,34 @@ union {
point_at <0, 0.95, -0.22>
}
#end
#if (0)
light_source {
<-4, 54, -7>
colour Gray50
parallel
point_at 0
}
#end
}
}
/* ======================================================= */
// #declare Le_Ciel = object
// {
sky_sphere {
pigment {
gradient y
color_map {
[ 0.2 color Gray10 ]
[ 0.4 color Gray60 ]
[ 0.7 color Black ]
[ 0.8 color White ]
[ 1.0 color Gray10 ]
[ 0.2 color Gray20 ]
[ 0.4 color rgb <.5, .3, .5> ]
[ 0.7 color Gray30 ]
[ 0.9 color rgb <.5, .6, .5> ]
[ 1.0 color Gray20 ]
}
turbulence 3.14159 + 0.91 * Cos_010(NormClock)
scale 1.804
turbulence 3.14159 + 0.84 * Cos_010(NormClock)
scale 1.600
// translate -1
}
#local Kem = 0.09;
@@ -149,16 +370,36 @@ sky_sphere {
}
// }
/* ------------------------------------------------------------ */
/* ======================================================= */
/* ======================================================= */
/*
* Et on rassemble tous les éléments...
*/
#declare Le_Decor = object
{
union {
object { Le_Sol }
object { Les_Bibelots }
object { Les_Lumieres }
object { Underground }
object { La_GroundBase }
object { RedBase_0 (T_Beton_1)
translate <RedB_0_X, 0, RedB_0_Z> }
object { RedBase_0 (T_Beton_2)
translate <RedB_1_X, 0, RedB_1_Z> }
// object { Les_Lumieres }
object { QuadriLight }
object { Les_GyroPhares () }
object { Les_HexaPoles }
object { Horloge rotate y*27 translate < 3, 0, -30> }
object { Les_Choses }
object { Les_Arches (1) rotate y*59 translate <-22, 0, -20> }
object { Les_Arches (2) rotate y*156 translate <-34, 0, -26> }
object { Les_Cahutes () translate <22, 0, -9> }
/* les trucs dans le Y négatif */
object { OpenBox(2, 0.08) rotate <5, 7, -12+(24*NormClock)>
translate <-22, 4, -79> }
object { Les_Cahutes () rotate y*7 translate <35, 0, -84> }
object { Les_Cahutes () rotate y*7 translate <34, 0, -76> }
}
}
/* ------------------------------------------------------------ */

55
cutoff.pov Normal file
View File

@@ -0,0 +1,55 @@
/*
* H E X A C O N E - C U T O F F
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
// =======================================================
#declare POS_Cutoff = <30.33, 0, -11>;
#local TY = 1.5;
#declare Kbox = (2.03*NormClock);
difference {
object { HexaCone () }
box { -1, 1 translate z*Kbox }
translate y*TY + POS_Cutoff
}
/* this two objects are for debugging */
// object { Repere scale 2 translate y*2.6 + POS_Cutoff }
// object { OpenBox translate y*TY + POS_Cutoff }
// =======================================================
light_source {
<-24, 0.4, -1>
colour Orange
parallel
point_at y*TY + POS_Cutoff
}
object { Le_Decor }
// =======================================================
#local CamX = POS_Cutoff.x + 4 + (3.14*Cos_01(NormClock));
#local CamY = 1.9 - (0.27*sqrt(NormClock));
#local CamZ = POS_Cutoff.z - 1.85 + (4.02*NormClock);
camera {
location <CamX, CamY, CamZ>
look_at <0, 1.5, 0> + POS_Cutoff
angle 39 - 6*Cos_01(NormClock)
}

View File

@@ -1,4 +1,14 @@
# statics datas
This directory is the home of things like :
statics datas, like height-fields files...
- `height_fields`, or « Champs d'altitude »
- `image_map`, or « Papier peint »
But you have to provide your homebrewed one, who must be of high
quality, larger than 512x512 pixels. On the other side, you are
free to experiment with ugly files *:)*
You can also see the colors for the EGA conversion :
![16 colors](ega-16colors.png), used by this
[script](tools/build-ega-mp4.sh).

BIN
datas/ega-16colors.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

137
dynamic.inc Normal file
View File

@@ -0,0 +1,137 @@
/*
*/
#include "gadgets.inc"
// =======================================================
// on va tenter de placer quelques trucs
// qui bougent sur le rail circulaire
#for (foo, 0, 5)
#local CK = (NormClock+(foo*0.019)) * 4.750; // radians
#declare Xpos = R_circular * sin(CK);
#declare Zpos = R_circular * cos(CK);
#declare AR = degrees(CK);
object {
Wagonnet_0 (2.4)
rotate y*AR
translate <Xpos, 0.75, Zpos>
}
#end // for
//
object { Les_Bibelots rotate y*clock translate UnderHoles[2] }
object { Les_Machins rotate -y*clock translate UnderHoles[3] }
/// =======================================================
/*
* un hexabenz sur une base exterieure
*/
#declare BiBenz = object
{
#local K = 1.39;
union {
object { HexaBenz () rotate y*90 translate <-K, 1.79, 0> }
object { HexaBenz () translate < K, 1.66, 0> }
}
}
object { BiBenz rotate -y*(clock*0.21) translate Pos_RedB_0 }
/*
* deux hexacones se tournent autour
* XXX peut-être les faire bouger un peu plus ?
*/
#declare BiCone = object
{
#local K = 1.27;
union {
object { HexaCone () rotate y*90 translate <-K, 1.7, 0> }
object { HexaCone () rotate <4, 1, 6> translate < K, 1.9, 0> }
}
}
object { BiCone rotate -y*(Cos_010(NormClock)*55.38) translate Pos_RedB_1 }
/*
* on fait passer un hexatruc dans le ciel
*/
#declare A = <-SzSol, 22, -10>;
#declare B = < SzSol+4, 18, -11>;
#declare P = Interpolate(A, B, NormClock);
object { HexaCone () rotate y*((12*NormClock)+80) translate P }
/* XXX
* un "machin" se déplace sur le rail circulaire
* XXX */
/*
* le vaisseau "trident" passe a travers les
* trous de l'underground
*/
#fopen Trid "WS/tridents.log" write
#for (Foo, 0, 5)
#declare Dy = rand(Rng1)-3+(11*NormClock);
#declare Tr = UnderHoles[Foo] + <0, Dy, 0>;
#declare Ry = ((rand(Rng1)-NormClock)*87);
#write (Trid, Foo, " ", NormClock, " ", Dy, " ",
Ry, " ", Tr, "\n")
object { Trident_A () rotate y*Ry translate Tr }
#end
#fclose Trid
/*
* ----------------------------
* echange hexacone et hexabenz
*/
#declare HC_A = <0.03, 2.18, 0.17>;
#declare HC_B = <3.00, 11.07, 11.09>;
#declare HC_P = Interpolate(HC_A, HC_B, Cos_01(NormClock));
#declare RX = -9+(NormClock*11);
#declare RY = 122 * (exp(NormClock) - 1.0);
#declare RZ = 33 * cos(NormClock*7.65);
object { HexaCone ()
rotate <RX, RY, RZ>
translate HC_P
}
#declare HB_A = <-5.00, 10.0, 6.33>;
#declare HB_B = < 0.03, 2.32, -0.37>;
#declare HB_P = Interpolate(HB_A, HB_B, Cos_01(NormClock));
#declare RX = Cos_01(NormClock);
#declare RY = -75 * (exp(NormClock*1.8) - 1.0);
#declare RZ = abs(33 * sin(NormClock*7.65));
object { HexaBenz ()
rotate <RX, RY, RZ> translate HB_P }
/*
* passage d'un hexawood près de la base
*/
#declare A = <-25, 0.4, (SzSol/2)+4>;
#declare B = < 29, 0.5, (SzSol/2)+1>;
#declare P = Interpolate(A, B, NormClock);
#local K = NormClock*31;
#local R = 16.64 * cos(K);
#local H = 0.52 * pow(sin(K), 3);
#declare P_hexawood = P + <0, 0.26+H, 0>;
object { HexaWood rotate z*R translate P_hexawood }
/*
* survol par un trident
*/
#declare A = < 2, 47, -20>;
#declare B = <-3, 35, 22>;
#declare P = Interpolate(A, B, NormClock);
object { Trident_A () rotate y*(clock*2.7)
rotate z*80
rotate <2, 94, 0>
translate P }
/* ----------------------------------- */
#debug "dynamic is loaded\n"
/* ----------------------------------- */

View File

@@ -9,44 +9,56 @@
#include "globals.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
// =======================================================
#for (idX, 0, 4)
#for (idZ, 0, 4)
#include "dynamic.inc"
#local posX = (idX * 4.56) - 6.5;
#local posY = 1.3 * (rand(Rng1)-0.5);
#local posZ = (idZ * 4.24) - 8.9;
#local Ry = (rand(Rng1) - 0.5) * 16;
#if (rand(Rng1) < 0.515)
object { HexaCone ()
rotate y*Ry translate <posX, posY, posZ> }
#for (idX, -3, 3)
#for (idZ, -3, 3)
#local posX = (idX * 4.72) + (rand(Rng1)-0.5);
#local posY = 3.1 + (1.3*(rand(Rng1)-0.5));
#local posZ = (idZ * 4.37) ;
#local Rx = (rand(Rng1) - 0.5) * 8;
#local Ry = (rand(Rng1) - 0.5) * 14;
#local Rz = (rand(Rng1) - 0.5) * 11;
// #debug concat("X ", str(posX,7,3), " Z ", str(posZ,7,3), "\n")
// #debug concat("position Z ", str(posZ,7,3),"\n")
#declare Limit = 1.450;
#if ( (abs(posX)>Limit) & (abs(posZ)>Limit) ) // position
#if (rand(Rng1) < 0.555)
object { HexaCone () rotate <Rx, Ry, Rz>
translate <posX, posY, posZ> }
#else
object { HexaBenz ()
rotate y*Ry translate <posX, posY, posZ> }
#end
#end
object { HexaBenz () rotate <Rx, Ry, Rz>
translate <posX, posY, posZ> }
#end
// #debug "\n"
#end // if position...
#end // loop idX
#end // loop idZ
// =======================================================
#if (NormClock < 0.08)
light_source { <-8, 7, -9>, rgb <0.81, 0.65, NormClock> }
#end
object { Le_Decor }
light_source { < 11, 7, 4>, rgb <NormClock, 0.48, 0.80> }
// object { Repere scale 5 translate y }
// object { Repere scale 5 }
#local CamX = -8.7+(6.6*NormClock);
#local CamY = -5+(11.9*Cos_01(NormClock));
#local CamZ = 15.06+(2.9*Cos_010(NormClock));
#local CamX = -8.7 + ( 6.9 * Cos_01(NormClock));
#local CamY = 0.42 + (29.06 * Cos_01(NormClock));
#local CamZ = 122 - (18.9 * Cos_01(NormClock));
camera {
location <CamX, CamY, CamZ>
look_at <0.0, 0.0, 0>
angle 53 - (3.57 * NormClock)
look_at <0.0, -NormClock, 0>
angle 64 - (3.97 * NormClock)
}

258
essai.pov
View File

@@ -6,104 +6,202 @@
#version 3.7;
#include "globals.inc"
#debug "\n GLOBALS INCLUDED\n"
#include "contexte.inc"
#include "elements.inc"
#include "gadgets.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
// XXX
#include "xperiment.inc"
// XXX
// =======================================================
/* nouveau du 20 octobre 2025
* Un semblant de wagonnet qui va tourner sur le
* rail circulaire
*/
#declare Un_Wagonnet = object
{
#local R = 3.2;
object { Wagonnet_0 (R)
rotate y*clock*2
}
}
// =======================================================
#macro GyroPhare_mat ()
cylinder {
0, y*H_gyro, R_gyro
#if (rand(Rng1) < 0.5)
texture { T_Stone25 scale 1+rand(Rng1) }
#else
texture { T_Stone6 }
#end
}
#end // macro
#macro GyroPhare_lampe ()
union {
difference {
cylinder { 0, y*0.20, R_gyro }
cylinder { y*0.01, y*0.19, R_gyro*0.97 }
#local WB = 0.015;
box { <-1, 0.03, -WB>, <1, 0.18, WB> }
box { <-WB, 0.03, -1>, <WB, 0.18, 1> }
#undef WB
pigment { color White }
rotate y*(0.5-rand(Rng1))*clock
}
light_source { y*0.10 rgb <0.8, 0.9, 0.999999999> }
}
#end // macro
#macro GyroPhare ()
union {
object { GyroPhare_mat () }
object { GyroPhare_lampe ()
// rotate y*rand(Rng1)*clock
translate y*(H_gyro+0.02) }
}
#end // macro
// =======================================================
#macro Bubble ()
/* nouveau du 7 octobre 2025 */
#macro Une_Boule ()
sphere {
0, 0.06
#if ( rand(Rng1) < 0.333 )
texture { Ruby_Glass }
#elseif ( rand(Rng1) < 0.666 )
texture { Orange_Glass }
#else
texture { Gold_Nugget }
0, 0.15 + (rand(Rng1) * 0.07)
#local R = rand(Rng1);
#if (R < 0.333) texture { C_Texture }
#elseif (R < 0.666) texture { M_Texture }
#else texture { Y_Texture }
#end
finish { specular 0.6 }
}
#end
#end // macro
#macro Un_Machin ()
union {
#for (Y, 1, 8, 1)
object { Bubble() translate y*Y*0.1 }
#end
}
#end
#declare Les_Machins = object
/* TODO
* trouver une meilleure méthode de placement
*/
#declare Les_Boules = object
{
union {
#local Rk = 4.95;
#for (foo, 0, 360, 15)
#local Xpos = Rk * sin(radians(foo));
#local Zpos = Rk * cos(radians(foo));
#if ( rand(Rng1) < 0.40 )
object { GyroPhare () translate <Xpos, 0, Zpos> }
#else
object { Un_Machin () translate <Xpos, 0.33, Zpos> }
#end
#end
#undef Rk
#for (A, 0, 32, 1)
#local CK = (NormClock*55.00) + (A*0.08);
object { Une_Boule ()
#local TX = 1.6 * sin(CK);
#local TY = 1.4 * cos(sin(CK));
#local TZ = 2.0 * cos(1-CK);
translate <TX, TY, TZ>
}
object { Repere scale 2 }
#end // for
}
}
object { Les_Machins translate y*0.01}
// =======================================================
/*
* nouveau du 25 octobre 2025
*/
#declare Obj_BasicTexture = object
{
#local R = 0.369;
#local H = 1.2;
merge {
cylinder { 0, y*H, R }
sphere { 0, R scale <1, 0.50, 1> translate y*H }
box { <-0.19, 0, -0.17>, <R+0.4, H*0.39, R+0.6> }
}
}
object { Le_Sol }
// object { Repere }
#declare BasicTextures = object
{
#local TR = 2.20;
union {
object { Obj_BasicTexture texture { R_Texture }
translate <TR*1.4, 0, 0> }
object { Obj_BasicTexture texture { G_Texture }
translate <0, 0, -1> }
object { Obj_BasicTexture texture { B_Texture }
translate <0, 0, TR/2> }
object { Obj_BasicTexture texture { Y_Texture }
translate < TR, 0, TR> }
object { Obj_BasicTexture texture { M_Texture }
translate <-TR, 0, TR> }
object { Obj_BasicTexture texture { C_Texture }
translate <-TR, 0, -TR> }
object { Repere scale 1.5 translate y*2.5 }
}
}
// =======================================================
#declare Des_Choses = object
{
union {
object { Chose () translate -<-1.7, 0, 0.8> }
object { Chose () translate -< 1.5, 0, 1.2> rotate -y*clock }
object { Chose () translate -< 1.1, 0, -1.2> rotate y*clock }
}
}
// =======================================================
#declare Gyros = object
{
// #debug " Les gyros !!!\n"
union {
#for (I, 0, 359, 30)
#declare E = 12;
#declare Dx = E * sin(radians(I));
#declare Dz = E * cos(radians(I));
object { GyroPhare () translate <Dx, 0, Dz> }
#end
}
}
object { Gyros }
// ------------------------------------------------------ ##
#debug " !!! ACTION !!!\n"
// ------------------------------------------------------ ##
#declare Selector = mod(int(clock/60)+19, 8);
#debug concat("Selector = ", str(Selector, 6, 0), "\n")
#declare AngleCam = 17 - 3*Cos_01(NormClock);
#switch (Selector)
#case (0)
union {
object { OpenBox(1, 0.03) }
object { OpenBox(0.55, 0.03)
translate <0.4*rand(Rnd2), NormClock*0.74,cos(NormClock)> }
translate y*2.1
}
#break
#case (1)
object { Les_Arches (1.57) rotate -y*(clock*0.666) }
#declare AngleCam = 22;
#break
#case (2)
object { HexaPole translate y }
#break
#case (3)
object { Des_Choses }
#break
#case (4)
object { HexaCone () scale 2 translate 2.7*y rotate -y*clock }
#break
#case (5)
object { Les_Boules translate y*0.8 }
#break
#case (6)
object { Un_Wagonnet translate < 1, 1, 0> }
object { Un_Wagonnet translate y+NormClock }
object { Un_Wagonnet translate <-1, 1, 0> }
#break
#case (7)
#local Pos = <0, 0, 0>;
object { BasicTextures rotate -y*clock translate Pos }
#break
#end // switch selector
plane {
y, 0
texture { Ground_Texture }
}
// object { Repere translate y*1.0 }
// =======================================================
// light_source { <-8, 7, -9>, rgb <0.81, 0.65, NormClock> }
// light_source { < 11, 7, 4>, rgb <1-NormClock, 0.28, 0.80> }
#local CamX = -2.7 + (1.8*Cos_010(NormClock));
#local CamY = 0.41 + (1.2*exp(NormClock));
#local CamZ = -5.777 + (1.2*Cos_01(NormClock));
#local K = 8.6;
#local CamX = CamX * K;
#local CamY = CamY * K * 0.61;
#local CamZ = CamZ * K;
#local CamX = -12.7 + (5.8*NormClock);
#local CamY = 8.81 + (14*sqrt(NormClock));
camera {
location <CamX, CamY, 9.99>
look_at <0, 0, 0>
angle 42 + 8*Cos_01(NormClock)
#if (clock < 225)
orthographic
#end
location <CamX, CamY, CamZ>
look_at <0, 1.6, 0>
angle AngleCam
}

View File

@@ -1,15 +1,19 @@
# Le silo des frames
Avant tout, il faut créer ces répertoires :
```
frames/
├── essai
├── orbite
├── passage
├── scene
├── scene
├── orbite
├── escadrille
└── topview
+--- essai
+--- orbite
+--- passage
+--- scene
+--- scene
+--- orbite
+--- survol
+--- escadrille
+--- topview
+--- Spool
```

217
gadgets.inc Normal file
View File

@@ -0,0 +1,217 @@
/*
* H E X A C O N E - G A D G E T S
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
/* ======================================================= */
/* new 30 aout 2025
*
* une idée à creuser davantage...
*/
// ------------------------------------------------------ ##
#macro Chose_le_pied ()
merge {
cylinder { 0, y/2, 0.07 }
cylinder { 0, y/8, 0.37 }
#local R = rand(Rng1);
#if ( R < 0.52)
texture { T_Beton_1 }
#else
texture { T_Beton_2 }
#end
}
#end // macro
// ------------------------------------------------------ ##
/*
* Il doit être possible de dissocier le noyau des tiges */
#macro Chose_le_corps () // = object
merge {
difference {
cone { -1.2*y, 0.81, 0.2*y, 1.07 }
sphere { 0.2*y 0.73 }
}
#local CK = NormClock * (9.876+rand(Rng1));
#for (Foo, 0, 7)
#local CK2 = CK + Foo;
#local C2X = 1.9 * sin(CK2+rand(Rng1)) * sin(CK*3);
#local C2Z = 2.0 * (sin(-CK2+rand(Rng1)) * cos(CK*(rand(Rng1))));
#local R = 0.06+(0.04*Cos_010(NormClock));
#local H = 4.2;
cylinder { 0, <C2X, H, C2Z>, R }
sphere { <C2X, H, C2Z>, R }
#end
#local R = rand(Rng1);
#if (R < 0.33) texture { tPlasticOrange }
#elseif (R < 0.66) texture { tPlasticBlue }
#else texture { tPlasticGreen }
#end // if
scale <0.62, 0.5, 0.61>
rotate -y*clock
translate y*1.05
}
#end // macro
// ------------------------------------------------------ ##
#macro Chose ()
union {
Chose_le_pied ()
Chose_le_corps ()
}
#end // macro
/* ======================================================= */
#declare Horloge = object
{
#local Texte = str(NormClock, 6, 3);
#debug concat("Texte horloge ", Texte, "\n\n")
text {
// ttf "datas/DSEG7Classic-Regular.ttf" Texte 0.1, 0
ttf "datas/ComicMono-Bold.ttf" Texte 0.1, 0
texture { tPlasticGreen }
}
scale 3.00
rotate 90*x
translate <-4.5, 0.044, 0>
}
// =======================================================
/*
* need more work !
*/
#macro Base_hexapole ()
prism {
linear_sweep
linear_spline
0, // sweep the following shape from here ...
1, // ... up through here
7, // the number of points making up the shape ...
<3,5>, <-3,5>, <-5,0>, <-3,-5>, <3, -5>, <5,0>, <3,5>
#if (rand(Rng1) < 0.5)
texture { T_Beton_1 }
#else
texture { T_Beton_2 }
#end // if
scale 0.666
}
#end // macro
// ------------------------------------------------------ ##
#macro HexaPole_tubes ()
#local R = 0.04;
#local E = 0.58;
#local H = H_cone*1.5;
union {
#for (A, 0, 359, 60)
#local Xp = E * cos(radians(A));
#local Zp = E * sin(radians(A));
union {
#local H2 = H + rand(Rng1) + rand(Rng1);
cylinder { 0, y*H2, R }
sphere { 0, R*2 scale <1, 0.555, 1> }
sphere { 0, R*2 scale <1, 1.555, 1> translate y*H2 }
#local Ra = rand(Rng1);
#if (Ra < 0.25)
texture { T_Chrome_1A }
#elseif (Ra < 0.50)
texture { T_Chrome_4D }
#elseif (Ra < 0.75)
texture { T_Brass_2C }
#else
texture { Soft_Silver }
#end
translate <Xp, 0, Zp>
}
#end
}
#undef E
#undef H
#undef R
#end
// ------------------------------------------------------ ##
/*
* l'assemblage en grand cercle de ces trucs est
* dans le fichier "contexte.inc"
*/
#macro HexaPole ()
union {
object { Base_hexapole () scale <0.24, 0.2, 0.24> }
object { HexaPole_tubes () translate y*0.15 }
rotate y*(53*rand(Rng1))
}
#end // macro
// =======================================================
#macro OpenBox (D, R)
union {
/* les verticales */
cylinder { <-D, -D, -D>, <-D, D, -D>, R }
cylinder { < D, -D, -D>, < D, D, -D>, R }
cylinder { <-D, -D, D>, <-D, D, D>, R }
cylinder { < D, -D, D>, < D, D, D>, R }
/* en bas */
cylinder { < D, -D, D>, <-D, -D, D>, R }
cylinder { < D, -D, -D>, <-D, -D, -D>, R }
cylinder { <-D, -D, D>, <-D, -D, -D>, R }
cylinder { < D, -D, D>, < D, -D, -D>, R }
/* en haut */
cylinder { < D, D, D>, <-D, D, D>, R }
cylinder { < D, D, -D>, <-D, D, -D>, R }
cylinder { <-D, D, D>, <-D, D, -D>, R }
cylinder { < D, D, D>, < D, D, -D>, R }
texture { Soft_Silver scale 6.50 }
}
#end
// =======================================================
/*
* first written macro for testing the generation of
* differente instances of the same shape.
*/
#macro Bubble ()
sphere {
0, 0.070
#local R = rand(Rng1);
#if ( R < 0.333 )
texture { Ruby_Glass }
#elseif ( R < 0.666 )
texture { Orange_Glass }
#else
texture { Gold_Nugget }
#end
#undef R
scale <1.414, 1.000, 1.414>
}
#end
#macro Un_Machin ()
union {
#for (Y, 1, 8, 1)
object { Bubble() translate y*Y*0.11 }
#end
}
#end
#declare Les_Machins = object
{
union {
#local Rk = 3.90 + NormClock;
#for (foo, 0, 359, 45)
#local Xpos = Rk * sin(radians(foo));
#local Zpos = Rk * cos(radians(foo));
object { Un_Machin () translate <Xpos, 0.20, Zpos> }
#end
#undef Rk
}
}
// =======================================================

View File

@@ -1,7 +1,7 @@
global_settings {
assumed_gamma 1.0
ambient_light rgb <0.18, 0.18, 0.21>
ambient_light rgb <0.47, 0.47, 0.47>
max_trace_level 15
}
@@ -9,28 +9,161 @@ global_settings {
#include "metals.inc"
#include "textures.inc"
#include "stones.inc"
#include "woods.inc"
#declare Rng1 = seed(1337);
#declare Rng1 = seed(51);
#declare foo = rand(Rng1);
#declare Rng2 = seed(now*24*60*60);
#declare bar = rand(Rng2);
#declare NormClock = clock / 360.0;
#declare NormClock = clock / (NbFrames - 1);
/* ------------------------------------------------------------ */
/*
* Some constants...
*/
#declare SzSol = 30;
#declare SzSol = 34;
#declare H_sol = 0.000; // c'est quoi exactement ?
#declare SzBase = 2.90;
#declare H_base = 0.23;
#declare R_basecone = 0.117;
#declare H_cone = 0.97;
#declare R_gyro = 0.10;
#declare H_gyro = 1.20;
#declare R_gyro = 0.14;
#declare H_gyro = 1.80;
#declare H_gylampe = 0.25;
#declare H_QuadriLight = 37;
#declare E_QuadriLight = SzSol * 1.35;
#declare R_circular = (SzSol * 1.60);
/* ------------------------------------------------------------ */
/*
* Some textures...
*/
#declare WIP_color = texture
{
pigment { color Cyan*NormClock }
finish { phong 0.23 ambient 0.50 }
}
#declare T_WIP_alert = texture
{
pigment { color Red }
finish { ambient 1 specular 0.80 }
}
#declare T_Planete_A = texture
{
pigment { color rgb <0.20, 0.30, 0.10> }
normal { dents 0.28 scale 0.5}
finish { phong 0.70 reflection 0.05 }
}
#declare T_Planete_B = texture
{
pigment { rgb <0.42, 0.50, 0.70> }
normal { dents 0.14 scale 0.5}
finish { metallic 0.50 reflection 0.33 }
}
/* ------------------------------------------------------------ */
/*
* deux textures pour faire des batiments
*/
#declare T_Beton_1 = texture
{
pigment { color <0.9, 0.8, 0.7> }
normal { dents 0.75 scale 0.3 }
finish { roughness 1.00 }
}
#declare T_Beton_2 = texture
{
pigment { color <0.7, 0.6, 0.4> }
normal { dents 0.25 scale 3 }
finish { roughness 1.00 }
}
/* ------------------------------------------------------------ */
#declare tPlasticOrange = texture
{
pigment{rgb <2.000, 0.50, 0.0>}
finish {
ambient 0.1
diffuse 0.6
specular 0.3
}
}
#declare tPlasticGreen = texture
{
pigment{rgb <0.20, 1.600, 0.0>}
finish {
ambient 0.1
diffuse 0.6
specular 0.3
}
}
#declare tPlasticBlue = texture
{
pigment{rgb <0.50, 0, 2.0>}
finish {
ambient 0.1
diffuse 0.6
specular 0.3
}
}
/* this texture will be clock dependent XXX */
#declare Flashy = texture {
pigment {
onion
colour_map {
[0.00, Red * 0.70 ]
[0.33, Gray50 ]
[1.00, Blue * 0.70 ]
}
turbulence 3.14159
scale 0.50
}
finish {
emission 0 ambient 0.717 diffuse 0.209 specular 0
}
}
/* ------------------------------------------------------------ */
/*
*
*/
#declare R_Texture = texture {
pigment { rgb <1.0, 0.0, 0.0> } finish { ambient 0.33 } }
#declare G_Texture = texture {
pigment { rgb <0.0, 1.0, 0.0> } finish { ambient 0.33 } }
#declare B_Texture = texture {
pigment { rgb <0.0, 0.0, 1.0> } finish { ambient 0.33 } }
#declare Y_Texture = texture {
pigment { rgb <0.8, 0.8, 0.0> } finish { ambient 0.33 } }
#declare M_Texture = texture {
pigment { rgb <0.8, 0.0, 0.8> } finish { ambient 0.33 } }
#declare C_Texture = texture {
pigment { rgb <0.0, 0.8, 0.8> } finish { ambient 0.33 } }
/* ------------------------------------------------------------ */
#declare GoldDark = texture
{
pigment{ rgb <0.81, 0.71, 0.23> }
finish{ diffuse 0.5 ambient 0 specular 1 metallic roughness 0.01
reflection{0.6 metallic}
}
} // This is a metal.
/* ============================================================ */
/*
* Usefull macros
*/
@@ -41,4 +174,10 @@ global_settings {
(0.5-0.5*cos( 2 * 3.141592654 * X))
#end
/* Interpolate */
#macro Interpolate(A, B, pos)
#local resultat = ( (B-A) * pos) +A;
resultat
#end
/* ------------------------------------------------------------ */

154
groundbase.inc Normal file
View File

@@ -0,0 +1,154 @@
/*
* _ _
* __ _ _ __ ___ _ _ _ __ __| || |__ __ _ ___ ___
* / _` || '__|/ _ \ | | | || '_ \ / _` || '_ \ / _` |/ __| / _ \
* | (_| || | | (_) || |_| || | | || (_| || |_) || (_| |\__ \| __/
* \__, ||_| \___/ \__,_||_| |_| \__,_||_.__/ \__,_||___/ \___|
* |___/
*
* nouveau debut fevrier 2025 - we love raytracing
*
* une cabane pour faire riche.
* une seule forme de cabane pour le moment
*/
#declare Base_cabane_forme = object
{
difference {
#local Hc = 0.90;
box { <-0.90, 0, 0>, <0.90, Hc, 0.80> }
box { <-0.89, 0.01, -1> <0.89, Hc-0.01, 0.79> }
#local Hc = Hc * 0.75;
cylinder { <-1, Hc, -0.29>, <1, Hc, 0.29>, 0.09 }
#undef Hc
}
}
/*
* comparaison des deux textures par le rendu
* de la meme forme de cabane.
*/
#declare Cabane_Base_1 = object
{
object { Base_cabane_forme }
texture { T_Beton_1 }
}
#declare Cabane_Base_2 = object
{
object { Base_cabane_forme }
texture { T_Beton_2 }
}
// ------------------------------------------------------ ##
#declare Compteur = object
{
#local Texte = str(clock, 3, 0);
#debug concat("Texte du compteur ", Texte, "\n\n")
text {
ttf "datas/ComicMono-Bold.ttf" Texte 0.1, 0
texture { T_WIP_alert }
}
}
#declare Cabane_Compteur = object
{
union {
object { Compteur scale 0.55
translate <-0.46, 0.22, 0.32> }
object { Cabane_Base_2 }
}
}
/* ======================================================= */
#declare GroundBase_Sol = object
{
intersection {
height_field {
png "datas/hf.png" smooth
translate <-.5, 0, -.5>
#local SC = SzSol * 1.10;
scale <SC, 0.90, SC>
texture {
pigment {
image_map { png "datas/colormap.png" }
rotate x*90
translate <-.5, 0, -.5>
scale <SC, 1, SC>
}
}
}
cylinder { -y*5, y*5, SzSol*0.45 }
}
finish { phong 0.096 }
translate y*H_sol
}
/* ======================================================= */
#declare GroundBase_a = object
{
/*
C'est quoi ce truc ?
*/
union {
#local Dx = 1.5;
#local Dz = 1.0;
box { <-Dx, 0, -Dz>, <Dx, H_base, Dz> }
#local Ha = y*(H_base*2);
cylinder { 0, Ha, 0.08 translate < Dx, 0, -Dz> }
cylinder { 0, Ha, 0.08 translate <-Dx, 0, -Dz> }
#local Hb = Ha * 1.17;
cone { Ha, 0.08, Hb, 0.05 translate < Dx, 0, -Dz> }
cone { Ha, 0.08, Hb, 0.05 translate <-Dx, 0, -Dz> }
#undef Ha
#undef Hb
#undef Dx
#undef Dz
}
texture { T_Grnt7 rotate 49 scale 0.333 }
}
/* ------------------------------------------------------------ */
#declare GroudBase_coin = object
{
merge {
cylinder { 0, y*0.5, 0.10 }
sphere { 0, 0.10 scale <1, 0.25, 1> translate y*0.5 }
}
}
#declare GroundBase_estrade = object
{
#local Sz = SzBase - 0.14;
#local Hc = H_base;
union {
box { <-SzBase, 0, -SzBase>, <SzBase, H_base, SzBase> }
object { GroudBase_coin translate <-Sz, Hc, -Sz> }
object { GroudBase_coin translate < Sz, Hc, -Sz> }
object { GroudBase_coin translate <-Sz, Hc, Sz> }
object { GroudBase_coin translate < Sz, Hc, Sz> }
}
texture { T_Grnt27 rotate 9 scale 0.32 }
#undef Sz
#undef Hc
}
/* ------------------------------------------------------------ */
#declare La_GroundBase = object
{
union {
object { GroundBase_Sol }
object { GroundBase_estrade translate y*H_sol }
/*
* ici, mettre la cabane
*/
#local Dz = <0, 0, -7>;
object { GroundBase_a translate Dz }
object { Cabane_Compteur rotate y*180
translate Dz + y*H_base }
#undef Dz
}
translate y*(H_sol+H_base) // XXX Why ?
}
/* ======================================================= */

View File

@@ -8,63 +8,87 @@
union {
#local RA = R_basecone;
#local RB = 0.001;
difference {
cone { 0, RA, y*0.89, 0.0001 }
sphere { 0, RA*1.098 scale <1, 0.62, 3.03> translate -0.02*y }
cone { 0, RA, y*0.89, 0.0001 translate -0.014*y }
}
difference {
sphere { 0, RA*1.098 scale <1, 0.58, 3.03> }
sphere { 0, RA*1.096 scale <1, 0.58, 3.03> }
translate -0.02*y
}
}
// }
#end
// ------------------------------------------------------
/* nouveau Fri Oct 17 05:54:38 PM UTC 2025 */
#macro Benz_attache_cones (Ec)
torus { Ec, Ec*0.06
scale <1, 2.4, 1> rotate x*90
#if ( rand(Rng1) < 0.55 )
texture { GoldDark }
#else
texture { T_Brass_1C }
#end
}
#end
// ------------------------------------------------------
#macro Benz_Cones () // = object
// {
union {
#for (foo, 0, 360, 60)
#local E = 0.38;
#local E = 0.31;
#local Tx = E * sin(radians(foo));
#local Ty = E * cos(radians(foo));
object {
Benz_Cone_Base ()
#if ( rand(Rng1) < 0.5 )
#local R = rand(Rng1);
#if ( R < 0.3333 )
texture { T_Silver_2C scale 11.50 }
#else
#elseif ( R < 0.6666 )
texture { T_Brass_2C scale 13.50 }
#else
texture { T_Brass_4A scale 13.50 }
#end
rotate -z*foo
translate <Tx, Ty, 0>
}
#end
#end // end for
#local SBAC = 0.300;
object { Benz_attache_cones (SBAC) translate -z*0.175 }
object { Benz_attache_cones (SBAC) translate z*0.202 }
}
// }
#end
// ------------------------------------------------------
#local R_Tube = 0.20;
#declare R_Tube = 0.17;
#local L_Tube = 0.54;
#declare Benz_Tubules = object
{
#macro Benz_Tubules ()
merge {
#local E = R_Tube * 0.0910;
#local R = 0.01;
#for (foo, 0, 360, 20)
#local E = R_Tube * 0.75;
#local R = 0.009;
#for (foo, 0, 360, 30)
#local Tx = E * sin(radians(foo));
#local Ty = E * cos(radians(foo));
#local Dza = z * 0.20;
#local Dzb = z * 0.90;
#local Dza = z * 0.25;
#local Dzb = z * 0.97;
cylinder { -Dza, Dzb, R translate <Tx, Ty, 0> }
sphere { -Dza, R*1.8 translate <Tx, Ty, 0> }
sphere { Dzb, R*1.8 translate <Tx, Ty, 0> }
#end
}
#if ( rand(Rng1) < 0.333)
#if ( rand(Rng1) < 0.520)
texture { Orange_Glass }
#else
texture { Yellow_Glass }
#end
}
#end
#declare Benz_Fuseau = object
{
#macro Benz_Fuseau ()
difference {
sphere { 0, R_Tube*0.39 }
sphere { 0, R_Tube*0.37 }
@@ -72,44 +96,81 @@ difference {
cylinder { < 1, 0, -1>, <-1, 0, 1>, R_Tube*0.21 }
}
scale <1, 1, 4.4>
#if ( rand(Rng1) < 0.390)
texture { Shadow_Clouds scale 0.56 }
}
#else
texture { Flashy }
#end
#end // end macro
#declare Benz_Fuseau_Flash = object
{
union {
object { Benz_Fuseau }
object { Benz_Fuseau () }
light_source { 0,
rgb <rand(Rng2), rand(Rng2), rand(Rng2)>
fade_distance 0.96
fade_power 1.95
}
}
rotate -z*clock*8
}
// -------------------------------------------
/*
* This part need more work
*/
#local Forme_Cockpit = object
{
difference {
sphere { 0, R_Tube*0.72 }
sphere { 0, R_Tube*0.72 scale 0.99 }
#for (Foo, 0, 359, 36)
cylinder { x, 0, R_Tube*0.15
translate y*(R_Tube*0.34)
rotate y*Foo }
#end
}
}
rotate -z*clock*6
scale <1, 0.92, 1>
translate z*L_Tube*1.18
}
#declare Benz_Cylindre = object
{
#local E_tube = 0.02;
#local R_int = R_Tube - E_tube;
difference {
union {
cylinder { z*L_Tube*1.5, -z*L_Tube, R_Tube }
cylinder { z*L_Tube*1.6, -z*L_Tube, R_Tube }
/* les deux bouts du cylindre creux */
#local R2 = (R_Tube + R_int) / 2;
torus { R2, E_tube scale <1, 5, 1>
rotate x*90 translate z*L_Tube*1.6 }
torus { R2, E_tube scale <1, 5, 1>
rotate x*90 translate -z*L_Tube }
/* cette sphere devrait devenir
un vrai cockpit ? */
sphere { z*L_Tube*1.18, R_Tube*0.72
scale <1, 0.73, 1>
translate y*R_Tube*0.87}
object { Forme_Cockpit
translate y*R_Tube*0.97}
}
cylinder { z*4, -z*4, R_Tube*0.95 }
cylinder { z*4, -z*4, R_int }
}
texture { Soft_Silver scale 6.0 }
}
// ------------------------------------------------------
#warning "===>> inserer antenne pour hexabenz"
// ------------------------------------------------------
#macro Benz_Tube ()
// #declare Benz_Tube = object
// {
union {
object { Benz_Tubules }
object { Benz_Tubules () }
object { Benz_Fuseau_Flash translate z*0.40 }
object { Benz_Cylindre }
}
@@ -122,7 +183,7 @@ union {
// #declare HexaBenz = object
// {
union {
#local Rk = (rand(Rng1)-0.5) * 1024;
#local Rk = (rand(Rng1)-0.54) * 1312;
object { Benz_Cones () rotate z*NormClock*Rk}
object { Benz_Tube () }
}

View File

@@ -6,33 +6,30 @@
#include "globals.inc"
#include "colors.inc"
#include "metals.inc"
#include "textures.inc"
#include "stones.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
#local K = 1.48;
object { HexaBenz () rotate y*90 translate -x*K }
object { HexaBenz () translate x*K }
// =======================================================
light_source { <19, 7, 14>, rgb <0.77, 0.79, 0.80> }
light_source { <19, 9, -14>, rgb <0.87, 0.79, 0.70> }
object { Le_Decor }
// object { Repere scale 2 }
#declare Loc_cam = <0, 2, 2*NormClock> + (Pos_RedB_0 * 1.42);
camera {
location <-1.9+(8*NormClock), 0.70, 7.59-NormClock>
look_at <0.37, 0.0, 0>
focal_point <0.37, 0.0, 0>
aperture 0.046
blur_samples 30
angle 60 - 28 * Cos_01(NormClock)
location Loc_cam
look_at Pos_RedB_0 + <0, 1.20, 0>
// focal_point <0.37, 0.0, 0>
// aperture 0.046
// blur_samples 30
angle 40 - 14 * Cos_01(NormClock)
}

View File

@@ -40,7 +40,8 @@ union {
#local xR = (rand(Rng2)-0.5000) * kR;
#local yR = (rand(Rng2)-0.5000) * kR;
#local zR = (rand(Rng2)-0.5000) * kR;
#local Value = sin( (NormClock * 26.536) + (3.14*rand(Rng1)) );
#local Value = sin( (NormClock * 26.536) +
(3.14*rand(Rng1)) );
#if (Value < 0)
#local Couleur = rgb <abs(Value), 0, 0>;
#else
@@ -56,6 +57,8 @@ union {
texture { New_Penny }
// }
#end
// ---------------------------------------------------------
/*
*
*/
@@ -107,7 +110,7 @@ union {
#end
torus { R2, 0.0039 translate -0.08*y }
}
texture { T_Brass_1C scale 6.50 }
texture { GoldDark scale 6.50 }
}
/* ---------------------------------------------------------
@@ -117,7 +120,7 @@ texture { T_Brass_1C scale 6.50 }
{
difference {
merge {
sphere { 0, 0.0137 scale <1, 1, 4.70>
sphere { 0, 0.0141 scale <1, 1, 4.70>
translate <0, 0.26, -0.17> }
cone { <0, -0.1, 0>, 0.114, <0, 0.26, -0.17>, 0.0096
scale <0.15, 1, 1> }
@@ -135,11 +138,14 @@ union {
}
}
// ---------------------------------------------------------
#declare DTa = 0.278;
#declare DTb = 0.030;
#declare HexaCone_head = object
{
// XXX #declare HexaCone_head = object
// XXX {
#macro HexaCone_head ()
merge {
difference {
torus { DTa, DTb }
@@ -148,13 +154,17 @@ merge {
}
sphere { 0, DTb*1.65 translate -DTa*x }
sphere { 0, DTb*1.65 translate DTa*x }
}
#if (rand(Rng1) < 0.8)
#local R = rand(Rng1);
#if (R < 0.4)
texture { Orange_Glass }
#else
#elseif (R < 0.8)
texture { Dark_Green_Glass }
#else
texture { Flashy }
#end
}
#end // macro
// XXX }
/* ------------------------------------------
* new Sat Dec 21 11:17:36 PM UTC 2024
@@ -168,11 +178,10 @@ merge {
box { <-DXail, -DYail, -DZail> , <DXail, DYail, 0> }
}
#declare Le_rotor = object
{
#macro Le_rotor ()
union {
#local Rrot = 0.0034;
#local Lrot = 0.13;
union {
sphere { -x*Lrot, Rrot }
cylinder { <-Lrot, 0, 0>, <Lrot, 0, 0>, Rrot }
sphere { x*Lrot, Rrot }
@@ -183,14 +192,17 @@ union {
rotate (foo*35)*x
translate (foo*0.013)*x }
#end
}
// texture { T_Chrome_1C }
texture {
#if ( rand(Rng1) < 0.333 )
pigment { color Orange }
#else
pigment { color Magenta }
#end
// finish { emission 0.7 }
finish { ambient 0.7 phong 0.5 brilliance 0.9 metallic 0.7 }
finish { ambient 0.7 phong 0.5 brilliance 0.9 }
}
}
#end
/* ------------------------------------------------------
*
@@ -228,7 +240,7 @@ texture { T_Brass_1C }
{
union {
object { Tuyere }
object { Le_rotor rotate x*(clock*5.8) translate -0.06*x }
object { Le_rotor () rotate x*(clock*5.8) translate -0.06*x }
}
}
@@ -251,8 +263,8 @@ rotate -y*90
union {
object { HexaCone_Body () }
#local T = 0.55;
object { HexaCone_head translate <0, 0, T+DTa> }
#if ( (rand(Rng1) > 0.27) )
object { HexaCone_head () translate <0, 0, T+DTa> }
#if ( (rand(Rng1) > 0.47) )
object { HexaCone_radar_A translate <0, T+0.18, 0> }
#else
object { HexaCone_radar_B translate <0, T+0.18, 0> }

View File

@@ -6,41 +6,33 @@
#include "globals.inc"
#include "colors.inc"
#include "metals.inc"
#include "textures.inc"
#include "stones.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
#declare Cone_Repere = object
{
union {
object { HexaCone () }
object { Repere translate <-0.4, -0.2, -0.5> }
}
}
#local K = 1.48;
object { Cone_Repere rotate y*90 translate -x*K }
object { Cone_Repere translate x*K }
object { Le_Decor }
// =======================================================
light_source { <19, 7, 14>, rgb <0.77, 0.79, 0.80> }
light_source { <19, 9, -14>, rgb <0.87, 0.79, 0.70> }
// light_source { <19, 7, 14>, rgb <0.77, 0.79, 0.80> }
// light_source { <19, 9, -14>, rgb <0.87, 0.79, 0.70> }
// object { Repere scale 2 }
#declare Loc_cam = <2, 2.5, 1> + (Pos_RedB_1 * 1.383);
camera {
location <-1.9+(8*NormClock), 0.70, 7.59-NormClock>
look_at <0.37, 0.0, 0>
focal_point <0.37, 0.0, 0>
aperture 0.046
blur_samples 30
angle 55 - 28 * Cos_01(NormClock)
location Loc_cam
#local H = 1.16 + (NormClock*0.20);
look_at Pos_RedB_1 + <0.02, H, 0>
// focal_point <0.37, 0.90, 0>
// aperture 0.046
// blur_samples 30
angle 55 - 26 * Cos_01(NormClock)
}

126
hexawood.inc Normal file
View File

@@ -0,0 +1,126 @@
/*
* H E X A W O O D
*/
// =======================================================
#declare Hc_ep = 0.42; // epaisseur chassis
#declare Hc_rad = 0.70; // rayon du chassis
#declare Hc_elo = 1.85; // elongation sur x
// -------------------------------------------------------
#macro HW_Un_Cone ()
merge {
#local RA = R_basecone * 0.92;
cone { 0, RA, y*0.91, 0.000001 }
sphere { 0, RA }
#undef RA
}
#end
#macro HW_Cones ()
union {
#for (foo, 0, 360, 60)
#local E = Hc_rad * 0.85;
#local Tx = Hc_elo * E * sin(radians(foo));
#local Tz = E * cos(radians(foo));
object {
HW_Un_Cone ()
#if ( rand(Rng1) < 0.5 )
texture { T_Wood32 rotate 37 scale 1.30 }
// texture { WIP_color }
#else
texture { T_Wood23 rotate x*87 scale 1.33 }
// texture { T_WIP_alert }
#end
// rotate -z*foo
translate <Tx, Hc_ep - 0.22, Tz>
}
#end // end for
}
#end
#macro HW_Chassis ()
difference {
#local El = Hc_elo;
merge {
torus { Hc_rad, 0.20 translate y*0.20 }
cylinder { 0, y*0.40, Hc_rad }
scale <El, 0.5, 1>
}
/* trou pour mettre une lampe */
cylinder { -1*y, 0.12*y, 0.08 }
torus { Hc_rad*0.30, 0.18 scale <1, 1.45, 1>
translate y*0.39 }
#for (foo, 0, 360, 60)
#local E = Hc_rad * 0.85;
#local Tx = El * E * sin(radians(foo));
#local Tz = E * cos(radians(foo));
sphere { 0, 0.17 translate <Tx, 0.20, Tz> }
#end
#for (foo, 0, 360, 60)
#local E = Hc_rad * 1.14;
#local Tx = El * E * sin(radians(foo+30));
#local Tz = E * cos(radians(foo+30));
cylinder { -y, y, 0.05 translate <Tx, 0, Tz> }
#end
translate y*0.10
texture { T_Wood17 rotate <10, 20, 30> scale 0.82 }
}
#end
#macro HW_une_patte ()
merge {
sphere { 0, 0.025 scale <1, 0.24, 1> translate 0.30*y }
cylinder { 0, 0.30*y, 0.025 }
sphere { 0, 0.07 scale <1, 0.29, 1> }
}
#local R = rand(Rng1);
#if ( R < 0.3 )
texture { Tinny_Brass }
#elseif ( R < 0.8 )
texture { New_Penny }
#else
texture { T_Brass_2C }
#end // if
#end // macro
#declare HW_les_pattes = object
{
union {
#local E = Hc_rad * 1.14;
#local El = Hc_elo;
#for (foo, 0, 360, 60)
#local Tx = El * E * sin(radians(foo+30));
#local Tz = E * cos(radians(foo+30));
object { HW_une_patte () translate <Tx, 0, Tz> }
#end
}
}
#declare HW_Anneau0 = object
{
torus { Hc_rad*0.31, 0.05 scale <1, 0.75, 1>
texture { GoldDark } translate y*0.32 }
}
#declare HexaWood = object
{
union {
object { HW_Chassis () }
object { HW_les_pattes }
#if (mod(clock, 10) < 6)
light_source { 0.20*y rgb <0, 0.20, 0.95> }
#end
object { HW_Cones () translate y*0.15 }
object { HW_Anneau0 }
}
}
// =======================================================

34
hexawood.pov Normal file
View File

@@ -0,0 +1,34 @@
/*
* H E X A C O N E - H E X A W O O D
*
* le troisième de la famille.
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
// =======================================================
object { Le_Decor }
// object { Repere translate <10, 1, 10> }
#declare LOC = <19-NormClock, 1.60, 10.9-NormClock>;
#declare LAT = <P_hexawood.x, 0.95, P_hexawood.z>;
camera {
location LOC
look_at LAT
angle 26 + 2.11*NormClock
}

View File

@@ -7,17 +7,17 @@
#include "globals.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
// =======================================================
#declare R_planete = 1.42;
#declare R_planete = 1.45;
#declare Croute = object
{
#local R1 = R_planete * 1.05;
#local R2 = R_planete * 1.03;
#local HC = R_planete * 0.11;
#local HC = R_planete * 0.12;
#local BN = R_planete * 3;
difference {
@@ -28,8 +28,9 @@ difference {
box { <-BN, -BN, -HC>, <BN, BN, HC> }
}
texture {
pigment { color rgb <0.20, 0.40, 0.10> }
finish { reflection 0.25 }
pigment { color rgb <0.20, 0.30, 0.10> }
normal { dents 0.38 scale 0.5}
finish { phong 0.80 reflection 0.05 }
}
}
@@ -37,8 +38,8 @@ texture {
{
sphere { 0, R_planete }
texture {
pigment { rgb <0.70, 0.50, 0.70> }
finish { reflection 0.25 }
pigment { rgb <0.40, 0.50, 0.70> }
finish { metallic 0.50 reflection 0.55 }
}
}
@@ -52,30 +53,31 @@ union {
// =======================================================
#local RO = 4.15;
#local CK = NormClock * 7.87;
#local CK = NormClock * 13.37;
#declare PosX = RO * sin(CK);
#declare PosY = 0;
#declare PosZ = RO * cos(CK);
object { HexaBenz ()
rotate -y*CK*2.333 translate <PosX, PosY, PosZ>
rotate -y*CK*82.3 translate <PosX, PosY, PosZ>
}
#declare PosX = RO * sin(CK+2.12);
#declare PosY = 0;
#declare PosZ = RO * cos(CK+2.23);
object { HexaCone ()
rotate y*CK*3.222 translate <PosX, PosY, PosZ>
rotate y*CK*99.22 translate <PosX, PosY, PosZ>
}
object { Planete rotate (-clock*0.21)*y }
light_source { <19, 6, 15>, rgb <0.77, 0.79, 0.80> }
light_source { <23, 6, 15>, rgb <0.77, 0.79, 0.80> }
// -------------------------------------------------------------
camera {
location <3, 1.50, 7.59>
location <3, -1.0+(7.777*NormClock), 8.59>
look_at <0.0, 0.0, 0>
focal_point <0.07, 0.0, 0>
focal_point <0.0, 0.0, 0>
aperture 0.046
blur_samples 30
angle 62
angle 60
}

40
panoramic.pov Normal file
View File

@@ -0,0 +1,40 @@
/*
* H E X A C O N E - P A N O R A M I C
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "gadgets.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "xperiment.inc"
// =======================================================
object { Le_Decor }
#include "dynamic.inc"
// =======================================================
#declare CK = 2.79 * Cos_01(NormClock);
#declare CamX = 1.22;
#declare CamY = 7 + (4*Cos_01(NormClock));
#declare LatX = 20 * cos(CK*1.08);
#declare LatY = 3.0 - sqrt(NormClock);
#declare LatZ = 20 * sin(CK);
// object { Repere scale 2 translate <LatX, LatY, LatZ> }
camera {
// orthographic
location <CamX, CamY, 0>
look_at <LatX, LatY, LatZ>
angle 71 + (NormClock * 10)
}

View File

@@ -7,25 +7,26 @@
#include "globals.inc"
#include "colors.inc"
#include "metals.inc"
#include "textures.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
// ---------------------------------------
#include "dynamic.inc"
#declare PosX = 3.95;
#declare PosY = 3.80 + (NormClock*0.299);
#declare PosZ = (NormClock-0.5) * 44.27;
object { HexaCone () translate <PosX, PosY, PosZ> }
object { HexaCone () translate <PosX+2.96, PosY+3.22, PosZ-19.5> }
object { HexaBenz () translate <PosX-1.96, PosY+2.82, PosZ-17.5> }
object { Le_Decor }
#declare PosX = 0.333;
#declare PosY = 1.10 + (NormClock*0.24);
#declare PosZ = (NormClock-0.5) * 53.27;
object { HexaBenz () translate <PosX, PosY, PosZ> }
object { HexaCone () translate <PosX+1.96, PosY+1.42, PosZ-11.5> }
object { HexaCone () translate <PosX-1.96, PosY+2.42, PosZ-17.5> }
#if ( (clock < 141) )
light_source {
@@ -40,7 +41,7 @@ light_source {
#if ( (clock > 230) & (clock < 300) )
light_source {
<2, 0.30, -2> color White
<2, 0.30, -2> color Green
spotlight
radius .044
falloff 2
@@ -50,11 +51,11 @@ light_source {
#end
camera {
location <-1.76, 1.03, 9.76>
look_at <PosX+0.08, PosY, PosZ>
location <-2.76, 1.53, 8.76>
look_at <PosX+0.09, PosY, PosZ-0.03>
// focal_point <0, 1, 0>
// aperture 0.046
// blur_samples 30
angle 34
angle 32
}

51
remote.pov Normal file
View File

@@ -0,0 +1,51 @@
/*
* H E X A C O N E - R E M O T E
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#declare A = <-SzSol, 16, -8>;
#declare B = <SzSol+4, 18, -11>;
#declare P = Interpolate(A, B, NormClock);
object { HexaCone () rotate y*((6*NormClock)+80) translate P }
#include "dynamic.inc"
object { HexaBenz () rotate y*(clock/9) translate <-9, 3, 7> }
// ---------------------------------------------------------
#declare A = <-15, -1.9, SzSol>;
#declare B = < 23, -0.7, SzSol>;
#declare P = Interpolate(A, B, NormClock);
object { HexaWood translate P }
// ---------------------------------------------------------
object { Le_Decor }
// object { Repere scale 3 translate <SzSol, 2, SzSol> }
#local DistCam = 299;
#local CK = -1.101 + (0.201 * NormClock);
#declare CamX = DistCam * sin(CK);
#declare CamY = 28;
#declare CamZ = DistCam * cos(CK);
camera {
location <CamX, CamY, CamZ>
look_at <0, 0.3, 0>
// focal_point <2, 1, 12>
// aperture 0.046
// blur_samples 30
angle 6.5
}

View File

@@ -1,5 +1,5 @@
/*
* H E X A C O N E
* H E X A C O N E - S C E N E
* nouveau projet Thu Dec 5 11:37:05 AM UTC 2024
*/
@@ -7,40 +7,32 @@
#include "globals.inc"
#include "colors.inc"
#include "metals.inc"
#include "textures.inc"
#declare NormClock = clock / 360.0;
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
#include "dynamic.inc"
// ---------------------------------------------------------
object { Le_Decor }
object { HexaCone ()
rotate < 3, 0, -4> rotate y*17 translate y*1.11 }
#declare CK = 144 + (clock * 0.27);
object { HexaBenz ()
rotate <6, 40, -7> translate <-8, 3, 7> }
#declare Dcam = 3.75;
#declare CamX = Dcam * cos(radians(CK));
#declare CamZ = Dcam * 1.20 * sin(radians(CK));
#declare CK = 96 + (clock * 1);
#declare Dcam = 2.22;
#declare CamX = Dcam * sin(radians(CK));
#declare CamZ = Dcam * 1.20 * cos(radians(CK));
#declare CamZ = CamZ - 0.11;
#declare LatZ = 2.45 + (0.9 * Cos_010(NormClock));
#declare Lat = <0.03, 1.08, 0.17>;
camera {
location <CamX, 1.23, CamZ>
look_at Lat
focal_point Lat
aperture 0.046
blur_samples 30
location <CamX, 1.97, CamZ>
look_at <0.03, LatZ, 0.17>
// focal_point Lat
// aperture 0.046
// blur_samples 30
angle 70
}
/**
light_source { <CamX*1.3, 1.35, 1.2+(CamZ*1.3)>,
rgb <0.47, 0.65, 0.49> }
**/

127
splined.pov Normal file
View File

@@ -0,0 +1,127 @@
/*
* H E X A C O N E - S P L I N E D
*
* new: Sun Oct 19 05:20:49 PM UTC 2025
* https://www.f-lohmueller.de/pov_tut/animate/anim210e.htm
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
object { Le_Decor }
#include "dynamic.inc"
// =======================================================
#declare Spline_1 =
spline {
cubic_spline
-0.2, <-2, 1.0, -2>, // control point
0.0, < 0, 1.3, -2>, // start point
0.2, < 2, 1.0, -2>,
0.4, < 2, 1.5, 0>,
0.6, < 0, 2.2, 0>,
0.8, <-1, 0.8, 2>,
1.0, < 2, 1.0, 2>, // end point
1.2, < 4, 1.0, 2> // control point
}
#local Scaler = <2, 1, 3>;
#declare ViewSpline = object
{
union {
#for (CK, 0.00, 1.00, 0.0017)
sphere { <0,0,0>, 0.022
texture{
pigment {color rgb <0.20, 0.14, 0.14> }
finish {ambient 0.15 diffuse 0.85 phong 0.6 }
}
translate (Scaler * Spline_1(CK))
}
#end // for loop
} // closing union
}
#declare AllTheSpline = object
{
#local K1 = 0.90 - (NormClock * 0.003);
#local K2 = 1.00 - K1;
#local V1 = NormClock * K1;
#local V2 = V1 + K2;
union {
object { ViewSpline }
#declare P1 = Scaler * Spline_1(V1);
#declare P2 = <1, -1.3, 0.1> + (0.95 * Scaler * Spline_1(V2));
sphere {
0, 0.06
texture { B_Texture }
translate P1
}
sphere {
0, 0.06
texture { R_Texture }
translate P2
}
cylinder {
P1, P2, 0.017
texture { G_Texture }
}
finish { ambient 0.15 diffuse 0.65 phong 0.4 }
}
#fopen KP "WS/spline.log" append
#write (KP, clock, " / ", NbFrames, " -> ")
#write (KP, NormClock, " ", K1, " ", K2, " = ", V1, " ", V2, "\n")
#fclose KP
}
// =======================================================
#declare Flag = (mod(clock,120) < 40);
#if ( Flag )
object { AllTheSpline scale 10 translate y*2 }
#debug " FLAG IS YES\n"
#else
#debug " FLAG IS NO\n"
#end
/* P1 and P2 are computed in AllTheSpline object */
#local P1B = (P1 * 10) + <0, 2, 0>;
#local P2B = (P2 * 8) + <0, 2, 0>;
#if ( Flag )
#declare Loc_cam = <87-(12*NormClock), 29-NormClock, 4-(9*exp(NormClock))>;
#declare Lat_tmp = Interpolate(P1, P2, 0.50);
#declare Lat_cam = (Lat_tmp * 10) + <0, 2, 0>;
#declare Ang_cam = 105;
#else
#declare Loc_cam = P1B;
#declare Lat_cam = P2B; // XXX * 0.85;
#declare Ang_cam = 52;
#end
// vstr(N,A,S,L,P)
#debug concat(" LOC: ", vstr(3, Loc_cam, " ", 6, 3), "\n")
#debug concat(" LAT: ", vstr(3, Lat_cam, " ", 6, 3), "\n")
// object { Repere scale 4 translate Lat_cam }
camera {
location Loc_cam
look_at Lat_cam
// focal_point <0.37, 0.0, 0>
// aperture 0.046
// blur_samples 30
angle Ang_cam
}

38
survol.pov Normal file
View File

@@ -0,0 +1,38 @@
/*
* H E X A C O N E - S U R V O L
* nouveau projet du Thu Dec 5 11:37:05 AM UTC 2024
*/
#version 3.7;
#include "globals.inc"
#include "contexte.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
// =======================================================
#include "dynamic.inc"
object { Le_Decor }
object { Repere scale 2 translate y*2 }
// =======================================================
#declare Debut = <-3, 89, 181> ;
#declare Fin = < 2, 91, -10> ;
#declare Pos = sqrt(NormClock+0.04);
#declare PosCam = Interpolate(Debut, Fin, Pos);
#declare LatCam = PosCam + <-1, -20, -(3+(NormClock+11))>;
camera {
location PosCam
look_at LatCam
angle 52
}

View File

@@ -2,10 +2,35 @@
Build system and utilities.
## Make a sequence
Un argument pour construire la séquence entière ou deux pour démarrer au milieu, c'est pratique quand le disjoncteur fait un *beu-beu*. Exemples :
```
$ tools/mkloop.sh survol
$ tools/mkloop.sh survol 133
```
## Linkfarming
C'est le directeur de la production, le grand
[script](./linkfarmer.sh)
d'assemblage des séquences avec générique et intertitres.
Hélas, il n'est pas encore configurable.
## Encoding
Le [script](./encode.sh) n'est qu'un wrapper autour de
la fonction `ff_encodage()` de la lib des tools :
[fonctions.sh](fonctions.sh). Par défaut, il encode
la séquence *essai*.
Le fichier de sortie s'appelle *wip.mp4* dans tous les cas.
## Plot the timing
On peut visualiser le temps de calcul d'une séquence avec la
commande [plot-timing.sh](./plot-timing.sh) qui génère un fichier
PNG. C'est un script basé sur *Awk* et *Gnuplot*.
```
$ tools/plot-timing.sh essai && d timing.png
```

38
tools/build-ega-mp4.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
set -eu
source tools/fonctions.sh
# retour aux vieilles pratiques : EGA 640x350
# c'est une nouveauté du 18 octobre 2025
SEQ="essai"
if [ $# == 1 ] ; then
SEQ=$1
fi
echo "[$SEQ] going EGA" | tee -a WS/log
debut=$(date +%s)
rm -f spool/EGA/*.png
for source in $(ls -1 frames/$SEQ/*.png)
do
bname=$( basename $source )
destname="frames/EGA/$bname"
# echo $source "==>" $destname
convert $source \
-equalize \
-dither none \
-resize '640x350!' \
-remap datas/ega-16colors.png \
$destname
done
ff_encodage "EGA/" "ega-$SEQ.mp4"
fin=$(date +%s)
echo "$SEQ -> ega" $(( fin-debut )) "secondes" >> WS/log

27
tools/build-gif89a.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
set -eu
# retour aux vieilles pratiques : la Gif animée.
# c'est une nouveauté du 18 octobre 2025
SEQ="essai"
if [ $# == 1 ] ; then
SEQ=$1
fi
GIF="t-$SEQ.gif"
echo "seq $SEQ -> $GIF" | tee -a WS/log
convert \
-delay 7 \
-dither none \
-equalize \
-resize '320x240!' \
-remap datas/ega-16colors.png \
frames/$SEQ/00??[369].png \
$GIF

10
tools/config.sh Normal file
View File

@@ -0,0 +1,10 @@
Img_Width=1024
Img_Height=720
# for imagemagick
TEXTCOL="DeepPink"
STROKOL="DarkOliveGreen"
NBFRAMES=450

View File

@@ -2,11 +2,12 @@
set -e ; set -u
# set default value's)
srcdir="essai"
if [ $# == 1 ]
then
srcdir=$1
else
srcdir="essai"
fi
source tools/fonctions.sh

View File

@@ -4,8 +4,14 @@ set -eu
# --------------------------------------------------------------
visual_sleep ()
{
for foo in $(seq 0 $1) ; do
printf '*'
msg="$1"
nbre="$2"
# echo $msg ; echo $nbre
for foo in $(seq 0 $nbre) ; do
local bar=$(( $nbre - $foo ))
printf "======== %-20s %3d\r" "$msg" $bar
sleep 1
done
echo
@@ -32,7 +38,7 @@ ff_encodage()
SRCDIR="$1"
FILMNAME="$2"
echo "Encoding $SRCDIR to $FILMNAME" | tee -a WS/log
# echo "Encoding $SRCDIR to $FILMNAME" | tee -a WS/log
ffmpeg -nostdin \
-y -r 30 -f image2 -i frames/${SRCDIR}/%05d.png \
-metadata artist='--[ tTh ]--' \
@@ -42,7 +48,6 @@ ffmpeg -nostdin \
-tune film \
$FILMNAME
# wc -c $FILMNAME | tee -a WS/log
}
# --------------------------------------------------------------
#

View File

@@ -2,13 +2,13 @@
set -e ; set -u
source tools/config.sh
IDX=0
SPOOL="frames/Spool"
SEQNAME="none"
TMP="WS/tmp.png"
FONTE="Helvetica-Bold"
TEXTCOL="yellow"
STROKOL="darkblue"
source tools/fonctions.sh
@@ -31,14 +31,27 @@ IDX=$(( IDX + 1 ))
linkfarm ()
{
SRC="frames/$1"
echo "linkfarm $SRC" | tee -a WS/log
# echo "linkfarm $SRC" | tee -a WS/log
local INTER="/dev/shm/tmp-intertitre.png"
tools/plot-timing.sh $1
local NBRE=60
local NBRE=42
convert "WS/negatif.png" \
-gravity north \
-font $FONTE \
-pointsize 100 \
-kerning 8 \
-fill $TEXTCOL \
-strokewidth 2 -stroke $STROKOL \
-annotate +0+530 "$1" \
${INTER}
for foo in $(seq 0 $NBRE)
do
copy_a_file "WS/negatif.png"
copy_a_file $INTER
# :
done
for foo in $(seq 0 $NBRE)
@@ -51,9 +64,11 @@ do
copy_a_file $src
done
PIC=$( printf "%s/%05d.png" $SRC $((NBFRAMES-1)) )
# echo "End pic $PIC" >> WS/log
for foo in $(seq 0 $NBRE)
do
copy_a_file "$SRC/00359.png"
copy_a_file "$PIC"
done
}
# -------------------------------------------------------
@@ -61,8 +76,8 @@ faire_le_titre ()
{
echo "faire le titre"
local NBRE=180
local SRC="frames/passage/00059.png"
local NBRE=300
local SRC="frames/hexawood/00199.png"
local GRAY="/dev/shm/tmp-titre.png"
convert -colorspace gray -colors 27 $SRC $GRAY
@@ -73,11 +88,11 @@ do
convert ${GRAY} \
-gravity north \
-font $FONTE \
-pointsize 172 \
-pointsize 140 \
-kerning 6 \
-fill $TEXTCOL \
-strokewidth 3 -stroke $STROKOL \
-annotate +0+${Ypos} "HexaCone" \
-annotate +0+${Ypos} "La famille\nHexaCone" \
${TMP}
# identify ${TMP}
copy_a_file ${TMP}
@@ -88,14 +103,18 @@ echo
# -------------------------------------------------------
faire_la_fin ()
{
local NBRE=180
datetime=$(LANG=fr date -u +"%Y/%m/%d")
local NBRE=160
datetime=$(LANG=fr date -u +"%Y/%m/%d %H:%M")
echo $datetime | tee -a WS/log
local SRC="frames/escadrille/00299.png"
local GRAY="/dev/shm/tmp-titre.png"
convert -colorspace gray -colors 23 $SRC $GRAY
for foo in $(seq 0 $NBRE)
do
Ypos=$(( foo + 20 ))
convert "WS/negatif.png" \
convert ${GRAY} \
-gravity north \
-font $FONTE \
-pointsize 86 \
@@ -107,7 +126,7 @@ do
-pointsize 48 \
-strokewidth 1 \
-gravity south \
-annotate +0+170 "${datetime}" \
-annotate +0+110 "${datetime}" \
${TMP}
# identify ${TMP}
copy_a_file ${TMP}
@@ -121,17 +140,24 @@ figlet "Link farmer"
rm -f frames/Spool/*.png
# tools/plot-timing.sh
faire_le_titre
linkfarm hexabenz
linkfarm hexacone
linkfarm splined
linkfarm hexawood
linkfarm escadrille
linkfarm survol
linkfarm cutoff
linkfarm panoramic
linkfarm topview
linkfarm passage
linkfarm scene
linkfarm carto
linkfarm circular
linkfarm bubblecut
linkfarm orbite
linkfarm hexacone
linkfarm remote
linkfarm essai
tools/plot-timing.sh

View File

@@ -1,21 +1,30 @@
#!/bin/bash
set -e ; set -u
source tools/config.sh
source tools/fonctions.sh
SEQNAME="$1"
NBFRAMES=360
START=0
if [ $# == 2 ]
then
START=$2
fi
echo "Running $0 $SEQNAME" >> WS/log
echo "$0 $SEQNAME from $START" >> WS/log
DIMS="-W1024 -H768"
POVOPT="+q9 -a -d ${DIMS} -WT6"
DIMS="-W$Img_Width -H$Img_Height"
NBFR=" Declare=NbFrames=$NBFRAMES "
echo $NBFR
POVOPT="+q9 +A0.02 -d ${DIMS} ${NBFR} -WT7"
echo $POVOPT ; echo ; sleep 2
TMPIMG=/dev/shm/${SEQNAME}-tmp.png
for frame in $(seq 0 $((NBFRAMES-1)))
echo "TMPIMG" ${TMPIMG} | tee -a WS/log # DEBUG !
INC=1
for frame in $(seq $START $INC $((NBFRAMES-1)))
do
img=$(printf "frames/%s/%05d.png" $SEQNAME $frame)
@@ -25,30 +34,34 @@ do
err=$?
if [ $err != 0 ] ; then
echo "$SEQNAME fail $frame" >> WS/log
mogrify -colorspace gray $img
visual_sleep 12
mogrify -colorspace gray -blur 5x5 $img
visual_sleep "render fail" 12
continue
fi
set -e
txt=$(printf "%s %03d" ${SEQNAME} $frame | tr '0' 'o')
txt=$(printf "%s %03d" ${SEQNAME} $frame | tr '01' 'ol')
# echo $frame $img $txt
convert ${TMPIMG} \
-font Courier-Bold \
-pointsize 18 \
-fill Gray80 \
-gravity south \
-annotate +0+5 "$txt" \
-pointsize 16 \
-kerning 4 \
-fill ${TEXTCOL} \
-gravity north \
-annotate +12+5 "$txt" \
${img}
fin=$(date +%s)
echo
echo ${SEQNAME} $frame $(( fin - debut )) | \
printf "%-12s %5d %5d\n" \
${SEQNAME} $frame $(( fin-debut )) | \
tee -a WS/mp4.timing
echo ; sleep 3
echo ; sleep 2
done
date --utc > WS/$SEQNAME.done
echo
ff_encodage $SEQNAME wip-${SEQNAME}.mp4
echo "+------- build of $SEQNAME done"
echo "build of $SEQNAME done" | tee -a WS/log

View File

@@ -2,6 +2,8 @@
set -ue
source tools/config.sh
TMPFILE="/dev/shm/plot-timing.tmp"
IMAGE="timing.png"
@@ -12,52 +14,65 @@ else
sequence="escadrille"
fi
echo "plot timing $sequence" | tee -a WS/log
# wc WS/mp4.timing | tee -a WS/log
# echo "plot timing $sequence" >> WS/log
grep $sequence WS/mp4.timing | tail -3600 | awk ' \
count=$( grep $sequence WS/mp4.timing | wc -l )
echo "$count samples for $sequence" | tee -a WS/log
grep $sequence WS/mp4.timing | tail -4000 | awk \
-v nbframes=$NBFRAMES \
' \
BEGIN { \
nbrames=360; \
for (foo=0; foo<nbrames; foo++) { \
# print "nb frames = ", nbframes; \
for (foo=0; foo<nbframes; foo++) { \
mini[foo] = 666; \
maxi[foo] = -42; \
count[foo] = 0; \
} \
} \
\
# for every line \
{ \
accu[$2] += $3; \
count[$2]++; \
if (mini[$2] > $3) mini[$2] = $3; \
if (maxi[$2] < $3) maxi[$2] = $3; \
if (maxi[$2] < $3) maxi[$2] = $3;
last[$2] = $3 \
} \
\
END { \
for (foo=0; foo<nbrames; foo++) { \
for (foo=0; foo<nbframes; foo++) { \
if (count[foo] > 0) { \
mean = accu[foo] / count[foo]; \
printf "%4d %4f %4d %4d\n", foo, mean, \
mini[foo], maxi[foo]; \
printf "%4d %4f %4d %4d %4d\n",
foo, mean,
mini[foo], maxi[foo],
last[foo];
} \
} \
} \
' > $TMPFILE
# cat -n $TMPFILE | tail # ; exit
# head $TMPFILE ; exit
gnuplot << __EOC__
set term png size 1024,768
set term png size $Img_Width,$Img_Height
set output "timing.png"
set grid
set xrange [:360]
set xrange [:450]
set yrange [0:]
set title "Séquence '${sequence}'"
set xlabel "numéro de la trame"
set ylabel "temps en secondes"
plot "/dev/shm/plot-timing.tmp" u 1:4 w l lc "#ff0000" t "maximum", \
"/dev/shm/plot-timing.tmp" u 1:3 w l lc "#0000ff" t "minimum", \
"/dev/shm/plot-timing.tmp" u 1:2 w l lc "#000000" t "moyenne",
plot "/dev/shm/plot-timing.tmp" u 1:4 w l \
lc "#ff0000" t "maximum", \
"/dev/shm/plot-timing.tmp" u 1:3 w l \
lc "#0000ff" t "minimum", \
"/dev/shm/plot-timing.tmp" u 1:2 w l \
lc "#00aa00" t "moyenne", \
"/dev/shm/plot-timing.tmp" u 1:5 w l \
lc "#000000" t "last"
__EOC__
convert -negate -colorspace gray -level -33% $IMAGE WS/negatif.png
convert -negate -level -33% $IMAGE WS/negatif.png

View File

@@ -7,39 +7,46 @@
#include "globals.inc"
#include "colors.inc"
#include "metals.inc"
#include "textures.inc"
#include "contexte.inc"
#include "elements.inc"
#include "hexacone.inc"
#include "hexabenz.inc"
#include "hexawood.inc"
#include "trident.inc"
object { Le_Decor }
/* XXX
#declare TrX = 1.84 * sqrt(NormClock);
#declare TrY = 0.90 + (3.5 * Cos_01(NormClock));
#declare TrZ = 9.999 * sqrt(NormClock);
#declare TrH = <TrX, TrY, TrZ>;
#declare RrY = 97 * sqrt(NormClock);
object { HexaCone () rotate y*RrY translate TrH }
*/
object { HexaCone () rotate z*9.1 translate <5, 3, -8> }
object { HexaBenz () translate <-4, 2, -6> }
#include "dynamic.inc"
object { HexaCone () rotate z*9.1 translate <7, 3, -8> }
object { HexaBenz () translate <-9+NormClock, 2, -6> }
/*
* nouveau 11 fevrier 2025
*/
#declare A = <-21, -0.9, (SzSol/2)+9>;
#declare B = < 33, -0.7, (SzSol/2)+7>;
#declare P = Interpolate(A, B, NormClock);
object { HexaWood translate P }
light_source { <-16, 17, -24>, rgb <0.51, 0.65, 0.40> }
// object { Repere scale 2 }
#declare CamY = 19 - (4.5*NormClock);
#declare LatY = -3 + NormClock;
object { Le_Decor }
#declare CamY = 36 - (21.36 * Cos_01(NormClock));
#declare LatY = -4 + ( 2.12 * NormClock);
camera {
location <-3.60, CamY, 21.09>
location <-3.60, CamY, 10.09>
look_at <0, LatY, 0>
focal_point <2, 1, 12>
aperture 0.046
blur_samples 30
angle 45 + (5*NormClock)
// focal_point <2, 1, 12>
// aperture 0.046
// blur_samples 30
angle 45 + (52*NormClock)
}

92
trident.inc Normal file
View File

@@ -0,0 +1,92 @@
#declare Trid_length = 2;
// ------------------------------------------------------
#declare Trid_cone = object
{
cone { 0, R_basecone, y*0.89, 0.0001 }
}
#macro Trid_A_cone ()
difference {
object { Trid_cone }
object { Trid_cone translate -y*0.001 }
#local Foo = rand(Rng1);
#if (Foo < 0.25)
texture { T_Brass_2C }
#elseif (Foo < 0.50)
texture { T_Chrome_2C }
#elseif (Foo < 0.75)
texture { T_Chrome_3A }
#else
texture { GoldDark }
#end // else
#undef Foo
}
#end // macro
// ------------------------------------------------------
#macro Trid_A_head ()
union {
#for (A, 0, 360, 120)
#local E = 0.28;
#local Tx = E * sin(radians(A));
#local Tz = E * cos(radians(A));
object { Trid_A_cone () translate <Tx*2, 0, Tz> }
#end // for
#undef Tx
#undef Tz
torus { E*1.80, 0.02
scale <1, 4, 1> translate y*0.05
texture { T_Chrome_3B } }
}
#end
// ------------------------------------------------------
#macro Trid_A_body ()
#local L = Trid_length / 2;
#local R = 0.095;
merge {
cylinder { <0, -L, 0>, <0, L, 0>, R }
sphere { 0, R scale <1, 6, 1> translate y*L }
#if (rand(Rng1) < 0.50)
texture { T_Chrome_1C }
#else
texture { T_Brass_5E }
#end
}
#undef L
#end // macro
// ------------------------------------------------------
#macro Trid_A_ailette ()
union {
#local E = 0.49;
object { Trid_A_cone () scale 0.85
translate <E, -0.05, 0> }
cylinder { 0, x*E, 0.011
scale <1, 5, 1> texture { T_Silver_3A } }
#undef E
}
#end
// ------------------------------------------------------
#macro Trid_A_tail ()
union {
#for (A, 0, 360, 120)
object { Trid_A_ailette () rotate (A+270)*y }
#end // for
}
#end
// ------------------------------------------------------
// ------------------------------------------------------
#macro Trident_A ()
union {
object { Trid_A_head () translate y*0.85 }
object { Trid_A_body () }
object { Trid_A_tail () translate -y*0.6 }
// object { Repere translate <0.1, 0, 0.1> }
}
#end
// ------------------------------------------------------

174
xperiment.inc Normal file
View File

@@ -0,0 +1,174 @@
/*
* H E X A C O N E - X P E R I M E N T
*
* A cosy place for experimental things (2025/10/27)
*
*/
#macro Wagonnet_0 (Longueur)
object {
/* le corps */
merge {
#local L2 = Longueur / 2;
#local R = 0.25;
cylinder { <L2, 0, 0>, <-L2, 0, 0>, R }
sphere { <0, 0, 0>, R
scale <3, 1, 1>
translate x*L2
}
sphere { <-L2, 0, 0>, R }
/* le kiosque (est-ce un sous-marin ?) */
merge {
#local H2 = L2 * 0.60;
cylinder { <0, 0, 0>, <0, H2, 0>, R/4 }
sphere { <0, 0, 0>, R/4
scale <1, 0.5, 1> translate y*H2
}
scale <2.5, 1, 1> translate x*L2*0.75
}
#local R = rand(Rng1);
#if (R < 0.333)
texture { Soft_Silver }
#elseif (R < 0.666)
texture { GoldDark }
#else
texture { Lightning1 rotate z*90 scale 0.11 }
#end
}
}
#end // macro
// =======================================================
/*
* nouveau du 25 octobre 2025
*/
#macro Une_Arche (Val)
object {
// #debug concat(" Arche, val = ", str(Val, 6, 4), "\n")
merge {
#local Ha = 2;
// mettre une base de la colonne
cylinder { <-1, 0, 0>, <-1, 0.20, 0> Val*1.49 }
cylinder { < 1, 0, 0>, < 1, 0.20, 0> Val*1.41 }
cylinder { <-1, 0, 0>, <-1, Ha, 0>, Val }
cylinder { < 1, 0, 0>, < 1, Ha, 0>, Val }
#if (rand(Rng1) < 0.50)
torus { 0.008, Val*1.08 translate <-1, Ha, 0> }
torus { 0.008, Val*1.08 translate < 1, Ha, 0> }
#else
cylinder { y*(Ha-0.07), y*(Ha+0.01), Val*1.12 translate -x }
cylinder { y*(Ha-0.08), y*(Ha+0.01), Val*1.13 translate x }
#end
intersection {
torus { 1, Val }
box { <-20, -5, 0>, <20, 5, -20> }
rotate <90, 0, 0> translate Ha*y
}
#local R = rand(Rng1);
#if (R < 0.25)
texture { T_Stone40 scale 5+rand(Rng1) }
#elseif (R < 0.50)
texture { T_Stone44 scale 4+rand(Rng1) }
#elseif (R < 0.75)
texture { T_Stone32 scale 5+rand(Rng1) }
#else
texture { T_Stone36 scale 3+rand(Rng1) }
#end
}
}
#end
#macro Les_Arches (EK)
union {
#local E = EK + (rand(Rng1) * 0.50);
object { Une_Arche (0.20) }
object { Une_Arche (0.16) translate -z*E }
object { Une_Arche (0.16) translate z*E }
object { Une_Arche (0.12) translate -z*E*2 }
object { Une_Arche (0.12) translate z*E*2 }
object { Une_Arche (0.08) translate -z*E*3 }
object { Une_Arche (0.08) translate z*E*3 }
}
#end // macro
// ==============================================================
/*
* new Mon Oct 27 04:54:41 PM UTC 2025
*/
#macro Un_Pylone (Type, Hauteur)
#debug " Un pylone ?\n"
#end // macro
// ==============================================================
/*
* nouveau du 12 octobre 2025
*/
#macro Cahute_0 ()
difference {
#local KX = 0.60;
#local KH = 1.80 + rand(Rng1) ;
// #debug concat(" Cahute_0, KH = ", str(KH, 6, 4), "\n")
#local KZ = KX + (0.24*rand(Rng1));
box { <-KX, 0, -KZ>, <KX, KH, KZ> }
#local Mult = 0.97;
#local KX = KX * Mult;
#local KH = KH * Mult;
#local KZ = KZ * Mult;
box { <-KX, 0, -KZ>, <KX, KH, KZ> }
cylinder { <-10, KH*0.70, 0>, <10, KH*0.72, 0>, KX * 0.666 }
#local R = rand(Rng1);
// #debug concat("Random = ", str(R, 6, 4), "\n")
#if ( R < 0.13 )
texture { T_Planete_A }
#elseif ( R < 0.56 )
texture { T_Beton_1 }
#else
texture { T_Beton_2 }
#end // if
rotate y * (277 * rand(Rng1))
}
#end // macro
/* le support des cahutes XXX */
#macro Les_Cahutes ()
union {
#local K = 2.75;
union {
object { Cahute_0 () translate -x * K }
object { Cahute_0 () translate x * K }
object { Cahute_0 () translate -z * K }
object { Cahute_0 () translate z * K }
translate y
}
#local K2 = K + 1.35;
box { <-K2, 0, -K2>, <K2, 1, K2> pigment { Gray30 } }
}
scale 0.5
// rotate -y * (clock*0.33)
#end
// =======================================================
/*
* new: 28 octobre 2025
*/
#declare Ground_Texture = texture
{
pigment { rgb <0.51, 0.58, 0.23> }
normal { dents 0.28 scale 1.5}
finish {
ambient 0 specular 0.5 metallic roughness 0.18
reflection { 0.5 metallic }
}
}
// ==============================================================