RUSH #01
29 мая 1999

Spectrum programming - Fast 3D-calculations: an advanced algorithm.

<b>Spectrum programming</b> - Fast 3D-calculations: an advanced algorithm.
     Fast 3D-graphics for SPECCY, it really viable? Perhaps the 
following article will reveal to you previously unknown 
possibilities SPECCY and will be useful when working with 
three-dimensional objects. The article is designed to more or 
less trained readers, but may be useful even novice users ...


     Despite some chaotic and
nedoskaznnost flow of information here
described to some extent an outstanding way to work with 3D 
objects in real time. 

     The procedure is remarkable that works very quickly. The 
main essence of this method consists in the fact that rotates 
not each point separately, and immediately the whole

plane.

    This method is useful not only nozhet
to create cool vector effects, but
and for writing new toys. And how
rulez'no will look old vector
game, reworked in the light of recent
koderskih achievements! ... Imagine,
For example, ELITE, running 2-3 times
faster or more smoothly!

     Let us, indeed, to the material,
afforded RUFF'om, even before the
He felt the taste of writing on toys
Amiga and became successful, "kodit" there ...

    A good example illustrating
algorithm described below is the effect of
Download "Hallutinations in Opera" -
Rotating 3-D people, consisting of
some vectors.

Ruff>

     I once read an article in the "ECHO 1
about the withdrawal of 3-D objects. There is described the 
traditional method, which all (who znaet) use. This, of course, 
very interesting turning point around the axes X, Y and Z on

special formulas.


     To rotate around the axis X:

Y '= COS (N) * Y-SIN (N) * Z
Z '= SIN (N) * Y + COS (N) * Z

around the axis Y:
X '= SIN (N) * Z + COS (N) * X
Z '= COS (N) * Z-SIN (N) * X

around the axis Z:
X '= COS (N) * X-SIN (N) * Y
Y '= SIN (N) * X + COS (N) * T

(N - Angle)



   This method has drawbacks. And if
more precisely, one very big drawback -
takes a long time! At operation
multiplication of (what had they not been fast)
and calculating the COS and SIN (even on the table)
takes a long time.

    If we consider the problem with the signs and then
which is usually the object rotates once around
three axes (some even use
BASIC calculator), then there's nothing
choice but to first count
coordinates, and then withdraw graphix.

    Some even loads separately
It is nice BASIC'e coordinates. The same
lamer'stvo! (In some cases).

    However, sometimes vstrechayutsya programmki
with REAL-TIME 3D CALCULATING'om. But how do they
retard!


  ... This was the entry. Now closer to
case. I invented a new way to display 3D
objects. Here are his virtues:

- It is much faster (!!!) vysheopisanogo

  fashion. to calculate the coordinates of one
  fixed point, to about 200 so-
  elements (if desired can be done

  faster).

- 3D object can not only rotate,

  but also to deform (stretch and compress

  and so on.)


    I can not fully bring here
listing of this effect, so bring all
in pieces, which you can build and
supplement who needs what.


    Here's the first piece - the procedure itself
Print 3D objects:

PRINT:


    LD (SAV +1), SP; save SP

    LD SP, ...

; ... - This is the start address of the origin
; Points of a 3D object. At one point 4 bytes
And (3 bytes - the coordinates X, Y, Z; 1 byte, high byte 
Spreadsheets axes (about her ; A bit later) who, incidentally, 
further , Denoted label TABAX).



    EXX

    LD HL, BUFER; Special buffer

                ; Clear the screen

                , (See below)


    LD B, 175; number of points vectors

LP1

; Next comes how to print a single point:


    EXX

    POP BC; in BC - Y, X

    POP HL; in HL - or older. B table

              ; Axes, Z


    LD A, (HL)

    LD E, L

    LD L, B

    INC H

    ADD A, (HL)

    INC H

    LD L, C

    ADD A, (HL)

    ADD A, HX

    LD C, A

    INC H

    LD A, (HL)

    LD L, E

    INC H

    ADD A, (HL)

    LD L, B

    INC H

    ADD A, (HL)

    ADD A, LX

    LD L, A

; Now the coordinates of the points (X and Y screen)
; Computed pomeshrny registers C and L.
; Next comes how to print the point of
; Coordinates in these registers (69 bar)..
; For it needs a special table, so, Who, who does not know of 
such a procedure, , Can use his.


PLOT:

    LD H, TABLE_P

    LD D, (HL)

    INC H

    LD A, (HL)

    INC H

    LD L, C

    ADD A, (HL)

    INC H

    LD E, A

    LD A, (DE)

    OR (HL)

    LD (DE), A

