forked from Stellarium/stellarium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ch_landscapes_gz.tex
1652 lines (1426 loc) · 78.5 KB
/
ch_landscapes_gz.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%% Part of Stellarium User Guide
%% History:
%% 2016-04-24 Adapted from GZ's course given at SEAC2015 in Rome.
%% 2016-04-25 Added section on making Nadir image for old_style landscape.
%% State: Current for 0.15.
\chapter{Landscapes}
\label{ch:landscapes}
\chapterauthor*{Georg Zotti}
\newcommand{\landscape}[1]{\textsf{\textit{\footnotesize #1}}}
Landscapes are one of the key features that make Stellarium popular.
Originally just used for decoration, since version 10.6 they can be
configured accurately for research and demonstration in ``skyscape
astronomy'', a term which describes the connection of landscape,
the sky above, and the observer~\citep{Brown:JSA2015}. Configured properly, they can act as reliable proxies
of the real landscapes, so that you can take e.g.\ measurements of
sunrise or stellar alignments~\citep{Zotti-Neubauer:SEAC2011}, or prepare your next moonrise
photograph, as though you were on-site.
In this chapter you can find relevant information required to
accurately configure Stellarium landscapes, using panoramas created
from photographs taken on-site, optionally supported by horizon
measurements with a theodolite.
Creating an accurate panorama requires some experience with
photography and image processing. However, great open-source tools
have been developed to help you on the job. If you already know other
tools, you should be able to easily transfer the presented concepts to
those other tools.
While you are editing a landscape, you may want to reload it
frequently. Turn off caching by editing the \file{config.ini}:
\begin{configfile}
[landscape]
cache_size_mb = 0
\end{configfile}
\section{Stellarium Landscapes}
\label{sec:landscapes:StellariumLandscapes}
As of version 0.15, the available landscape types are:
\begin{description}
\item[polygonal] A point list of measured azimuth/altitude pairs, used
to define a sharp horizon polygon. The area below the horizon line
is colored in a single color
(Section~\ref{sec:landscapes:Polygonal}).
\item[spherical] The simple form to configure a photo-based panorama:
A single image is used as texture map for the horizon
(Section~\ref{sec:landscapes:Spherical}).
\item[old\_style] The original photo panorama. This is the most
difficult to configure, but allows highest resolution by using
several texture maps (Section~\ref{sec:landscapes:oldStyle}).
\item[fisheye] Another 1-texture approach, utilizing an image made
with a fisheye lens. This landscape suffers from calibration
uncertainties and can only be recommended for decoration
(Section~\ref{sec:landscapes:Fisheye}).
\end{description}
A landscape consists of a \file{landscape.ini} plus the data files
that are referenced from there, like a coordinate list or the
textures. Those reside in a subdirectory of the \file{landscape}
folder inside the Stellarium program directory, or, for own work, in a
subdirectory of the \file{landscape} folder inside your Stellarium
user data directory (see section~\ref{sec:Directories}).
Let us assume we want to create a landscape for a place called
Rosenburg. The location for the files of our new custom landscape
\landscape{Rosenburg} depends on the operating system (see
\ref{sec:Directories}). Create a new subdirectory, and for maximum
compatibility, use small letters and no spaces:
\noindent
\begin{tabular}{ll}
Windows& \file{C:/Users/YOU/AppData/Roaming/Stellarium/landscapes/rosenburg}\\
Linux&\file{\textasciitilde/.stellarium/landscapes/rosenburg}\\
Mac&\file{\$HOME/Library/Application\ Support/Stellarium/landscapes/rosenburg}\\
\end{tabular}
% \noindent The user data directory is unfortunately hidden by default
% on all systems. (On UNIX-like systems, directories starting with a
% \file{.} are hidden.) To make it accessible in the Windows file
% explorer, open an Explorer window and select \menu{Organize..., Folder and
% search options}. Make sure folders marked as hidden are still
% displayed. Also, deselect the checkbox to hide known file name
% endings.\footnote{This is a very confusing default setting and in fact
% a security risk: Consider you receive some file
% \file{funny.png.exe}. Your explorer displays this as
% \file{funny.png}. You double-click it, expecting to open some image
% browser with a funny image. However, you start some unknown program
% instead, and running this \file{.exe} executable program may turn
% out to be anything but funny!}
%
\subsection{Location information}
\label{sec:landscapes:location}
This optional section in \file{landscape.ini} allows automatic loading
of site coordinates if this option is activated in the program
GUI (see~\ref{sec:gui:view:landscape}). For our purposes we should consider especially the coordinates in
the location section mandatory!
\begin{configfile}
[location]
planet = Earth
country = Austria
name = KGA Rosenburg
latitude = +48d38'3.3"
longitude = +15d38'2.8"
altitude = 266
timezone = Europe/Vienna
light_pollution = 1
atmospheric_extinction_coefficient = 0.2
display_fog = 0
atmospheric_temperature = 10.0
atmospheric_pressure = 1013.0
\end{configfile}
%
Where:
\begin{description}
\item[\var{planet}] Is the English name of the solar system body for
the landscape.
\item[\var{latitude}] Is the latitude of site of the landscape in
degrees, minutes and seconds. Positive values represent North of the
equator, negative values South of the equator.
\item[\var{longitude}] Is the longitude of site of the
landscape. Positive values represent East of the Greenwich Meridian
on Earth (or equivalent on other bodies), Negative values represent
Western longitude.
\item[\var{altitude}] Is the altitude of the site of the landscape in meters.
\item[\var{country}] (optional) Name of the country the location is in.
\item[\var{state}] (optional) Name of the state the location is in.
\item[\var{timezone}] (optional) IANA Timezone code \newFeature{v0.18.3}
\item[\var{name}] (optional) Name of the location. This may contain
spaces, but keep it short to have it fully visible in the
selection box.
\end{description}
%
Since v0.11.0, there are a few more optional parameters that can be
loaded if the according switch is active in the landscape selection
panel. If they are missing, the parameters do not change to defaults.
\begin{description}
\item[\var{light\_pollution}] (optional) Light pollution of the site,
given on the Bortle Scale (1: none \ldots 9: metropolitan; see
Appendix \ref{ch:BortleScale}). If negative or absent, no change
will be made.
\item[\var{atmospheric\_extinction\_coefficient}] (optional, no change
if absent.) Extinction coefficient (mag/airmass) for this site.
\item[\var{atmospheric\_temperature}] (optional, no change if absent.)
Surface air temperature (Degrees Celsius). Used for refraction. Set
to -1000 to explicitly declare "no change".
\item[\var{atmospheric\_pressure}] (optional, no change if absent.)
Surface air pressure (mbar; would be 1013 for "normal" sea-level
conditions). Used for refraction. Set to -2 to declare "no change",
or -1 to compute from altitude.
\item[\var{display\_fog}] (optional, -1/0/1, default=-1) You may want
to preconfigure setting 0 for a landscape on the Moon. Set -1 to
declare "no change".
\end{description}
\subsection{Polygonal landscape}
\label{sec:landscapes:Polygonal}
This landscape type has been added only recently (since 0.13) to allow
the use of measured horizons. Users of \program{Cartes du
Ciel}\footnote{SkyChart / Cartes du Ciel planetarium:
\url{http://www.ap-i.net/skychart/en/start}} will be happy to hear
that the format of the list of measurements is compatible.
This is the technically simplest of the landscapes, but may be used to
describe accurately measured horizon profiles. The file that encodes
horizon altitudes can also be used in all other landscape types. If
present there, it will be used to define object visibility (instead of
the opacity of the landscape photo textures) and, if
\var{horizon\_line\_color} is defined, will be plotted.
There is a small caveat: Sometimes, there may appear vertical lines
from some corners towards the zenith or the mathematical horizon,
e.g.\ if there is a vertex including azimuth 0 or 180. If this
irritates you, just offset this azimuth minimally (e.g., 180.00001).
The \file{landscape.ini} file for a polygonal type landscape looks
like this (this example is based on the \landscape{Geneve} landscape
which was borrowed from \program{Cartes du Ciel} and comes with Stellarium):
\begin{configfile}
[landscape]
name = Geneve
type = polygonal
author = Georg Zotti; Horizon definition by Patrick Chevalley
description = Horizon line of Geneve.
Demonstrates compatibility with
horizon descriptions from Cartes du Ciel.
polygonal_horizon_list = horizon_Geneve.txt
polygonal_angle_rotatez = 0
ground_color = .15,.45,.45
horizon_line_color = .75,.45,.45
\end{configfile}
%
Where:
\begin{description}
\item[\var{name}] appears in the landscape tab of the configuration window.
\item[\var{type}] identifies the method used for this landscape. \var{polygonal} in this case.
\item[\var{author}] lists the author(s) responsible for images and composition.
\item[\var{description}] gives a short description visible in the
selection panel. The text can be superseded by optional
\file{description.<lang>.utf8} files.
\item[\var{polygonal\_horizon\_list}] is the name of the horizon data file for this landscape.
\item[\var{polygonal\_horizon\_list\_mode}] (optional) the two first
columns in the list are numbers: azimuth and altitude or zenith
distance, in either degrees or radians or gradians(gon). The value
must be one of \var{azDeg\_altDeg}, \var{azDeg\_zdDeg}, \var{azRad\_altRad},
\var{azRad\_zdRad}, \var{azGrad\_altGrad}, \var{azGrad\_zdGrad}. Default:
\var{azDeg\_altDeg}
\item[\var{polygonal\_angle\_rotatez}] (optional, default=0) Angle
(degrees) to adjust azimuth. This may be used to apply a (usually)
small offset rotation, e.g. when you have measured the horizon in a
grid-based coordinate system like UTM and have to compensate for the
meridian convergence.
\item[\var{ground\_color}] (optional, default=\var{0,0,0}, i.e.,
black) Color for the area below the horizon line. Each R,G,B
component is a float within 0..1.
\item[\var{horizon\_line\_color}] (optional, default: invisible) used
to draw a polygonal horizon line. Each R,G,B component is a float
within 0..1.
\item[\var{minimal\_brightness}] (optional) Some minimum brightness to
keep landscape visible. Default=-1, i.e., use
\var{minimal\_brightness} from the \var{[landscape]} section in the
global \file{config.ini}.
\item[\var{minimal\_altitude}] (optional, default=-2) Some sky
elements, e.g.\ stars, are not drawn below this altitude to increase
performance. Under certain circumstances you may want to specify
something else here. (since v0.14.0)
\item[\var{polygonal\_horizon\_inverted}] (optional, default=false) In
rare cases like horizon lines for high mountain peaks with many
negative horizon values this should be set to true. (since v0.15.0)
\end{description}
\subsubsection{Artificial Polygonal Panoramas}
The online service
\program{HeyWhatsThat}\footnote{\url{https://www.heywhatsthat.com/}}
allows an SRTM-based analysis of the viewshed (the visible topographic
area) for an observing location which also gives names for the
mountain peaks visible at a given location. A data download option
provides users inclined to do some programming with the necessary data
to create a polygonal landscape for Stellarium.
In addition, \name{Brian Doyle} has created another online service,
\program{horiZONE}\footnote{\url{https://briandoylegit.github.io/horiZONE/}},
which does just this work for you.
\begin{enumerate}
\item When your viewshed analysis has been created in
\program{HeyWhatsThat}, enter the ``all panoramas'' tab, and on the
map click the marker associated with the panorama. Select ``make
public''.
\item Then, take the landscape key given to you by \program{HeyWhatsThat}\footnote{
in the line \texttt{https://www.heywhatsthat.com/?view=N15ABXY}}, add
a few lines of description that will become visible in Stellarium, and you
receive a ZIP file ready for installation in Stellarium (see section
\ref{sec:gui:view:landscape}).
\end{enumerate}
\subsection{Spherical landscape}
\label{sec:landscapes:Spherical}
This method uses a more usual type of panorama -- the kind which is
produced directly from software such as \program{autostitch} or
\program{Hugin}\footnote{\url{http://hugin.sourceforge.net/}}. The
\landscape{Moon} landscape which comes with Stellarium provides a
minimal example of a \file{landscape.ini} file for a spherical type
landscape:
\begin{configfile}
[landscape]
name = Moon
type = spherical
maptex = apollo17.png
\end{configfile}
A more elaborate example is found with the \landscape{Grossmugl} landscape:
\begin{configfile}
[landscape]
name = Grossmugl
type = spherical
author = Guenther Wuchterl, Kuffner-Sternwarte.at;
Lightscape: Georg Zotti
description = Field near Leeberg, Grossmugl (Riesentumulus),
Austria - Primary Observing Spot of the Grossmugl
Starlight Oasis - http://starlightoasis.org
maptex = grossmugl_leeberg_crop11.25.png
maptex_top=11.25
maptex_fog = grossmugl_leeberg_fog_crop22.5.png
maptex_fog_top = 22.5
maptex_fog_bottom = -22.5
maptex_illum = grossmugl_leeberg_illum_crop0.png
maptex_illum_bottom = 0
angle_rotatez=-89.1
minimal_brightness = 0.0075
polygonal_horizon_list = horizon_grossmugl.txt
polygonal_angle_rotatez=0
horizon_line_color = .75,.45,.45
minimal_altitude = -1
\end{configfile}
Where:
\begin{description}
\item[\var{name}] appears in the landscape tab of the configuration window. This name may be translated.
\item[\var{type}] identifies the method used for this
landscape. \var{spherical} in this case.
\item[\var{author}] lists the author(s) responsible for images and
composition.
\item[\var{description}] gives a short description visible in the
selection panel. The text will be superseded by optional
\file{description.<lang>.utf8} files.
\item[\var{maptex}] is the name of the image file for this landscape.
\item[\var{maptex\_top}] (optional; default=90) is the altitude angle
of the top edge.
\item[\var{maptex\_bottom}] (optional; default=-90) is the altitude
angle of the bottom edge. Usually you will not require this, or else
there will be a hole at your feet, unless you also specify
\item[\var{bottom\_cap\_color}] (optional;
default=\texttt{-1.0,0.0,0.0} to signal ``no color''). If set, this
is used to close any hole in the nadir area (if \var{maptex\_bottom}
higher than -90). \newFeature{v0.19.0}
\item[\var{maptex\_fog}] (optional; default: no fog) is the name of
the fog image file for this landscape.
\item[\var{maptex\_fog\_top}] (optional; default=90) is the altitude
angle of the top edge of the fog texture. Useful to crop away parts
of the image to conserve texture memory.
\item[\var{maptex\_fog\_bottom}] (optional; default=-90) is the
altitude angle of the bottom edge.
\item[\var{maptex\_illum}] (optional; default: no illumination layer)
is the name of the nocturnal illumination/light pollution image file
for this landscape.
\item[\var{maptex\_illum\_top}] (optional; default=90) is the altitude
angle of the top edge, if you have light pollution only close to the
horizon.
\item[\var{maptex\_illum\_bottom}] (optional; default=-90) is the
altitude angle of the bottom edge.
\item[\var{angle\_rotatez}] (optional, default=0) Angle (degrees) to
adjust azimuth. If 0, the left/right edge is due east.
\item[\var{tesselate\_rows}] (optional, default=20) This is the number
of rows for the maptex. If straight vertical edges in your landscape
appear broken, try increasing this value, but higher values require
more computing power. Fog and illumination textures will have a
similar vertical resolution.
\item[\var{tesselate\_cols}] (optional, default=40) If straight
horizontal edges in your landscape appear broken, try increasing.
\item[\var{polygonal\_horizon\_list}] (optional) is the name of the
(measured) horizon data file for this landscape. Can be used to
define the exact position of the horizon. If missing, the texture
can be queried for horizon transparency (for accurate object
rising/setting times)
\item[\var{polygonal\_horizon\_list\_mode}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{polygonal\_angle\_rotatez}] (optional, default=0) see \ref{sec:landscapes:Polygonal}
\item[\var{horizon\_line\_color}] see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_brightness}] see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_altitude}] (optional, default=-2) \newFeature{v0.14.0} Some sky
elements, e.g.\ stars, are not drawn below this altitude for
efficiency. Under certain circumstances (e.g.\ for space station
panoramas where you may have sky below your feet, or for deep
valleys/high mountains, you may want to specify something else
here.
\end{description}
%
To save texture memory, %since v0.13.0
you can trim away the transparent
sky and define the angle \var{maptex\_top}. Likewise,
\var{fogtex\_top}, \var{fogtex\_bottom}, \var{maptex\_illum\_top} and
\var{maptex\_illum\_bottom}. You should then stretch the texture to a
full power of 2 for maximum compatibility, like $4096\times1024$ (but note that some hardware is
even limited to 2048 pixels). The easiest method to create perfectly
aligned fog and illumination layers is with an image editor that
supports layers like the \program{GIMP} or \program{Photoshop}. Fog
and Light images should have black background.
\subsection{High resolution (``Old Style'') landscape}
\label{sec:landscapes:oldStyle}
The \var{old\_style} or multiple image method works by having the
360\degree panorama of the horizon (without wasting too much texture
memory with the sky) split into a number of reasonably small
\emph{side textures}, and a separate \emph{ground texture}. This has
the advantage over the single-image method that the detail level of
the horizon can be increased without ending up with a single very
large image file, so this is usable for either very high-resolution
panoramas or for older hardware with limited capabilities. The ground
texture can be a different resolution than the side textures. Memory
usage may be more efficient because there are no unused texture parts
like the corners of the texture file in the fish-eye method. It is
even possible to repeat the horizon several times (for purely
decorative purpose). The side textures are mapped onto curved
(spherical ring or cylinder) walls
(Fig.~\ref{fig:landscapes:oldStyle}).
\begin{figure}[tb]
\centering
\includegraphics[width=10cm]{Rosenburg-Demo.png}
\caption{Old\_style landscape: eight parts delivering a
high-resolution panorama. The bottom (ground) texture, drawn on a flat
plane, is not shown here.}
\label{fig:landscapes:oldStyle}
\end{figure}
On the negative side, it is more difficult to create this type of
landscape -- merging the ground texture with the side textures can
prove tricky. (\program{Hugin} can be used to create also this file,
though. And on the other hand, you can replace this by something else
like a site map.) The contents of the \file{landscape.ini} file for
this landscape type is also somewhat more complicated than for other
landscape types. Here is the \file{landscape.ini} file which describes
our \landscape{Rosenburg} landscape\footnote{the \var{groundtex}
\file{grassground.png} mentioned here has been taken from the
\landscape{Guereins} landscape.}:
\begin{configfile}
[landscape]
name = KGA Rosenburg
author = Georg Zotti, VIAS/ASTROSIM
description = KGA Rosenburg
type = old_style
nbsidetex = 8
tex0 = Horiz-0.png
tex1 = Horiz-1.png
tex2 = Horiz-2.png
tex3 = Horiz-3.png
tex4 = Horiz-4.png
tex5 = Horiz-5.png
tex6 = Horiz-6.png
tex7 = Horiz-7.png
nbside = 8
side0 = tex0:0:0:1:1
side1 = tex1:0:0:1:1
side2 = tex2:0:0:1:1
side3 = tex3:0:0:1:1
side4 = tex4:0:0:1:1
side5 = tex5:0:0:1:1
side6 = tex6:0:0:1:1
side7 = tex7:0:0:1:1
groundtex = grassground.png
ground = groundtex:0:0:1:1
nb_decor_repeat = 1
decor_alt_angle = 82
decor_angle_shift = -62
; Rotatez deviates from -90 by the Meridian Convergence.
; The original landscape pano is grid-aligned,
; not north-aligned!
decor_angle_rotatez = -90.525837223
ground_angle_shift = -62
ground_angle_rotatez = 44.474162777
draw_ground_first = 1
fogtex = fog.png
fog_alt_angle = 20
fog_angle_shift = -3
fog = fogtex:0:0:1:1
calibrated = true
[location]
planet = Earth
latitude = +48d38'3.3"
longitude = +15d38'2.8"
altitude = 266
light_pollution = 1
atmospheric_extinction_coefficient = 0.2
display_fog = 0
atmospheric_temperature = 10.0
atmospheric_pressure = 1013.0
\end{configfile}
%
Where:
\begin{description}
\item[\var{name}] is the name that will appear in the landscape tab of the configuration window for this landscape
\item[\var{type}] should be \var{old\_style} for the multiple image method.
\item[\var{author}] lists the author(s) responsible for images and composition.
\item[\var{description}] gives a short description visible in the
selection panel. The text will be superseded by optional
\file{description.<lang>.utf8} files.
\item[\var{nbsidetex}] is the number of side textures for the landscape.
\item[\var{tex0 ... tex<nbsidetex-1>}] are the side texture file
names. These should exist in the \file{textures / landscapes /
landscape} directory in PNG format.
\item[\var{light0 ... light<nbsidetex-1>}] are optional textures\newFeature{v0.13.1}. If
they exist, they are used as overlays on top of the respective
\var{tex<...>} files and represent nocturnal illumination,
e.g. street lamps, lit windows, red dots on towers, sky glow by city
light pollution, \ldots Empty (black) panels can be omitted. They
are rendered exactly over the \var{tex<...>} files even when the PNG
files have different size. If you need your light pollution higher in
the sky, you must use a spherical or fisheye
landscape.
\item[\var{nbside}] is the number of side textures
\item[\var{side0 \ldots side<nbside-1>}] are the descriptions of how
the side textures should be arranged in the program. Each
description contains five fields separated by colon characters
(\var{:}). The first field is the ID of the texture
(e.g. \var{tex0}), the remaining fields are the texture coordinates
(\var{x0:y0:x1:y1}) used to place the texture in the scene. If you
want to use all of the image, this will just be \var{0:0:1:1}.
\item[\var{groundtex}] is the name of the ground texture file. (This
could also be a diagram e.g. indicating the mountain peaks!)
%\item[\var{ground}] [NO LONGER USED] used to be the description of the projection of the ground texture in the scene.
\item[\var{fogtex}] is the name of the texture file for fog in this
landscape. Fog is mapped onto a simple cylinder.\footnote{In very wide-angle
views, the fog cylinder may become visible in the corners.} Note that for this
landscape, accurate overlay of fog and landscape is only guaranteed if
\var{calibrated=true} and \var{tan\_mode=true}.
%\item[\var{fog}] [NO LONGER USED] used to be the description of the projection of the fog texture in the scene.
\item[\var{nb\_decor\_repeat}] is the number of times to repeat the
side textures in the 360 panorama. (Useful photo panoramas should
have \var{1} here)
\item[\var{decor\_alt\_angle}] (degrees) is the vertical angular
extent of the textures (i.e. how many degrees of the full altitude
range they span).
\item[\var{decor\_angle\_shift}] (degrees) vertical angular offset of
the scenery textures, at which height the bottom line of the side
textures is placed.
\item[\var{decor\_angle\_rotatez}] (degrees) angular rotation of the
panorama around the vertical axis. This is handy for rotating the
landscape so North is in the correct direction. Note that for
historical reasons, a landscape with this value set to zero degrees
has its leftmost edge pointing towards east.
\item[\var{ground\_angle\_shift}] (degrees) vertical angular offset of
the ground texture, at which height the ground texture is placed.
Values above -10 are not recommended for non-photographic content
(e.g., a map) due to high distortion.
\item[\var{ground\_angle\_rotatez}] (degrees) angular rotation of the
ground texture around the vertical axis. When the sides are rotated,
the ground texture may need to be rotated as well to match up with
the sides. If 0, east is up. if North is up in your image, set this to
90. Note that adjustments of \var{decor\_angle\_rotatez} require
adjustments of this angle in the opposite direction!
\item[\var{fog\_alt\_angle}] (degrees) vertical angular size of the
fog cylinder - how fog looks. Accurate vertical size requires
\var{calibrated=true}.
\item[\var{fog\_angle\_shift}] (degrees) vertical angular offset of
the fog texture - at what height is it drawn. Accurate vertical
placement requires \var{calibrated=true}.
\item[\var{draw\_ground\_first}] if \var{true} or
\var{1}\footnote{Boolean values \var{true|false} preferred since
V0.19.3, but \var{0|1} are still accepted.} the ground is drawn in
front of the scenery, i.e. the side textures will overlap over the
ground texture if \var{ground\_angle\_shift} >
\var{decor\_angle\_shift}.
\item[\var{calibrated}] (optional).\newFeature{v0.10.6} Only if true,
\var{decor\_alt\_angle} etc. really work as documented above. The
(buggy) old code was left to work with the landscapes already
existing. Note that with ``uncalibrated'' landscapes, sunrise
computations and similar functionality which requires an accurate
horizon line will not work.
\item[\var{tan\_mode}] (optional, not used in this file). If true, the
panorama image must be in in cylindrical, not equirectangular
projection. Finding \var{decor\_alt\_angle} and
\var{decor\_angle\_shift} may be a bit more difficult with this, but
now (v0.13.0) works also with calibrated. A fog image created as
overlay on the pano will be perfectly placed.
\item[\var{polygonal\_horizon\_list}] (optional) see \ref{sec:landscapes:Spherical}
\item[\var{polygonal\_horizon\_list\_mode}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{polygonal\_angle\_rotatez}] (optional, default=0) see \ref{sec:landscapes:Polygonal}
\item[\var{horizon\_line\_color}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_brightness}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_altitude}] (optional) see \ref{sec:landscapes:Polygonal}
\end{description}
\subsection{Fisheye landscape}
\label{sec:landscapes:Fisheye}
The \landscape{Trees} landscape that is provided with Stellarium is an
example of the single fish-eye method, and provides a good
illustration. The centre of the image is the spot directly above the
observer (the zenith). The point below the observer (the nadir)
becomes a circle that just touches the edges of the image. The
remaining areas of the image (the corners outside the circle) are not
used.
\begin{figure}[t]
\centering\includegraphics[width=\textwidth]{trees_512.png}
\caption{Texture for the \landscape{Trees} Fisheye landscape.}
\label{fig:landscapes:Fisheye}
\end{figure}
The image file (Fig.~\ref{fig:landscapes:Fisheye}) should be saved in
PNG format with alpha transparency. Whereever the image is transparent
Stellarium will render the sky.
The \file{landscape.ini} file for a fish-eye type landscape looks like
this (this example is based on the \landscape{Trees} landscape which
comes with Stellarium):
\begin{configfile}
[landscape]
name = Trees
type = fisheye
author = Robert Spearman. Light pollution image: Georg Zotti
description = Trees in Greenlake Park, Seattle
maptex = trees_512.png
maptex_illum = trees_illum_512.png
maptex_fog = trees_fog_512.png
texturefov = 210
angle_rotatez = 17
tesselate_rows = 28
tesselate_cols = 60
\end{configfile}
Where:
\begin{description}
\item[\var{name}] appears in the landscape tab of the configuration window.
\item[\var{type}] identifies the method used for this landscape. \var{fisheye} in this case.
\item[\var{author}] lists the author(s) responsible for images and composition.
\item[\var{description}] gives a short description visible in the
selection panel. The text will be superseded by optional
\file{description.<lang>.utf8} files.
\item[\var{maptex}] is the name of the image file for this landscape.
\item[\var{maptex\_fog}] (optional) is the name of the fog image file for this landscape.
\item[\var{maptex\_illum}] (optional) is the name of the nocturnal
illumination/light pollution image file for this landscape.
\item[\var{texturefov}] is the field of view that the image covers in degrees.
\item[\var{angle\_rotatez}] (optional) Angle (degrees) to adjust azimuth.
\item[\var{tesselate\_rows}] (optional, default=20) If straight edges
in your landscape appear broken, try increasing.
\item[\var{tesselate\_cols}] (optional, default=40) If straight edges
in your landscape appear broken, try increasing.
\item[\var{polygonal\_horizon\_list}] (optional) see \ref{sec:landscapes:Spherical}
\item[\var{polygonal\_horizon\_list\_mode}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{polygonal\_angle\_rotatez}] (optional, default=0) see \ref{sec:landscapes:Polygonal}
\item[\var{horizon\_line\_color}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_brightness}] (optional) see \ref{sec:landscapes:Polygonal}
\item[\var{minimal\_altitude}] (optional) see \ref{sec:landscapes:Polygonal}
\end{description}
\subsection{Description}
\label{sec:landscapes:Description}
The short \var{description} entry in \file{landscape.ini} will be
replaced by the contents of an optional file
\file{description.<LANG>.utf8}. \file{<LANG>} is the ISO~639-1
language code, or its extension which contains language and country
code, like \file{pt\_BR} for Brazilian Portuguese. The long
description requires the file \file{description.en.utf8}, this is
\texttt{en=english} text with optional HTML tags for sections, tables,
etc. You can also have embedded images in the HTML (Views of sacred
landscapes, other informative images, \ldots?), just make them PNG
format please. The length of the description texts is not limited, you
have room for a good description, links to external resources,
whatever seems suitable.
If you can provide other languages supported by Stellarium, you can
provide translations yourself, else Stellarium translators \emph{may}
translate the English version for you. (It may take years though.) The file
ending \file{.utf8} indicates that for special characters like ÄÖÜßáé
you should use UTF8 encoding. If you write only English/ASCII, this may not
be relevant.
\subsection{Gazetteer}
\label{sec:landscapes:Gazetteer}
\newFeature{0.14}
An optional feature for landscapes is a gazetteer function, i.e., labels for
landscape features. The \landscape{Grossmugl} landscape demonstrates
an example and should be self-explanatory. This is again multilingual,
so the files are called \file{gazetteer.<LANG>.utf8}.
\begin{configfileScr}
# demo gazetteer for Grossmugl landscape.
# Can be used to better describe the landscape,
# i.e. show labels on landscape features.
# Fields must be separated by vertical line,
# label must not have such a vertical line.
# Comments have this hash mark in first column.
# coordinates in degrees from true North.
# line towards zenith draws a single line strictly upward.
# label is centered on line endpoint.
# Azimuth | Altitude | degrees | azimuth | label
# | | towards zenith | shift |
113.66 | 5.5 | 4 | -6 | Leeberg
35 | 1.5 | 2.5 | 0 | Grossmugl
335 | 2 | 2 | 0 | Steinabrunn
305 | 2 | 1 | 0 | Ringendorf
180 | 2 | 2 | 0 | Vienna (30km)
135 | 2 | 0.5 | 0 | Wind power plant Strasshof
\end{configfileScr}
\subsection{Packing and Publishing}
\label{sec:landscapes:Packing}
You likely have developed your landscape already in your own Stellarium user data directory, but when you are happy with your work,
you may consider sharing it with other users.
For easy distribution and installation via Stellarium's GUI (see section~\ref{sec:gui:view:landscape}), you should create a ZIP file.
This must contain \file{landscape.ini} and any textures and auxiliary files described above (\file{description.en.utf8}, \file{gazetteer.en.utf8}
and their translations, horizon files, images for the description \ldots) used by your landscape.
If you want to release the landscape for download, consider adding a \file{README.txt} clarifying license and usage conditions.
It does not matter whether the ZIP file contains a directory name inside the ZIP. If not, the directory name (ID) of the
landscape will be taken from the ZIP file name.
%\newpage
\section{Creating Panorama Photographs for Stellarium}
\label{sec:landscapes:PanoramaPhotography}
\subsection{Panorama Photography}
\label{sec:landscapes:PanoramaPhotography:Photography}
Traditional film-based panorama photography required dedicated cameras with curved
film holders and specialized lenses
(Figure~\ref{fig:landscapes:panoCam}).
\begin{figure}[bp]
\centering
\includegraphics[width=9cm]{Horizon202.jpg}
\caption{Zenit ``Horizon 202'' panorama camera with rotating lens for
35mm film. \footnotesize{(Source: Wikipedia, ``Horizon202'' by
BillC - Own Work. Licensed under CC BY-SA 3.0 via Wikimedia Commons -
\protect\url{https://commons.wikimedia.org/wiki/File:Horizon202.jpg})}}
\label{fig:landscapes:panoCam}
\end{figure}
\begin{figure}[tbp]
\centering
\includegraphics[width=7cm]{Rodeon_vr_head_01.jpg}
\caption{Automated panorama head. \footnotesize{(Source: Wikipedia \protect\url{https://commons.wikimedia.org/wiki/File:Rodeon_vr_head_01.jpg})}}
\label{fig:landscapes:panoHead}
\end{figure}
Digital photography has brought a revolution also in this field, and it has
become quite easy to create panoramas simply by taking a series of
photographs with a regular camera on the same spot and combining them
with dedicated software.
A complete panorama photo visually encloses the observer like the
mental image that astronomers have been using for millennia: the
celestial sphere. If we want to document the view, say, in a big hall
like a church, optimal results will be gained with a camera on a
tripod with a specialized panorama head (Figure~\ref{fig:landscapes:panoHead}) which assures the camera
rotates around the \emph{entrance pupil}\footnote{In many references
you will find ``Nodal Point'' mentioned here. But see these:
\url{http://en.wikipedia.org/wiki/Cardinal_point_\%28optics\%29\#Nodal_points},
\url{http://web.archive.org/web/20060513074042/http://doug.kerr.home.att.net/pumpkin/Pivot_Point.pdf},
\url{http://www.janrik.net/PanoPostings/NoParallaxPoint/TheoryOfTheNoParallaxPoint.pdf}
} of the lens in order to avoid errors by the parallax shift observed
on photographs taken on adjacent but separate positions.
Often however, both the upper half of the observer's environment (the
sky) and the ground the photographer is standing on, are regarded of
lesser importance, and only a series of laterally adjacent photographs
is taken and combined into a cylindrical or spherical ring that shows
the landscape horizon, i.e., where ground and sky meet. If the
closest object of interest is farther away that a few metres,
requirements on parallax avoidance are far less critical, and the author
has taken lots of landscape panoramas with a camera on the usual
tripod screw, and even more entirely without a tripod. However, any visible errors
that are caused by a shifted camera will require more effort in
postprocessing.
When you have no tripod, note that \emph{you must not rotate the
camera on your outstretched arm!} Rather, the camera's entrance
pupil must be rotated, so you should appear to dance around the
camera!
The images should match in brightness and white balance. If you can
shoot in RAW, do so to be able to change white balance later. If the
camera can only create JPG, ensure you have set the camera to a suitable white balance
before taking the photos and not to ``auto'', because this may find different settings and
thus give colour mismatches. Exposure brightness differences can be
largely removed during stitching, but good, well-exposed original
shots always give better results.
As a general recommendation, the images of a panorama should be taken
from left to right, else please accordingly invert some of the
instructions given below.
There are several panorama making programs. Often they are included in
the software that comes with a digital camera and allow the creation
of simple panoramas. Other software titles are available for
purchase. However, there is one cost-free open-source program
that does everything we need for our task, and much more:
\subsection{Hugin Panorama Software}
\label{sec:landscapes:Hugin}
\program{Hugin}\footnote{\url{http://hugin.sourceforge.net/}}, named
after one of the ravens that sits on Odin's shoulder and tells him
about the world, is a user-friendly catch-all package with graphical
user interface that allows creating panoramas with a single
application. Actually, \program{Hugin} is a GUI application which
calls several specialized sub-programs with fitting parameters. The
instructions are based on \program{Hugin V2014.0} and
\program{2015.0}.
Typically digital images come in JPG format with information about
camera, lens, and settings stored in invisible metadata in the EXIF
format. When \program{Hugin} reads such images, it can automatically derive
focal length, field of view, and exposure differences (exposure time,
aperture, color balance) to create panoramas as easily as
possible.
After starting \program{Hugin} for the first time, select \menu{Interface > Expert} to release several
options not visible to ``beginners''. In the Preferences dialog
(\menu{Files > Preferences}), edit number of CPU to match the number of
cores in your computer and allow parallel processing. E.g., if you
have an Intel Core-i7, you usually can set up to 8 cores (4 cores with
hyperthreading; but maybe leave one core for your other tasks while
you wait for a processing job?). If your PC is equipped with a
modern programmable graphics card, you can enable its use in the \menu{Programs} tab
with activating ``Use GPU for remapping''.
After that, we are ready for creating our panoramas.
\subsection{Regular creation of panoramas}
\label{sec:landscapes:Hugin:regular}
The graphical user interface (GUI) consists of a main menu, symbols, and 4 tabs. We start on the tab Photos.
\begin{itemize}
\item \button{Add images\ldots} Opens a file browser. Select the images which you
want to stitch. Usually, lens data (focal length, horizontal field of view\footnote{%
contrary to Stellarium, field of view (FoV) in \program{Hugin} means the \emph{horizontal} extent in degrees.},
\ldots) are read from the EXIF data. If those are not available
(e.g. cheap cameras, images scanned from film), you can enter those
data on loading or later. The images are now listed in the file
list, and you can edit image parameters by marking one or more, and
then choosing from the context menu which you get from pressing the
right mouse button. In case you have used different lenses (or
inadvertently used different focal lengths of a zoom lens), you can
assign separate lenses to the images.
Caveat: If you have resized the images, or produced copied on your
RAW converter with non-native resolution, the horizontal Field of View (FoV) in
\program{Hugin} may be misidentified. You must edit lens parameters and fill
in the field of view from a full-size image. Else the first round of
optimisation will run into unsolvable trouble.
\item Select one image as \emph{position anchor} (usually the center
image), and one as \emph{exposure anchor} (this can be the same
image). For our purpose, \emph{the anchor image should face
south}.
%In the concrete example of the Rosenburg data set, the
%Rosenburg Castle is our landmark to the south, so any image that has
%the castle close to center is a good choice for position anchor.
\item Next, we must find common feature points. The next field below
provides the required settings. It is recommended to use the \program{CPFind}
command. To avoid finding control points in (moving) clouds, select
setting \button{Hugin's CPFind + Celeste}\footnote{If you forget this,
you can remove cloud points by calling \program{Celeste} in the control
point editor later}. Then press \button{Create control points}. This
opens a dialog box in which you can see output of the selected
feature point extractor. It should finish with a box telling you the
number of identified points. In rare cases some images cannot be
linked to others, you will have to manually add or edit feature
points in those cases.
\item Now it's time to start optimisations. On the \menu{Geometric
Optimimisation} combo, start with the button \button{Positions, incremental from
anchor}, and press \button{Calculate}. Moments later, a first rough
match is available for inspection.
\item First open the Preview window (press \keys{Ctrl+P} or click the blue icon). Assumed
your images cover the full horizon, the window shows an
equirectangular area (360 degrees along the horizon and 180 degrees
from zenith to nadir). The anchor image should be close to the image
center, and the other images should be already well-aligned to both
sides. You can set the exact center point by clicking it in the
image. If the horizon appears badly warped, use the right mouse key and
click on the horizon roughly near $-90$ or $+90$ degrees (halfway to
the left or right).
\item Open the OpenGL preview window (press \keys{Ctrl+Shift+P} or click the blue icon
with GL inside). This panel provides several important views:
\begin{itemize}
\item The \menu{Preview} tab is similar to the non-OpenGL preview. You can
display an overlay of the control points, which are colored
according to match quality. Also, with button \button{Identify}
activated, you see the overlapping image frames when you move the
mouse over the image.
\item The \menu{Layout} tab helps finding links between images.
\item The \menu{Move/Drag} dialog may help to interactively adjust a
panorama.
\end{itemize}
Sometimes the preview image may however be distorted and unusable.
\item Open the \emph{Control Points Table} dialog (press \key{F3} or click the ``table''
button). Here you see the points listed which link two
images. Clicking a column label sorts by this column. It is
recommended that only neighboring overlapping images should be
included here. If you have very large overlap, it is possible that
points are found between two images which are not directly
adjacent. In the OpenGL preview window, you can use the \menu{Preview} or
the \menu{Layout} tabs to identify those image pairs. Such points should be
deleted. In the point table, click on columns ``Right Img.'', then
``Left Img.'', and then find pairs like 0/2, 1/3, 2/4 etc. Mark
those lines, and delete the points.
\item To re-run the optimisation, press the double-arrow icon or the
\button{calculate} button in the Optimise/Geometric area.
\end{itemize}
\subsubsection{Preliminary Geometric Optimisation}
\label{sec:landscapes:Optimisation}
Now the (usually) longest part begins: Iterative optimisation of the
photo matchpoints. If your images were taken on a panorama tripod
head, there should only be very few bad matchpoints, e.g.\ those found
on persons or clouds\footnote{You should have created control points
with the \program{Celeste} option!} which have moved between
photos. For handheld photos, the following considerations should be
observed.
The most important line which we want to create in all perfection is the visible
horizon, where sky and earth meet. The foreground, usually grassy or
rocky, is of lesser interest, and stitching errors in those areas may
not even be relevant.
Therefore, matchpoints with large errors in the foreground can be
safely removed, while, if necessary, points on the horizon should be
added manually. Use the \menu{Control Points} tab, select adjacent
images (start with 0 on the left and 1 on the right side), and delete
the worst-fitting matchpoints closest to the camera (near the bottom
of the images). We now start a long phase of re-optimizing and
deletion of ill-matching points as long as those are far from the
horizon. When all near matchpoints are deleted, the result should
already look not too bad.
For continued optimisation, the number of parameters to optimize can
be extended. To begin, I recommend \button{Positions and View (y, p,
r, v)}, which may find a new focal length slightly different from
the data in the EXIF tags. Again, delete further foreground points. If
after a few rounds you still have bad point distances, try
\button{Positions and Barrel Distortion (y, p, r, b)} to balance
distortion by bad optics, or even go up to \button{Everything without
translation}. Optimisation can only reach perfect results if you
did not move between exposures. Else, find a solution which shows the
least error.
In case you took your photos not on a tripod and moved too much, you
may even want to play with the translation options, but errors will be
increasingly hard to avoid.
\paragraph{Using Straight Edges as Guides}
If the panorama contains straight lines like vertical edges of
buildings, these can be used to automatically get a correctly levelled
horizon: Vertical lines are mapped to vertical lines in
equirectangular panos! In the \menu{Control Points} tab, select the image
with the vertical edge in both subframes, and mark points on the
vertical edge. (switch off auto-estimate!).
Likewise, horizontal lines may help, but make sure lines like rooves
are perpendicular to your line of view, else the perspective effect
causes an inclination.
\paragraph{Multi-ring Panoramas}
If you are trying to create a panorama with several rings (horizon,
one or two rings below, and nadir area), you must try to create/keep control
points that best give a result without visible seams. In this case,
and esp.\ if you have only used a regular tripod or even dared to go
for a free-handed panorama, you may observe that it is best to remove
control points in neighboring photos in the lower rings, but keep only
the ``vertical'' links between images with similar azimuth.
In total, and if the foreground is not important but only grassy or
sandy, the rule of thumb is that the horizon images must be strongly
linked with good quality (small errors), while images in the lower
rings should be linked mostly to their respective upper photos, but
not necessarily to the images to its sides. The resulting panorama will then
show a good horizon line, while stitching artifacts in a grassy or
otherwise only decorative ground will usually be acceptable and can,
if needed, be camouflaged in postprocessing.
This optimisation and editing of control points is likely a longish
iterative process, and these are the late night hours where you will
finally wish you had used a panorama head\ldots
\subsubsection{Masking}
\label{sec:landscapes:Masking}
If you have images with overlapping areas, you can usually not force
\program{Hugin} to take pixels from the image which you find best. you can
however mask off an area from an image which you don't want to see in
the output under any circumstances, e.g.\ a person's arm or foot in
one image. Just open the image in the \menu{Mask} tab and either press
\button{Add new mask} and draw the mask polygon covering the unwanted
area, or use the crop settings to define rectangular areas to use.
\subsubsection{Exposure disbalance}
\label{sec:landscapes:Exposure}
In the \menu{Photos} tab, select \button{Photometric parameters} on the right