Estoy creando un programa de planetario usando Unity3D y C# para graficar estrellas del catálogo de Hipparcos. Usando las columnas Plx, _RA.icrs y _DE.icrs del conjunto de datos, he logrado calcular la distancia en parsecs y calcular un conjunto cartesiano de coordenadas.
Clase de simulación...
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++;
}
}
}
Clase estrella:
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);
}
}
Vista 3D de la escena (las flechas muestran la orientación de la cámara):
Con la imagen de la cámara, intenté subirla a http://nova.astrometry.net/ pero no pude encontrar estrellas/constelaciones.
Así que pensé en normalizar los vectores de las estrellas.
Con la clase Simulación sin cambios, cambié la variable distanciaDeLaTierra en la clase Estrella a 900 para normalizar los vectores (cada estrella no tendrá la misma distancia desde el centro)
Vista 3D de la escena (las flechas muestran la orientación de la cámara):
Incluso después de la normalización, al cargar la imagen de la vista desde la cámara al sitio web de procesamiento de imágenes, no se detectaron estrellas ni constelaciones.
¿Qué estoy haciendo mal? ¿Por qué no se detectan las estrellas y las constelaciones?
La magnitud aparente m = Vmag
podría ser lo que falta. Las estrellas de magnitud aparente m =0 deberían aparecer 100 veces más brillantes que las estrellas m =5. Si está simulando una vista a simple vista, puede omitir estrellas de m >6.
Cuando coloque estrellas a distancias no uniformes, deberá calcular la magnitud absoluta M a partir de la magnitud aparente m y la distancia. Si p = Plx
es paralaje en milisegundos de arco,
Si todas las estrellas se modelan en el mismo material (¿emisivo?), el objeto que representa una estrella de magnitud absoluta M =0 debería tener 100 veces el área de superficie y 10 veces el radio, como una estrella M =5.
Para verificar su trabajo, los sitios de planetarios como TheSkyLive o Stellarium Web requerirían menos cómputo que cargar imágenes en astrometry.net.
fabricante de planetas
usuario21
SidS