3D and Dreamatron VR Imaging Maths
These are generally useful for several 3D
display technologies.
Check for errors before using.
ZYX to bytenumber address:
In the case of a volumetric display it is
mathematically efficient to
have a voxelspace with dimensions that are
powers of 2, and therefore
arithmetic processing is not needed in many
cases. In the case of a
voxelspace of 16x16x16+, each coordinate
is hexadecimal digit from
0 to F, therefore, a near central point would
be addressed as 987,
representing X=7,Y=8,Z=9. I do not expect
any 3D displays
to have discrete dimensions greater than
65536 cubed, and a central voxel
would be addressed as 800080008000 in this
case. 8000 is an unsigned
origin that is simple to work with in a computationally
efficient 3D environment.
These bytenumbers address memory in the display
buffer directly in bitmap
format. A holodeck room of such quality to
have a discrete dimension of
65536 (2^16) may have one or more buffers
of 256 terabytes of RAM!
(If it was truly holographic, this could
be reduced to 2 gigabytes or less
per wall, but for practical experimental
purposes, none of these displays
will need to exceed megabytes in order of
magnitude of storage.
A solution to the problem of very high resolution
voxelspaces is that
they will very likely be sparse matrixes
(contain mostly zero)
and compression will happen naturally if
coordinates are stored in order
with inactive (zero) voxels not being stored.
A "megapixel" is a reasonable quality
expectation in today's technology.)
Rotation:
To cgi a rotating object, it is converted
to polar coordinates,
the angular coordinate is incremented, and
it is converted back
to ZYX. The initial conversion need be done
only once. This
works easily along any of the 3 axis because
one of the coordinates
of each voxel remains unchanged in the conversion.
Conversion to polar coordinates involves
computing the distance of
each voxel from the axis of rotation (R),
and computing the original angle
of rotation relative to one of the other
axis (T).
R=square root of(X^2+Y^2):T=arctangent(Y/X)
This assumes rotation at origin, so the offset
must be removed.
Also attention to the signs of X and Y is
necessary to correct T
when it exceeds a half-rotation.
[1]Converting voxel back to ZYX (assuming
rotation on the Z axis at origin) is:
X=R*COS(T):Y=R*SIN(T)
The display devices do not do this math at
all, it is only necessary to
create cgi objects which are then fed to
the display device, or an independent
"rotate" control module added to
the device will do this.
Plotting a voxel at ZYX:
For volumetric projection, the color of the
voxel is stored in the
memory address numbered ZZYYXX. Assuming
256 cubed to
be a reasonable voxelspace for projection,
030201 would be the address of voxel X=1
Y=2 Z=3.
In this example, the numbers are hexadecimal
AND decimal.
Polar Coordinates to ZYX:
See note [1] under Rotation
Vector Graphics to Voxels (draw a line):
All integer math. The longest dimension of
the line is
counted (such as from X1 to X2). Using a
shorter dimension
could cause dotted lines or divisions by
zero. The other
dimensions are calculated by the equal proportion
of the
distance between points in between over the
total distance:
For all points from X1 to X2 when X is the
longest dimension of the line,
Y=Y1+(Y2-Y1)x(X-X1)/(X2-X1)
Z=Z1+(Z2-Z1)x(X-X1)/(X2-X1)
Draw a solid sphere:
Offset from origin is removed, then:
if square root of (X^2+Y^2+Z^2)<radius
then set voxel.
All points within radius of origin and axis
may be tested.
Draw a hollow sphere:
Draw a rectangle or window frame:
Lines: X1Y1Z1-X2Y2Z1-X2Y2Z2-X1Y1Z2-X1Y1Z1;
"1" coordinates are upper "left"
corner , and
"2" coordinates are height and
width added to "1" coordinates.
Detect being inside a window or icon (gui):
If X is greater than WindowX and Less than
WindowX+WindowWidth
then X is inside of the window if this is
also true for Y and Z.
Draw a filled rectangle:
For All Z from Z1 to Z2:
Lines X1Y1ZZ-X2Y2ZZ
Draw a filled trapezium/trapezoid/polygon:
Not worked out but based on "multiple
instances of vectorgraphic lines"
Fill an arbitrary shape (large shapes cause
stack overflows)
Put all adjacent empty voxels on the stack.
Fill the addressed pixel.
Pop a voxel off the stack if the stack is
not empty, otherwise stop.
This must be improved by cleanup and checking
the stack for redundancy
and recently filled voxels. Leaky shapes
are a serious problem.
Texture map a quadrangle:
similar to filling quadrangles but also using
additional vectorgraphic line
proportion calculations to copy texture map
pixels to their corresponding
place on the shape.
Parallax info:
(Eyes are 5 to 7 cm apart, but it may be
necessary to assume more)
Fonts:
Bitmaps only, of 256 character alphabets
in sequence, handdrawn.
Raytracing and Raycasting:
We never used these techniques.
Drawing a circle in a plane using sine and
cosine:
t=Within range of 0 to 2pi, incremented by
units of 2/rpi:
x=rcos(t):y=rsin(t) assuming circle is in
plane of Z at origin
Drawing (a circle, etc.) in a sloped plane
This problem appears to me to involve the
vectorgraphic line functions.
Drawing a circle in a plane using square
root:
r^2=x^2+y^2 assuming circle is in plane of
Z at origin
and all variables must range from -r to r,
and for practical purposes, 1/8 of the circle
must be calculated and
then replicated 8 times using 8 variations
of:
y=sqr((R^2)-(X^2)):x=-sqr((R^2)-(X^2)), etc.
Drawing a disk using square root:
For all X and Y, if sqr((X^2)+(Y^2))<r
then set voxel x,y assuming at origin in
plane Z
Integer Square Root (used to avoid sine and
cosine):
Simple! The highest number of odd numbers
that add together
to be less than or equal to a number is it's
integer square root:
1+3+5+7+9=25; there are 5 odd numbers in
it.
Sine Cosine Arctangent cheating
in some previous applications excellent results
were achieved
by dividing a quadrant or circle into 256
"degrees" and calculating
the most useful integers from trigonometric
functions and putting them
in a lookup table. Like(?)
Degrees256sin(X)=int(128+127*sin(x*pi/128))
Relationship between Left and Right eyes
and an object:
As an object moves toward you it moves right
in the left eye's view
and left in the right eye's view.
Apparent size of an object, changing with
distance:
as with Parallax, I think that this should
be adjustable.
Plotting a ZYX voxel on a holographic panel:
See "HAND DRAWN HOLOGRAMS"
Playing sounds:
Selected audio signal type is pulse width
modulation.
Compressing sounds:
googolodeon (linear shift register) code.
Fast Fourier Transforms:
The most complex math to be occasionally
used,
for coding certain objects and people.
Sensor Decoding:
Currently primitive and weird, involving
sonar, infrared, radio,
"light pen" type interface, "polar
local positioning system", and
other experimental methods. "People
images" present a unique
problem currently considered solvable by
sonography and
texturemapping... a "people generating
module" currently
seems necessary because of the yet unminimalized complexity.
As mentioned elsewhere, the 3D displays themselves
do not use very much of this math, but the
cgi's are
generated this way externally. Currently
none of our
3D displays use any noninteger functions
internally.
3D projectors do not need to calculate perspective
at all,
but 3D goggles do.
Buckminster Fuller created a mapping format based on
triangles and the icosahedron which is more
natural than
ZYX but I have not worked out translations
or coordinate
systems for it. I did once dream asleep of
creating a VR
system based on icosahedrally mapped worlds. All I can
say is that they can be rearranged into a
rectangular map,
and each triangle may inherently point north
or south. It
is at this point more obvious to me to map
worlds as cubes,
but my intuition says that Fuller's "alien
technology"
based on triangles is superior.
go to Build a Holodeck, page 1