Page 1 of 1

Right ascension, declination, and distance in celestia?

Posted: 18.09.2010, 08:14
by Verz Veraldi
I'm just wondering, how to convert common RA like 05h35m10s and Dec like -05 : 20 : 37 to decimals in the .dsc files? And, is the radius and distance is light years? Is there any program or even math formulas to convert it?

Code: Select all

Nebula "Nebula"
{
    Mesh "Nebula.*"
    Radius               <--- Light years?
    RA                     <--- Common to decimals?
    Dec                    <--- Common to decimals?
    Distance             <--- Light years?
}

Re: Right ascension, declination, and distance in celestia?

Posted: 18.09.2010, 12:44
by selden
Verz,

The definitions of the STC fields are in the WikiBook at http://en.wikibooks.org/wiki/Celestia/STC_File
and DSC fields are defined at http://en.wikibooks.org/wiki/Celestia/DSC_File
But, yes, Distance and Radius are measured in LightYears.

There are 60 seconds in a minute, and 60 minutes in a degree or hour.
So to convert to fractional units, divide the number of minutes by 60 and the number of seconds by 3600 (which is 60x60).
So an RA of 05h35m10s = 5 + 35/60 + 10/3600 = 5 + 0.583333 + 0.002778 = 5.586111 hours
and a Declination (in degrees) of -05 : 20 : 37 = - ( 5 + 20/60 + 37/3600) = - ( 5 + 0.333333 + 0.010278) = -5.343361 degrees

Unfortunately, while DSC files want RA in hours, in STC files you need to provide RA in degrees. To convert hours to degrees, multiply by 15: 5.586111 hours = 83.791665 degrees

Re: Right ascension, declination, and distance in celestia?

Posted: 18.09.2010, 18:40
by Reiko
Use these scripts in Celestia. It will convert and display them for you.

STC

Code: Select all

-- Title: Display current decimal for observer

    KM_PER_LY = 9460730472580.8;
    KM_PER_AU = 149597870.7;
    PI = math.pi
    degToRad = PI / 180;
    J2000Obliquity = 23.4392911 * degToRad

    LOOK  = celestia:newvector(0, 0, -1);
    earth = celestia:find("Sol/Earth")

    -- Convert coordinates from cartesian to polar:
    xyz2rtp = function (x, y, z)
        local r = math.sqrt(x*x + y*y + z*z)
        local phi = math.atan2(y, x)
        local theta = math.atan2(math.sqrt(x * x + y * y), z)

        return r, theta, phi
    end

    -- Return current distance of observer from Earth:
    getR = function (obs)
        local d = (earth:getposition():distanceto(obs:getposition()))
        return d
    end

    -- Return current RA, Dec for observer:
    getRADec = function (obs)
        local base_rot = celestia:newrotation(celestia:newvector(1, 0, 0), -J2000Obliquity)
        local rot = earth:getposition():orientationto(obs:getposition(), LOOK) * base_rot
        local look = rot:transform(LOOK):normalize()
        local r, theta, phi = xyz2rtp(look.x, look.z, look.y)
        local phi = math.mod(720 - math.deg(phi), 360)
        local theta = math.deg(theta)
        if theta > 0 then
            theta = 90 - theta
        else
            theta = (-90 - theta)
        end
        return phi, theta
    end

    km2Unit =
        function(km)
            local sign, value, units
            --if not (type(km) == "number") then return km end;
            if km < 0 then sign = -1 else sign = 1 end;
            km = math.abs(km);
            value = km / KM_PER_LY
            units = "ly";
            return string.format("%.5f",sign*value).." "..units;
        end


    deg2str =    function(deg)
        return string.format("%0.6f deg", deg);
    end

    while true do
        obs = celestia:getobserver()
        obsR = getR(obs)
        obsRA, obsDec = getRADec(obs)
        celestia:print(obsR..' '..obsRA..' '..obsDec)
        if obsR >= 0 then
            -- Display geocentric coordinates for observer:
            obsRStr = km2Unit(obsR);
            obsRAStr = deg2str(obsRA);
            obsDecStr = deg2str(obsDec);
            celestia:print("Geocentric coordinates for observer:\nR: "..obsRStr.."\nRA: "..obsRAStr.."\nDec: "..obsDecStr, 1, -1, -1, 1, 7);
        end
        wait(0)
    end


For DSC

Code: Select all

-- Title: Display current position for observer nebulas

    KM_PER_LY = 9460730472580.8;
    KM_PER_AU = 149597870.7;
    PI = math.pi
    degToRad = PI / 180;
    J2000Obliquity = 23.4392911 * degToRad

    LOOK  = celestia:newvector(0, 0, -1);
    earth = celestia:find("Sol/Earth")

    -- Convert coordinates from cartesian to polar:
    xyz2rtp = function (x, y, z)
        local r = math.sqrt(x*x + y*y + z*z)
        local phi = math.atan2(y, x)
        local theta = math.atan2(math.sqrt(x * x + y * y), z)

        return r, theta, phi
    end

    -- Return current distance of observer from Earth:
    getR = function (obs)
        local d = (earth:getposition():distanceto(obs:getposition()))
        return d
    end

    -- Return current RA, Dec for observer:
    getRADec = function (obs)
        local base_rot = celestia:newrotation(celestia:newvector(1, 0, 0), -J2000Obliquity)
        local rot = earth:getposition():orientationto(obs:getposition(), LOOK) * base_rot
        local look = rot:transform(LOOK):normalize()
        local r, theta, phi = xyz2rtp(look.x, look.z, look.y)
        local phi = math.mod(720 - math.deg(phi), 360)
        local theta = math.deg(theta)
        if theta > 0 then
            theta = 90 - theta
        else
            theta = (-90 - theta)
        end
        return phi, theta
    end

    km2Unit =
        function(km)
            local sign, value, units
            --if not (type(km) == "number") then return km end;
            if km < 0 then sign = -1 else sign = 1 end;
            km = math.abs(km);
            value = km / KM_PER_LY
            units = "ly";
            return string.format("%.5f",sign*value).." "..units;
        end


    deg2str =    function(deg)
        return string.format("%0.6f deg", deg);
    end

    while true do
        obs = celestia:getobserver()
        obsR = getR(obs)
        obsRA, obsDec = getRADec(obs)
        celestia:print(obsR..' '..obsRA..' '..obsDec)
        if obsR >= 0 then
            -- Display geocentric coordinates for observer:
            obsRStr = km2Unit(obsR);
            obsRAStr = deg2str(obsRA / 15);
            obsDecStr = deg2str(obsDec);
            celestia:print("Geocentric coordinates for observer:\nR: "..obsRStr.."\nRA: "..obsRAStr.."\nDec: "..obsDecStr, 1, -1, -1, 1, 7);
        end
        wait(0)
    end


viewtopic.php?f=15&t=16119

Re: Right ascension, declination, and distance in celestia?

Posted: 19.09.2010, 04:34
by Verz Veraldi
Selden,
thanks alot! I could use that for measuring..

Reiko,
You mean if i open those script in celestia, when i go to a star or something i can see the location in the info text in the upper left?

Re: Right ascension, declination, and distance in celestia?

Posted: 19.09.2010, 04:44
by Verz Veraldi
Verz Veraldi wrote:Reiko,
You mean if i open those script in celestia, when i go to a star or something i can see the location in the info text in the upper left?

oh, i've test that script, it works! thanks alot!