A brief introduction to Celx vectors
Posted: 26.04.2004, 23:44
This message begins a new thread where it left off in another thread (Got an Idea for a Celx Utility Script?
-- http://www.celestiaproject.net/forum/viewtopic.php?t=4903)
The code below was modified further by Don G., for clarification (mostly the variable names).
Toti, what is the purpose of computing a seemingly arbitrary number (6 in this case) and calling it rot_speed? What is "rot_speed"? ...
The next line takes this seemingly arbitrary number, multiplies it by scriptTime and multiplies it by 5. What does "5" represent? Wouldn't we want to increase the longitude by a fixed value for each render pass?
Earlier, orbitTime is defined so that an orbit is supposed to take 60 seconds...
However, in 60 seconds, we orbit the Earth FIVE times, not just once.
So, I was wondering if you could clarify things a bit more?
Thank you Toti!
-Don G.
-- http://www.celestiaproject.net/forum/viewtopic.php?t=4903)
The code below was modified further by Don G., for clarification (mostly the variable names).
Toti, what is the purpose of computing a seemingly arbitrary number (6 in this case) and calling it rot_speed? What is "rot_speed"? ...
Code: Select all
-- Complete one orbit (360 degrees):
local rot_speed = 360 / orbitTime
The next line takes this seemingly arbitrary number, multiplies it by scriptTime and multiplies it by 5. What does "5" represent? Wouldn't we want to increase the longitude by a fixed value for each render pass?
Code: Select all
-- This is the longitude we pass to the function. It's a function of
-- time, like many parameter trajectories:
local longitude = rot_speed * scriptTime * 5
Earlier, orbitTime is defined so that an orbit is supposed to take 60 seconds...
Code: Select all
-- Define an orbit to take 60 seconds:
local orbitTime = 60
However, in 60 seconds, we orbit the Earth FIVE times, not just once.
So, I was wondering if you could clarify things a bit more?
Thank you Toti!
-Don G.
Code: Select all
--******************************************************
--
-- This script is a modification of Harald Schmidt's
-- "Around the Earth" script.
--
--******************************************************
--************************************************
-- UCS = Universal Coordinate System
--************************************************
-- This function puts the viewer at longitiude on myObject.
-- All is performed in UCS:
function around(myObject, longitude, distance, upvector)
-- These two equations look rather complicated, but they are only a 2-D
-- polar-cartesian conversion, that is, given a (radius, angle) = (r,
-- pos), convert it to (x, y) values. They are a "classic":
local x = distance * math.cos(math.rad(longitude))
local z = distance * math.sin(math.rad(longitude))
-- Keep the up pointing coordinate on the UCS "horizontal" plane:
local y = 0
-- Create a vector with the above coordinates. We create a vector because
-- they don't need to be that precise (they are pretty small coordinates,
-- with length = distance at most):
local offsetVector = celestia:newvector(x,y,z)
-- Obtain a vector that is the center of myObject in UCS. This is a
-- 'position' vector, so it is very precise. Why is this? Because UCS
-- places its center at about 200 AU from Sol. If we do not assure enough
-- precision, our centerBodyPosition would not be placed on myObject but
-- a few thousand km. from it.
local centerBodyPositionVector = myObject:getposition ()
-- Viewer's position: Let's go to the center of myObject and then go to
-- ourVector (that is what a vector addition does, really). This adds a
-- 'common vector' (offsetVector) to a 'position vector'
-- (centerBodyPositionVector), so the maximun precision is retained. We
-- want that, because we want to place the viewer exactly where it's
-- needed (and not a few thousand km. away).
local viewerPositionVector = centerBodyPositionVector + offsetVector
-- let's place the observer there:
local obs = celestia:getobserver()
obs:setposition (viewerPositionVector)
-- Look at earth centered with upvector as "ceiling". This is complex...
-- Close your hand. Extend your thumb. Then extend the first finger, and
-- point it to this -> x. (Keep the angle between both fingers fixed.)
-- This behaves like the viewer: your thumb is the 'up' axis. Your first
-- finger is the viewer's 'look_at' axis. When you point it to the 'x',
-- you are transforming the 'up' vector (your thumb moves with your hand),
-- but it doesn't matter, because you have already defined where it is in
-- relation with the rest of your hand. I believe that Celestia does this
-- same thing that you have done with your hand: First creates an
-- "abstract" viewer, then defines where is 'up' and last, moves/rotates
-- the viewer to point its "camera" to the selected body. The 'up' vector
-- signals the viewer's "ceiling" BEFORE Celestia rotates it in order to
-- look at some place.
obs:lookat (centerBodyPositionVector, upvector)
-- print the viewer's position (in UCS):
celestia:flash("Viewer pos.: " .. viewerPositionVector.x ..
" " .. viewerPositionVector.y ..
" " .. viewerPositionVector.z , 1)
-- return control to Celestia for a moment (to refresh screen, etc.):
wait(0.0)
end
--************************************************
-- Now call the function
--************************************************
-- Define which direction we should call 'up'. Since this is only a rough
-- direction, we can use a 'common vector'. We don't need precision here:
local upvector = celestia:newvector (0,1,0)
-- select body:
local myObject = celestia:find("Sol/Earth")
-- Define an orbit to take 60 seconds:
local orbitTime = 60
-- Complete one orbit (360 degrees):
local rot_speed = 360 / orbitTime
-- Fix the viewer's distance to the body's center:
local distance = 0.005
-- loop for the time specified in orbitTime:
local scriptTime = 0
while scriptTime < orbitTime do
scriptTime = celestia:getscripttime()
-- This is the longitude we pass to the function. It's a function of
-- time, like many parameter trajectories:
local longitude = rot_speed * scriptTime * 5
-- Call the function:
around(myObject, longitude, distance, upvector)
end