Ich erstelle ein Planetariumsprogramm mit Unity3D und C #, um Sterne aus dem Hipparcos-Katalog zu zeichnen. Mit den Spalten Plx, _RA.icrs und _DE.icrs des Datensatzes ist es mir gelungen, die Entfernung in Parsec zu bearbeiten und einen kartesischen Koordinatensatz zu berechnen.
Simulationsklasse...
public class Simulation : MonoBehaviour
{
public IEnumerator loadStars()
{
starsLoaded = 0;
var stopWatch = new Stopwatch();
stopWatch.Start();
// Use the last frame duration as a guide how long one frame should take
var targetMilliseconds = Time.deltaTime * 100f;
for (int i = 0; i < totalStars; i++)
{
Double.TryParse(datasetTable[i, 3], out double test);
if (!(datasetTable[i, 12] == null) && !(datasetTable[i, 13] == null) && !(datasetTable[i, 6] == null))
{
GameObject thisStar = Instantiate(starPrefab, transform.position, transform.rotation) as GameObject;
thisStar.transform.parent = starHolder.transform;
Int32.TryParse(datasetTable[i, 0], out (thisStar.GetComponent<Star>().ID));
Double.TryParse(datasetTable[i, 12], out (thisStar.GetComponent<Star>().RA));
Double.TryParse(datasetTable[i, 13], out (thisStar.GetComponent<Star>().DE));
Double.TryParse(datasetTable[i, 3], out (thisStar.GetComponent<Star>().Vmag));
Double.TryParse(datasetTable[i, 6], out (thisStar.GetComponent<Star>().Plx));
Double.TryParse(datasetTable[i, 10], out (thisStar.GetComponent<Star>().CI));
}
if (stopWatch.ElapsedMilliseconds > targetMilliseconds)
{
yield return null;
stopWatch.Restart();
}
starsLoaded++;
}
}
}
Sterneklasse:
public class Star : MonoBehaviour
{
/// <summary>
/// Identifier (HIP number). "HIP" is appended to the ID, for Hipparcos
/// </summary>
[SerializeField] public int ID; // { get; set; }
/// <summary>
/// Right Ascension (J2000) in degrees.
/// </summary>
[SerializeField] public double RA; //{ get; set; }
/// <summary>
/// Declination (J2000) in degrees.
/// </summary>
[SerializeField] public double DE; //{ get; set; }
/// <summary>
/// Magnitude in Johnson V
/// </summary>
[SerializeField] public double Vmag; //{ get; set; }
/// <summary>
/// Trigonometric parallax, measured in milli-seconds of arc
/// </summary>
[SerializeField] public double Plx; //{ get; set; }
/// <summary>
/// Colour index in Johnson B-V colour
/// </summary>
[SerializeField] public double CI; //{ get; set; }
/// <summary>
/// Distance of the star from the centre of Earth measured in kilometres
/// </summary>
[SerializeField] public double distanceFromEarth;
/// <summary>
/// Cartesian (X,Y,Z) positioning of the star
/// </summary>
[SerializeField] Vector3 cartesianPositioning;
// Start is called before the first frame update
void Start()
{
positionStar();
}
private void distanceFromEarthCalc()
{
// Convert Plx from milliarcseconds to arcseconds (seconds of arc)
double PlxSOA = Plx / 1000;
// Calculate distance from equation d=1/p
// distance d is measured in parsecs and the parallax angle p is measured in arcseconds.
double dPC = 1 / PlxSOA;
/// Convert parsecs to kilomentres
/// Conversion can bbe found here:
/// https://en.wikipedia.org/wiki/Parsec
///
/// QUICK NOTE: converting to km causes issues with unity - values are too high
/// maybe work with parsecs instead?
///
//distanceFromEarth = (dPC * (96939420213600000 / math.PI_DBL)) / 1000;
//distanceFromEarth = distanceFromEarth / 10000; // metres to kilometres
distanceFromEarth = dPC * 10; // multiplied by 10 to move stars away from camera
}
private void cartesianPositioningCalc()
{
distanceFromEarthCalc();
double RA_rad = RA * (math.PI_DBL / 180);
double DE_rad = DE * (math.PI_DBL / 180);
cartesianPositioning.x = (float)(distanceFromEarth * (math.cos(DE_rad)) * (math.cos(RA_rad)));
cartesianPositioning.y = (float)(distanceFromEarth * (math.cos(DE_rad)) * (math.sin(RA_rad)));
cartesianPositioning.z = (float)(distanceFromEarth * (math.sin(DE_rad)));
}
private void positionStar()
{
cartesianPositioningCalc();
gameObject.transform.position = cartesianPositioning;
gameObject.transform.localScale = new Vector3(2, 2, 2);
}
}
3D-Ansicht der Szene (die Ausrichtung der Kamera wird durch die Pfeile angezeigt):
Mit dem Bild von der Kamera habe ich versucht, es auf http://nova.astrometry.net/ hochzuladen , konnte aber keine Sterne/Sternbilder finden.
Also dachte ich darüber nach, die Vektoren der Sterne zu normalisieren.
Bei unveränderter Simulationsklasse habe ich die Variable distanceFromEarth in der Star-Klasse auf 900 geändert, um die Vektoren zu normalisieren (jeder Stern hat nicht die gleiche Entfernung vom Zentrum).
3D-Ansicht der Szene (die Ausrichtung der Kamera wird durch die Pfeile angezeigt):
Selbst nach der Normalisierung führte das Hochladen des Bildes der Ansicht von der Kamera auf die Bildverarbeitungswebsite dazu, dass keine Sterne/Sternbilder erkannt wurden.
Was mache ich falsch, warum werden Sterne und Sternbilder nicht erkannt?
Die scheinbare Helligkeit m = Vmag
könnte fehlen. Sterne der scheinbaren Helligkeit m = 0 sollten 100 mal so hell erscheinen wie m = 5 Sterne. Wenn Sie eine Sicht mit bloßem Auge simulieren, können Sie Sterne mit m >6 weglassen.
Wenn Sie Sterne in ungleichmäßigen Entfernungen platzieren, müssen Sie die absolute Helligkeit M aus der scheinbaren Helligkeit m und der Entfernung berechnen. Wenn p = Plx
Parallaxe in Millibogensekunden ist,
Wenn alle Sterne aus dem gleichen (emittierenden?) Material modelliert werden, sollte das Objekt, das einen Stern der absoluten Helligkeit M = 0 darstellt, die 100-fache Oberfläche und den 10-fachen Radius eines Sterns mit M = 5 haben.
Um Ihre Arbeit zu überprüfen, wären Planetariumsseiten wie TheSkyLive oder Stellarium Web weniger rechenintensiv als das Hochladen von Bildern auf astrometry.net.
Planetenmacher
Benutzer21
SidS