 THE OUTLAW TRIAD DEMOSERIES 
 PART VI 
Written by : Vulture/OT
Code in : Pascal/Asm
Topic : 3d morphing
 Introduction 
Welcome to the Outlaw Triad demoseries! In these series we will be
talking about programming demoeffects in either pascal or assembler.
Theory behind the effects shall be discussed while a full sourcecode
is also provided.
This time we'll discuss 3d morphing. This type of morphing involves a
3d object changing into another 3d object. The example pascalsource
rotates and morphs a number of 3d points and was coded in Pascal.
Enjoy!
 Theory 
What does morphing mean exactly? Like said in the introduction,
morphing of 3d objects means that one 3d object is gradually changing
into another 3d object. What I am about to show you is morphing of 3d
objects which consist of pixels only, not lines or anything. However,
the principle is the same when using lines or polygons. One of the
basic properties of 3d morphing is that all 3d points should reach
their destination at the same time. Like, in our example, it wouldn't
be good to see some pixels already at their destination while others
are still on their way, right? In the example all pixels (2d) arrive
at the same time.
Ok, how do we code this stuff? First of all I will assume you know the
basics of 3d coding, like, how to rotate and show a 3d point on the vga.
If you don't know that, this doc is probably of no use to you yet.
Anyway, with that clear, let's see the theory behind 3d morphing, ok?
Let's say x1,y1,z1 represent a 3d point and x2,y2,z2 form another one
(origin & destination). Observe this:
x2x1 = distance on the X axis between the twese points
y2y1 = distance on the Y axis between the twese points
z2z1 = distance on the Z axis between the twese points
When we add the difference between the x values to x1, we get x2. BUT,
we don't want to get to x2 in just 1 step. So, let's divide that value
by 64!
Then, if we add the resulting value to x1 64 times, we get x2.
We also do this for the y and the z:
Xstep = (x2x1) / 64
Ystep = (y2y1) / 64
Zstep = (z2z1) / 64
This must be done for all 3d points in the objects. You will get as
many Xstep values as there are x values in the object. Same goes for
y and z.
The method described here will only work for objects of equal size.
In other words, you can't have one 3d object of (for example) 100
points and another 3d object of 120 points.
Now for the pascalcode. What we are going to do is adding the
stepsizes to the x,y,z values of the original 3d point 64 times.
While doing this, we also rotate and display the point. So:
For Loop1 := 1 to 64 Do
Begin
x1 := x1 + Xstep;
y1 := y1 + Ystep;
z1 := z1 + Zstep;
{ rotate x1,y1,z1 }
{ display point }
End
Easy, huh? This will show a rotating 3d point changing from position
1 to position 2. Now, of course we are not done yet. What we want is
not just 1 morphing 3d point but an entire object changing into
another. To do this, simply store all stepvalues of all 3d points
into an array and do the same thing. So, code for a 100 3d points
could look like:
For Loop1 := 1 to 64 Do { We want 64 steps }
Begin
For Loop2 := 1 to 100 Do { And a 100 3d points }
Begin
x1 := x1 + StepArray[Loop1,1]; { StepArray contains all }
y1 := y1 + StepArray[Loop1,2]; { stepvalues }
z1 := z1 + StepArray[Loop1,3];
{ rotate x1,y1,z1 }
{ display point }
End;
End;
This is practically all there is to it! Just fool around a bit to get
it to work the way you want. Take a look at the example source to see
how things can be done. Luckily, the math behind 3d morphing is
pretty easy. So easy in fact, even I was able to understand it!
And my math really stinks... :)
The example provided needs a lot of optimizing as I wanted to keep it
simple and easy to understand. It should be enough to get you started,
though, and that's what these trainers are all about. Goodluck and if
you encounter any problems, mail me!
Ok, this is all for now. Happy coding!
 Vulture / Outlaw Triad 
 Contact 
Want to contact Outlaw Triad for some reason? You can reach us at our
distrosites in Holland. Or if you have email access, mail us:
Vulture (coder/pr) comma400@tem.nhl.nl
Our internet homepage:
http://www.tem.nhl.nl/~comma400/vulture.html
These internet adresses should be valid at least till june 1996.

Quote: I think ... therefore I am confused...
