06/12/95
nts_pers.txt
ver 0.1 alpha :)
fast perspective-texturemapping
-------------------------------
Everything you read in this text is based on my own experience.
So, it might not even be perspective texturemapping... but it
sure looks A LOT like it ....
If anyone knows this allready exists let me know it please...
BTW :
This is a text to _optimize_ realtime perpective texture mapping
I know the text is poorly written, but hey, it should work...
The inner loop needs 4 ADDs to calc x and y pos in pic
(in opposition to the 2 DIVs and 3 ADDs ? normally used)
PS : you might even call it _Natas mapping_ 8-)
Enjoy... -> Natas
---------------------------------
Thx 2 the followin people :
Nostromo : for the enthousiasm in codin...
Infernus : for .... (you know)
Tempest : the same...
N0rdie : for spurring me 2 follow the lessons ;)
Zephyr : for the utils for Unix & Irc :)
Turbo & Mig : for the booze... (harhar)
Everyone on IRC, especially
Valhalla : sharing ideas about this stuff...
Sdw : showin interest, and motivating me 2 release this ;)
some names...everyone i can remember right now ...
antibyte,distance,flynn,gongo,sleeping dog,ZEPHYR,N0RDiE,
thefear,ALL DUDES FROM NL,bitbyter,zed,zhivago,therew,Davenger,
beam,trug,wiz_nfo,Random,...
if you are not here, than i probably couldn't remember yar name ):
contact me... i'll fix it...
----------------------------------------------
conventions:
(sx,sy) : screenpos
(x1,y1,z1) : point 1
(x2,y2,z2) : point 2
When you know x, y and z you normally do the following calculations :
sx = x / z to get 2d coordinates.
sy = y / z
so, 3d texture mapping would normally be (with only linear functions,
and without any rotation or scaling...) :
x = sx * z
y = sy * z
This works, but is way to slow i think, so maybe THIS IS FASTER....
Let's take a var t, screenpos on the screen (sx)
then we could represent current x,y and z as functions in order to F(t):
x = a * t + b (a = (x2-x1), b = x1 )
y = c * t + d (c = (y2-y1), d = y1 )
z = e * t + f (e = (z2-z1), f = z1 )
Now, let's fill in x and z into the formula x=sx*z
x = (a*t + b) * (e*t + f)
<=> x = a*e*t^2 + (af+be)*t + bf
Now we could simplificate this using ADDs & derived functions:
-> for function (af+be)*t :
F (t) = (af+be)*t
F'(t) = (af+be)
So, each time, we simply add (af+be) to f(t)
example :
x = = 0(af+be)
x = 0 + (af+be) = 1(af+be)
x = (af+be) + (af+be) = 2(af+be)
x = 2(af+be) + (af+be) = 3(af+be)
...
So, the implementation is
+------------------------------+
| x = 0 |
| for t=1 to length do begin |
| dostuff |
| x = x + (af+be) |
| end; |
+------------------------------+
-> Function (a*e*t^2) is harder... here we need 2 derives
F (t) = a*e*t^2
F' (t) = 2*a*e*t
F''(t) = 2*a*e
So here, you need to do the following :
x = = 0 q = = 1*a*e
x = 0 + 1*a*e = 1*a*e q = 1*a*e + 2*a*e = 3*a*e
x = 1*a*e + 3*a*e = 4*a*e q = 3*a*e + 2*a*e = 5*a*e
x = 4*a*e + 5*a*e = 9*a*e q = 5*a*e + 2*a*e = 7*a*e
....
So, the implementation is
+------------------------------+
| x = 0 |
| q = 1*a*e |
| for t=1 to length do begin |
| dostuff |
| x = x + q |
| q = q + 2*a*e |
| end; |
+------------------------------+
-> total implementation of the function will be (for x and y)
+------------------------------+
| x = bf |
| y = df |
| q = a*e |
| r = c*e |
| for t=1 to length do begin |
| dostuff |
| x=x+q+(af+be) |
| y=y+r+(cf+de) |
| q=q+2*a*e |
| r=r+2*c*e |
| end; |
+------------------------------+
-> btw : normally it should be:
x=x+q+(af+be)
y=y+r+(cf+de)
so if you simply add (af+be) and (cf+de) once to q & r,
they won't be needed anymore
+------------------------------+
| x = bf |
| y = df |
| q = a*e + (af+be) |
| r = c*e + (cf+de) |
| for t=1 to length do begin |
| dostuff |
| x=x+q |
| y=y+r |
| q=q+2*a*e |
| r=r+2*c*e |
| end; |
+------------------------------+
So, this should be MUCH ? faster...
Now for the rotation... figure it out yourselves... it's not
really difficult... =)
You can make use -again- of the derived functions...
I don't even need additional calculations / pixel in my routine.
( If you know how to do rotozoom, you know how to do this !!!! )
I hope you can do something with this...
I guess there are still some errs in this txt, but hey, it's a
start !!!
RIGHT NOW YOU SHOULD BE ABLE TO DO A PERSPMAP OF YOUR SCREEN...
TRY TO CONVERT IT INTO A POLY ROUTINE !!!
+-----------------------------------------------------------------+
| NOTE : i've allready worked a perspline routine out in 3D... |
| (only theory, though....): |
| |
| Params : screen(x1,x2,y),pic(x1,x2,y1,y2),3D(z1,z2) |
| |
| important: only mathematical instr, no fixedpoint imple- |
| mentation, stosb, moves,loop cnts,... included |
| |
| Precalc/line : 2 DIV,8 MUL,5 SUB,2 SAL |
| Instr/pixel : 4 ADDS |
| |
| Scanconvert not included...i'll use the same stuff for it...|
+-----------------------------------------------------------------+
| You could accept this overview as a hint... |
| Really easy from here on ;) |
| (if u know some mathematics) |
+-----------------------------------------------------------------+
! IF u use this in any of your stuff, i'd like some greets... !
I guess it's a small effort for the research i did on it...
Companies... contact me first please !
Greetings,
Tom Janssens,
a.k.a. Natas from Digital Labs - Cathedral
--------------------------------------------------------------------------
for comments, questions (a lot i guess),money donations :),...
Address :
Tom Janssens
Gentsesteenweg 202
9620 ZOTTEGEM
BELGIUM
tel: +32-(0)9/360.17.40
if u have any luck, u can find me on IRC, channel #coders, nick
should be "_Natas_"
--------------------------------------------------------------------------
Remember : Only !LAME! people rip without giving credz !!!
Blah... Netsplit detected .... :))
               (
geocities.com/timessquare/2795)                   (
geocities.com/timessquare)