438 lines
20 KiB
Plaintext
438 lines
20 KiB
Plaintext
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ ³
|
|
³ Û Û ÛÛÛÛÛ ÛÛÛÛ ÛÛÛ Û Û ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ Û ³
|
|
³ Û Û Û Û Û Û Û Û ÛÛ Û Û Û Û Û Û Û Û ³
|
|
³ Û Û ÛÛÛ Û Û Û Û Û Û Û ÛÛÛÛÛ ÛÛÛÛ ÛÛÛ Û Û Û ³
|
|
³ Û Û Û Û Û Û Û ÛÛ Û Û Û Û Û Û ÛÛÛÛÛ ³
|
|
³ Û ÛÛÛÛÛ ÛÛÛÛ Û ÛÛÛ Û Û ÛÛÛÛ ÛÛÛÛÛ Û Û Û ³
|
|
³ ³
|
|
³ by Tumblin / Bodies In Motion ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
What's in this doc file anyway?
|
|
|
|
|
|
- Introduction to VED v0.4 beta
|
|
- Sample object files
|
|
- How to create your own objects
|
|
- Some chat about the source code
|
|
|
|
|
|
|
|
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛIntroduction to VED v0.4 betaÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
VED v0.4 beta is a little prototype for a vector editor that I am working
|
|
on. At present it is just a text file parser / display program, but
|
|
eventually will become a menu driven, fully graphical vector editor.
|
|
Actually, this is a very late release. I had this thing all programmed like
|
|
five months ago, but lost interest in it because I have been working on the
|
|
newer graphical version of it, which is a total reprogramming of this one.
|
|
This version comes with a collection of object files that you can take a look
|
|
at to help you create some of your very own 3D light source shaded polygon
|
|
objects. The format is very simple and anybody should be able to do it. If
|
|
you've been wanting to make a 3D demo object, but never had the means to,
|
|
then here's your chance!
|
|
|
|
Here's sytax for the editor:
|
|
|
|
VED04B filename.ext
|
|
|
|
I am using the extension .v04 just in case I decide to change the format.
|
|
Wouldn't want the object files getting mixed up with the different versions!
|
|
If you've made any objects with VED v0.3 beta, the file format is exactly the
|
|
same, just rename the files from "filename.V03" to "filename.V04". But this
|
|
version can load with the .V03 extension without a problem. I just like to
|
|
keep things a little organized :-)
|
|
|
|
The vector object display program (VED04B.EXE) is menu driven and allows
|
|
you to do a few simple things with the object. You can rotate the object on
|
|
the x axis, y axis, z axis, and all three axis at once. You can change the
|
|
position of the light source. You can also increase or decrease the
|
|
distance the object is from the center of the world (0,0,0). The default
|
|
distance is 256. If you design a large object, it is a good idea to increase
|
|
the distance so that the object will fit onto the screen.
|
|
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛSample object filesÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
Here is a list of the objects that are part of this release:
|
|
(all of them are created by me, Tumblin)
|
|
|
|
|
|
14SIDED V04 - 14 sided prism by Tumblin
|
|
CUBE V04 - simple cube by Tumblin
|
|
CYLINDER V04 - cylinder by Tumblin
|
|
LETTERR V04 - letter "R" by Tumblin
|
|
LETTERT V04 - letter "T" by Tumblin
|
|
PUCK V04 - hockey puck by Tumblin
|
|
PYRAMID V04 - pyramid by Tumblin
|
|
QBINAQB V04 - cube inside a cube by Tumblin
|
|
SPHERE V04 - sphere by Tumblin
|
|
STAR V04 - 6 pointed star by Tumblin
|
|
SWORD V04 - sword by Tumblin
|
|
TRIPIPE V04 - triangular pipe designed by Total Package
|
|
3DFLAG V04 - Canadian flag by Rush
|
|
CONE V04 - cone by Rush
|
|
DIAMOND V04 - diamond by Rush
|
|
PAPERAIR V04 - paper air plane by Tumblin
|
|
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛHow to create your own objectsÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
|
|
If you think you are ready to start making your own objects, then read on.
|
|
|
|
First I will explain a little theory of how 3D works. A vector object
|
|
is simply a bunch of points that are placed at specific coordinates on an
|
|
imaginary graph. Those points are then joined together forming the corners
|
|
of polygons. All of the polygons together create the object. If you
|
|
remember the cartesian graph that your math teacher yacked about in high
|
|
school, then you are well on your way. Its the same idea except you have one
|
|
more dimension. You have the vertical & horizontal dimensions, and now a
|
|
depth.
|
|
|
|
Each 3D point is specified with three numbers in the form of (x,y,z).
|
|
|
|
|
|
X is the horizontal dimension (left and right). The center is at 0.
|
|
X grows increasingly negative as you move left, and grows increasingly
|
|
positive as you go to the right. See the number line below:
|
|
|
|
|
|
-5 -4 -3 -2 -1 0 1 2 3 4 5
|
|
- <------------------------- -------------------------> +
|
|
|
|
|
|
Y is the vertical dimension (up and down). The center is at 0. Y grows
|
|
increasingly negative as you move down, and grows increasingly positive as
|
|
you go up. See number line below:
|
|
|
|
+
|
|
|
|
^
|
|
| 5
|
|
| 4
|
|
| 3
|
|
| 2
|
|
| 1
|
|
0
|
|
|-1
|
|
|-2
|
|
|-3
|
|
|-4
|
|
|-5
|
|
v
|
|
|
|
-
|
|
|
|
|
|
Z is the depth dimension. The center is at 0 (surface of your monitor).
|
|
Z grows increasingly negative as you go into the screen, and grows
|
|
increasingly positive as you come out of the screen towards your face. See
|
|
number line below:
|
|
-
|
|
|
|
/ -5 <-- inside screen
|
|
/ -4
|
|
/ -3
|
|
/ -2
|
|
/ -1
|
|
................ 0................. <-- screen
|
|
/ 1
|
|
/ 2
|
|
/ 3
|
|
/ 4 <-- air infront of screen
|
|
/ 5
|
|
|
|
+
|
|
|
|
So when you put it all together, you have a graph system that looks like
|
|
this:
|
|
|
|
up
|
|
(+) (-)(into screen)
|
|
|
|
| /
|
|
| /
|
|
| /
|
|
| /
|
|
| /
|
|
| /
|
|
left(-) -----------+------------- (+)right
|
|
/ |
|
|
/ |
|
|
/ |
|
|
/ |
|
|
/ |
|
|
/ |
|
|
|
|
(towards you)(+) (-)
|
|
down
|
|
|
|
|
|
To specify a 3D point you simply state its x, y, and z coordinate
|
|
together, like (x,y,z).
|
|
|
|
The next thing to understand about 3D polygon objects is how to construct
|
|
polygons. Polygons are just multi-sided closed off shapes. In this vector
|
|
editor, there is a restriction, as most polygon systems do, you must make
|
|
sure that the polygons are convex. What this means is that when you draw a
|
|
straight line through any part of a polyon, it can only cut through two
|
|
edges. Any more will make it a concave polygon and will not display properly
|
|
when viewed. A simple way to identify if the polygon is convex is to see if
|
|
all of the vertices (corners where two edges meet) point outward from the
|
|
interior. See the diagram below for an idea of what I mean:
|
|
|
|
|
|
------------\
|
|
/ \
|
|
/ \ This is a convex polygon.
|
|
/ \
|
|
/ \ It WILL display correctly.
|
|
/ |
|
|
\ | Notice how all the corners point
|
|
\ | outwards.
|
|
\------------------------
|
|
|
|
|
|
|
|
------------\
|
|
/ \
|
|
/ \ This is a concave polygon.
|
|
/ \
|
|
/ \ It will NOT display correctly
|
|
/ /----------
|
|
\ / Notice how not all the corners
|
|
\ / point outward.
|
|
\----------/
|
|
|
|
|
|
To get around this problem, split the polygon into 2 or more smaller
|
|
polygons, like this:
|
|
|
|
------------\
|
|
/ - \
|
|
/ - \ These are 2 convex polygons joined
|
|
/ - \ together to make up a concave one.
|
|
/ - \
|
|
- - ----------- It will now display correctly.
|
|
\ /
|
|
\ / Notice how all the corners of each
|
|
\----------/ polygon point outward from its center.
|
|
|
|
|
|
|
|
To be able to draw the polygons, you must list the vertices that you
|
|
want to connect together. Guess what, there is another restriction! The
|
|
vertices must be listed in counter-clockwise order when that particular
|
|
polygon is facing you. If you listed them clockwise, then it will not be
|
|
displayed. This is how the polygon drawing code eliminates non-visible
|
|
surfaces (a.k.a backface removal, or backface culling).
|
|
|
|
Suppose you wanted to have some polygons that were supposed to be visible
|
|
on both sides instead of just one. How would you get around the restricton
|
|
that a polygon can only have one visible side? Well, what you do is define
|
|
one side of the polygon in counter-clockwise order, then spin the polygon
|
|
around so that the other side is visible and define that in counter-clockwise
|
|
order. So this means that you define the same polygon twice, once for each
|
|
visible side.
|
|
|
|
Okay, you now know enough to be able to start creating your own objects.
|
|
Let's introduce the file format now. First here are some pointers on what
|
|
is allowed to be in the file:
|
|
|
|
Comments are allowed on any line in the file. You start the comment
|
|
with the "*" character and it ends with the carriage return (when you press
|
|
the ENTER key). Essentially this is the same idea as comments in a C++
|
|
program. Because the comment goes to the end of the line, you must make sure
|
|
that you don't comment out the required data that you need to make your
|
|
object load correctly. So put them either on their own line, or AFTER all
|
|
the important information is there.
|
|
|
|
All of the numbers that appear in the file (except for the ones after
|
|
the comment character "*" - they are not used anyway) must be integers. This
|
|
means that they can have a value between -32768 and 32767, including zero.
|
|
All of the numbers must be separated by a character other than a numerical
|
|
digit or a negative sign. I use commas because thats how I was always taught
|
|
to separate items in lists :-) A word of warning!!! You MUST add a
|
|
separation character after the last uncommented number on the line. Remember
|
|
the editor will ignore everything in the comment lines and blank space
|
|
throughout the file. What would happen is the editor would read the last
|
|
number on the line and then stick the first number on the next line to the
|
|
end of the previous line. This makes a big mess and can crash the editor.
|
|
|
|
Negative numbers should have a negative sign directly infront of the
|
|
number (eg. -5,-123,-30). Positive numbers should not have any symbols
|
|
infront of them at all. (eg. 1,15,66).
|
|
|
|
The very center of the object is at coordinate 0,0,0. This means that
|
|
all of the rotations are performed using this coordinate as the pivot point.
|
|
Please keep this in mind when creating your objects. If you know what you
|
|
are doing, then you can offset the object a bit and then you can get some
|
|
cool looking whirling effects :-)
|
|
|
|
Now that you know what is allowed and what is not, here is what must
|
|
appear in the file:
|
|
|
|
a) the number of vertices in the object
|
|
b) list all the vertices by giving their 3D coordinates x,y,z.
|
|
c) the number of polygons in the object
|
|
d) list all the polygons in the following format:
|
|
i. the number of vertices in the polygon
|
|
ii. list the vertices making the polygon in counter clock wise order
|
|
when visible
|
|
iii. the color of the polygon (not used in VED v0.3 beta, but will
|
|
have a use in later versions to choose a color gradiant range,
|
|
so that you can have multiple light source shading colors to use).
|
|
|
|
|
|
The following list shows the light source shading colors available in
|
|
VED v0.4 beta:
|
|
|
|
1 = grey (white to dark grey)
|
|
2 = red (light pink to deep red)
|
|
3 = yellow (light yellow to tan)
|
|
4 = blue (light blue to deep blue)
|
|
5 = purple (light purple to deep purple)
|
|
6 = green (light green to deep green)
|
|
7 = brown (tan to dark brown)
|
|
|
|
|
|
Thats it! Thats all you need to make an object. A good thing to do is
|
|
to comment EVERYTHING!!!!! I can't stress this enough. When you are listing
|
|
the vertices, put a comment at the end of the line and number them starting
|
|
at zero. This will be necessary when you are ready to start defining your
|
|
polygons. When you are defining your polygons, do step (d) all on the same
|
|
line, and group all the polygons that make a major section of your object.
|
|
This makes "debugging" your object easier.
|
|
|
|
The following is a sample object that makes a cube:
|
|
|
|
--------------------------------- cut here ----------------------------------
|
|
* This is an example object for the new VED v0.4b
|
|
* by Tumblin / Bodies In Motion
|
|
|
|
8, * number of vertices
|
|
|
|
* list of vertices
|
|
* format:
|
|
* x,y,z,
|
|
-50,50,-50, * vertex 0 : back top left
|
|
50,50,-50, * vertex 1 : back top right
|
|
50,-50,-50, * vertex 2 : back bottom right
|
|
-50,-50,-50, * vertex 3 : back bottom right
|
|
-50,50,50, * vertex 4 : front top left
|
|
50,50,50, * vertex 5 : front top right
|
|
50,-50,50, * vertex 6 : front bottom right
|
|
-50,-50,50, * vertex 7 : front bottom left
|
|
|
|
6, * number of polygons in object
|
|
|
|
* polygons for object
|
|
* format:
|
|
* # of polygons, list of vertices, color of polygon
|
|
4, 0,4,5,1, 1, * top (as viewed from front)
|
|
4, 7,3,2,6, 2, * bottom
|
|
4, 0,3,7,4, 3, * left
|
|
4, 5,6,2,1, 4, * right
|
|
4, 1,2,3,0, 5, * back
|
|
4, 4,7,6,5, 6 * front
|
|
|
|
* all done, end of object :-)
|
|
--------------------------------- cut here ----------------------------------
|
|
|
|
Note that I don't bother putting a comma after the last relevant number.
|
|
The "6" in this case. Since there are no more numbers to be read in, this
|
|
is okay. Just don't get carried away with it.
|
|
|
|
Here are some final tips on creating your own cool objects. Start out by
|
|
drawing a sketch of what you want it to look like on some paper. Then try
|
|
to draw a nice, neat LARGE diagram on some graph paper. Label all of your
|
|
vertices starting at zero. For surfaces that you can't see, draw another
|
|
diagram, rotating the object around so that the vertices are visible and keep
|
|
the numbering consistent. This a rather awkward way to design an object
|
|
unless you are good at visualizing things in three dimensions in your head.
|
|
(Thankfully I can do that without a problem 8-). Another tip is when you are
|
|
defining your polygons and listing the vertices making a particular polygon.
|
|
If the polygon is visible that way you have drawn it, the list it in counter-
|
|
clockwise order. If it is not visible, then list it in clockwise order.
|
|
This will help you eliminate re-drawing your diagrams provided they are not
|
|
too complex and you have enough room to draw all the points and label them.
|
|
Its also a good idea to label the axis and even jot down some of the major
|
|
coordinates in the object. Makes things a little easier to visualize.
|
|
|
|
See VED.REV for information on the revision history of VED.
|
|
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛSome chat about the source codeÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
Just for your information, this stuff was developed using:
|
|
A 486-DX 33MHz computer, Turbo C++ v3.0, TASM v3.1, XLIB v6.1.
|
|
|
|
|
|
Alright, here is how to get this thing compiled and running:
|
|
|
|
1. Go into the Turbo C++ IDE (I am assuming you are using a Borland C++
|
|
compiler) and load in the ved04b.prj project.
|
|
2. When you get this far you should make sure that you are using the large
|
|
memory model (try doing an ALT [O]ptions, [C]ompiler, [C]ode generation,
|
|
and then select the large memory model).
|
|
3. Next you have to make sure that you have the correct directories setup.
|
|
On my system here is what I have done:
|
|
My copy of Turbo C++ is in the c:\tc directory, so what I did was create
|
|
a directory called c:\tc\xlib61 and put all the XLIB 6.1 files in there.
|
|
Then you must make sure that your directories in your IDE take this into
|
|
account. Use the Alt [O]ptions, [D]irectory keys.
|
|
On my system I have them set to these:
|
|
Include directories:
|
|
c:\TC\INCLUDE; C:\TC\XLIB61
|
|
Library directories:
|
|
c:\TC\LIB; C:\TC\XLIB61
|
|
If you are using the Borland C++ 3.1 compiler, for example, then you
|
|
might have to change the TC above to BC, and the rest should be the same
|
|
(hopefully :-).
|
|
|
|
This makes it very convenient for me to compile and maintain the stuff I
|
|
make with XLIB. For example I can just simply use #include <xlib_all.h>
|
|
at the beginning of my C++ program and don't have to worry about it.
|
|
Oh, by the way, I highly recommend the XLIB graphics library to people
|
|
who are starting out. It is this library that I have been doing most of
|
|
my coding with and find it very useful.
|
|
|
|
4. The files that should be in your project file are:
|
|
ved04b.cpp - the main program
|
|
fixedl.asm - the 32-bit fixed point multiply and divide functions
|
|
xlib61l.lib - XLIB v6.1 large memory model library file.
|
|
5. The files you should have in your current directory (which ever one you
|
|
want to compile VED v0.4 beta in) are:
|
|
ved04b.cpp - the main program
|
|
fixedl.asm - the 32-bit fixed point multiply and divide functions
|
|
ved04clr.h - include file that contains the palette data
|
|
xlib61l.lib - the XLIB v6.1 library file to link with your code
|
|
6. Then hit F9 (Make) and watch the program compile and link.
|
|
7. You should be able to run it from your compiler with ALT [R]un, and [R]un.
|
|
Usually I just drop to DOS and test it there because I usually spit out
|
|
text for debugging purposes, but you don't have to if you don't want to.
|
|
|
|
|
|
That should get you started. But if not, just email me at:
|
|
m9cl@jupiter.sun.csd.unb.ca
|
|
and I will get back to you as soon as possible.
|
|
|
|
|
|
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
|
|
signed, Tumblin
|
|
|
|
P.S. Don't bother emailing me any object files (not that anybody has emailed
|
|
me any objects from the VED v0.3 beta release anyway :-).
|
|
I have the new graphical version of VED v1.0 almost ready. I have also
|
|
created a file convertor so that you can convert these objects to the
|
|
new .V10 format (more info on that when I release it).
|
|
|