; Well, then. Point printed, we can now
; (If desired) in a special buffer
; Put the address on the screen this point
, (In order then to quickly clean
; Screen using POP HL: LD (HL), 0:
; POP HL: LD (HL), 0: POP HL ...).


    LD A, D

    EXX

    DEC HL; address buffer increases

            ; Up-down (for convenience).

    LD (HL), A

    EXX

    LD A, E

    EXX

    DEC HL

    LD (HL), A


    DJNZ LP1; next point.

SAV LD SP, 0

    RET


    One unusual look team
LD SP, 0: RET, but saves memory.


    I hope you guessed that the procedure itself, in itself 
will not work. MORE need to write a routine cleaning screen

and how to create tables axes. Here I
they do not cite due to the large volume
(Length), which they occupy. Clear the screen of course, I 
could write only haschet that each has its own principles (who

b wrote the installer, who would put everything in
DUP'y, and so on. , etc).. In short, write themselves.

   And as for creating tables with coordinates
axes, the better I will first explain the principle.


        Y ===== ....

         ________________ === ==. .

       / "^! ==. .

      / "*! ===. .

     /> 48! ===. .

    / "*! ===. .

   ! !. * A! ==. .

   ! ! *! === ==. .

   ! ! *! ===== ....

   ! ! *!

   ! ! *! Figure 1

   ! ! *!

   ! "* 32!

   ! _______^________!

   ! 30 /****************>/ X

   ! ^ / * /

   ! / * /

   !/<________________/

  Z


    See Figure 1. You guessed it - a cube. Imagine that inside
It is W-D object. Each point
This object has three coordinate axes of
Y, X and Z. Here the axis is not endless. For example, they may 
consist of 64 points (coordinates). That is, the point can be 
defined by three numbers from 0 to 63.


    And now the fun ...

Take, for example, a point with coordinates
 Y = 48, X = 32, Z = 30. How to find the coordinates
in the screen, when you consider that the Z axis is rotated
as in the picture?

    On each axis point marked with sootvetstvuyuschty 
coordinate. Glaenoe - need learn the Y and X of these points 
and the center (point of intersection of axes) on the screen. 

    Suppose we know them:
 Koordinaty from the upper left corner of Y, X:

 On the axis of Y-70, 1946
 On the axis X-172, 140
 On the axis of Z-180, 1940
 Centre -172.46

To calculate the coordinates of the screen point
"A" apply two simple formulas:

Oboznachim coordinates in the screen (that is, that
above, only the letters instead of numbers):

 On the axis of Y-Yy, Xy
 On the axis X-Yx, Xx
 On the axis of Z-Yz, Xz
 Center-Yc, Xc

Thus, the formula:


    Y = (Yy-Yc) + (Yx-Yc) + (Yz-Yc) + Yc

    X = (Xy-Xc) + (Xx-Xc) + (Xz-Xc) + Xc

Substitute values:


    Y = (70-172) + (172-172) + (180-172) +172 =
= 78

    X = (46-46) + (140-46) + (40-46) +46 = 134

Koordinaty point "A" screen 78.134

The above programm printing 3D Object does exactly that - 
calculated the sum (though a bit differently), printed dot and 
remembers the address on the screen. 

    And what should make the program rasschityvaniya coordinate 
axes? - Of course calculate the coordinates of the axes ... But 
let's first understand with formulas ...


    You probably have long poraskryvali
brackets posokraschali extra coordinates of the center and 
believe that I have not noticed? 

    So, in general, can only be done in
This makes little sense.

    Here's the thing: here the coordinates of each point of the 
axis coordinate of the center is taken away. We return to the 
coordinates of the points axis. You guessed it, will have to 
rely coordinates of all 64 points of axes. And these 
coordinates, we will not count as They have a screen, and the 
center coordinates in screen 0.0. And then will only add the 
coordinates of the center. 

    The procedure itself calculate the coordinates of the axes
does not take much time. I, for example, (if the procedure set 
in the early interruption) Frame Scan will not have time

reached even before the first lines of the screen.

    But for the coordinate axes needed buffer.

    Calculate its length:
One axis, 64 points, that is 128 coordinates.
Total number of axles 3, then all coordinates
128 * 3 = 384 coordinates. One coordinate is one
bytes.

     But in order to accelerate the withdrawal 3D sprite
better coordinates of one axis to keep the 512
bytes (the coordinates of Y-256 bytes, the coordinates
X-256 bytes. Of the 256 bytes used
only 64). Total buffer will 512 * 3 = 1536
bytes. Is not very much.

    Well, now the program itself. Principle
Work will be explained by assuming that as we go. As
already stated above, we expect
coordinate axes so that if the center had
coordinates 0, 0. And then, in the derivation,
add the coordinates of the center. This will save
time. By the way, the coordinates of the center of my
will be stored in the files of the register
pair IX, so that its contents do not change, or save, and then 
restores (my program rasschityvaniya coordinates axes 
associated with the program print 3D sprite pair IX, and the 
contents of the buffer coordinates axes).


AX

    ; Procedure rasschityvaniya coordinates

    ; Axes. Coordinates (in screen)

    ; Extreme points of the axes

    , Are given in the registers of HL ', BC, HL.

    ; Coordinates of the center in DE.

    ; By the way, for those who do not want

    , So that 3D objects are compressed and tensile
    ; Valsya, you can turn to these

    ; 4 points using the formula

    3-D rotation (look up).


TABAX EQU 250 (64000 = 250 * 256)


    ; High byte buffer in which

    ; Calculated coordinate axes.

    ; Address buffer is a multiple of 256 (!!!)


    LD A, E

    SUB 32

    LD E, A

    LD A, L

    SUB 32

    LD L, A

    LD A, C

    SUB 32

    LD C, A

    EXX

    LD A, L

    SUB 32

    LD L, A

    EXX

    LD HX, D; refers st.bayt IX,

    LD LX, E; low byte of IX.

            ; (Undocumented commands

            Processor Z-80. 6 cycles)

    LD A, L

    PUSH AF

    LD A, C

    PUSH AF

    EXX

    LD A, L

    PUSH AF

    EXX

    LD A, H

    PUSH AF

    LD A, B

    PUSH AF

    EXX

    LD A, TABAX

    LD (VAR), A

    LD A, H

    LD B, HX

    CALL K64

    POP AF

    LD B, HX

    CALL K64

    POP AF

    LD B, HX

    CALL K64

    POP AF

    LD B, LX

    CALL K64

    POP AF

    LD B, LX

    CALL K64

    POP AF

    LD B, LX

    CALL K64

    RET



K64

; K64-most important procedure. Called
; The program as much as 6 times. Calculates
, 64 intermediate coordinates. Coordinate, the purpose in the 
register A and the source of B. ; Source we have the center, 
then to B is always ; Coordinate of the center (Y or X). A 
general ; Zdea she only needed to obtain

And the difference (A-B or B-A) and to determine
; Direction (positive or negative, with respect to). So, as the 
coordinates of the center of ; Here, 0, 0, - the address table 
64 bytes (where , Put all the numbers) times 256. His

; Byte given at VAR.
; This byte, by the way, the files of the end of self, small 
increases to 1. ; Tak I figured at first the coordinates of Y,

; Calling this procedure, and then X-s,
; Calling her again. we have three axes,
, So the procedure is called K64 6 times.


    CP B

    JP C, LOOP1

    SUB B

    LD L, A

    LD H, 0

    ADD HL, HL

    ADD HL, HL

    EX DE, HL

    LD HL, 0

LOOP2


    EXX

    LD A, (VAR)

    LD H, A

    INC A

    LD (VAR), A

    LD L, 0

    EXX


    DUP 64, or any loop-type

             ; LD B, 64 :...: DJNZ ...

    LD A, H

    ADD HL, DE

    EXX

    LD (HL), A

    INC L

    EXX


    EDUP


    RET

LOOP1


    LD C, A

    LD A, B

    SUB C

    LD L, A

    LD H, 0

    ADD HL, HL

    ADD HL, HL

    EX DE, HL

    LD HL, 0

LOOP3


    EXX

    LD A, (VAR)

    LD H, A

    INC A

    LD (VAR), A

    LD L, 0

    EXX


    DUP 64, or any loop-type

             ; LD B, 64 :...: DJNZ ...

    SBC HL, DE

    LD A, H

    EXX

    LD (HL), A

    INC L

    EXX


    EDUP


    RET


    CP B

    JP C, LOOP4

    SUB B

    LD L, A

    LD H, 0

    ADD HL, HL

    ADD HL, HL

    EX DE, HL

    LD H, B

    LD L, 0

    JP LOOP2

LOOP4


    LD C, A

    LD A, B

    SUB C

    LD L, A

    LD H, 0

    ADD HL, HL

    ADD HL, HL

    EX DE, HL

    ADD A, C

    LD H, A

    LD L, 0

    JP LOOP3

VAR


    NOP

    NOP


     Well, that's all ...
For those who are without going into all the nuances, or
does not want to further change, to improve this method, and 
wants to write all its own way, some suggestions:



  1. Do not forget about the format of storing the coordinates
    Nat 3D object.

    Do not forget the buffers (coordinate axes,

    delete buffer).

  2. Coordinates of extreme points of the axes (Kz,

    Kx, Ky, and center), consider the formulas

    rotation or by a sine plate.

  3. Algorithm of the program should be vyvyda

    where something like this:


   EI

   HALT

   DI

   CALL PRINT


   Record in the HL ', BC, HL, DE following values
   out of sin.tablitsi (must also take into account

   that they were not too large, otherwise

   sprite can get out of the screen and climb

   On the other hand.


   CALL AX


   Clear the screen using

   DELETE bufer'a.


   It is desirable to adjust everything to work

   with two screens.


   JP BEGIN





Other articles:

AMIGA NEWS - AMIGA OS v3.5 - questions and answers.

AMIGA NEWS - Description of image file viewer - Fast JPEG.

AMIGA NEWS - Programming on the Amiga: Amiga On the inside, Graphics coprocessors Features assembler.

AMIGA NEWS - Events of 1998 (summary of events).

AMIGA NEWS - Cheat'y For Amiga-games: After The War, Magicland Dizzy, Fantasy World Dizzy, Alien Breed, Exolon, Jagar Zj2200, Goblins, Mega Ball, Prince Of Persia, Projects-x, UGH!, Rick Dangerous-2.

AMIGA NEWS - Amiga GFX-chip Permedia2.

AMIGA NEWS - Amiga today.

Spectrum programming - Fast 3D-calculations: an advanced algorithm.

Spectrum programming - Sound effects for a music processor and combine with the main melody.

Spectrum programming - Mirroring bytes and restoration of the background buffer.

Spectrum programming - A brief guide to the system encoder. Tips to author "boot'a", packer, music editor.

Spectrum programming - Modern methods of coding and modern ways of working with graphics.

The End - an epilogue.

ZX-SOFT - "Black Raven II ": Get ready for another hit from Copper Feet!

ZX-SOFT - Description of programs: Real Commander v1.6

ZX-SOFT - arguments about the demo: Forever vs Refresh.

Ator - The authors of the magazine.

Virtual Speccy - Conversion of graphics on the Spectrum to the PC and Amiga.

Virtual Speccy - The emulator of CodeBusters on the Amiga.

Virtual Speccy - Emulators ZX-SPECTRUM on the PC: Where to get the latest FAQ on emulating ZX-Spectrum, What Emulators are most useful - an emulator Luntera, UKV v1.2, Shalaev. What kind of files with the extension *. $ b, *. $ c, *. $ s, *. $ z, *. $ w? How to read format "hobeta". How and in what emulator You can work in the iS-DOS. Convert files. Z80 to. $ and vice versa. Files with the extension. Fdi. Problems with the emulator UKV. How to get a clean disk image file (. Trd) Emulator Shalaev. Is there a Russian ZX-oriented FTP or WWW server? Hobeta refuses to read / write drives 3.5 "- what to do?

Entry - the story of creating a magazine.

Entry - On order stsenovogo magazine - RUSH.

Interview - A great interview with ANTARES.

Interview - An Interview with Kvazar'om of RUSH.

Interview - An interview with a group of Vitebsk Power group.

Informatsrium - CD with the emulator and the ZX-software.

Informatsrium - Interesting INTERNET addresses.

Informatsrium - Overview of magazines and books about the Amiga.

Journal - Platformobesie - cross-platform wrapper for the magazine.

Parallel Worlds - The history of central processors and Windows.

Parallel Worlds - an overview of the computer models Macintosh.

Development Spectrum - 128 colors on the Spectrum (graphic description of the expansion of the palette).

Development Spectrum - Lock the keyboard port when connecting SPECCY C-DOS modem.

Development Spectrum - New Speccy - AZXMONSTRUM 512K.

Development SPECTRUM - New Spectrum from Sinclair.

Development Spectrum - The descendants of the processor Z80.

Advertising - a detailed price list of firm Scorpio.

Advertising - Advertisements and announcements ...

Advertising - Advertising Company X-Trade.

meaning without a sense - Short Stories: The happiest man, third eye, the Savior of the Universe, Tsvetik-semitsvetik, Life has just begun, the Last Judgement.

Scene vs professional - has assembled a team of the best people from the scene, we can create programs of the highest quality ...

Stsenohroniya - tenacious Spectrum: Spectrum of roads, most of us. Why?

Stsenohroniya - A brief overview of news from the band RUSH.

Stsenohroniya - Overview of the stage-event: Alliance, Alchemist Research, Asphyxia, Brokimsoft, CodeBusters, Concern Chaos, Copper Feet, Crystal Dream, Digital Reality, E0Mage, Energy Minds, Entire, Excess, Fatality etc.

Stsenohroniya - Echoes Fun Top'98.

Stsenohroniya - Draft Long Live Amiga, designed to assist the establishment and development amigovskoy scene.

Office shell - on the ZX version of the shell.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
Some Official-1 - the story of the Perm group "Light Future".
Miscellaneous - Electronic Samizdat: A few words about a new kind of software - Electronic books.

В этот день...   21 November