The former hoster's ad banner lost to time.

Model designer's page

TOC

jDoom definitions tricks
MD2 modelling tutorials
Tools
Monster states list

jDoom's definition tricks

(Results of my hard experience)

1. If you use "Copy model", in next state after you're used Inter, you should put "Inter = 0", or Inter value from pevious model frame will be used (Don't forget, "Copy model" copies really ALL properties of previous model frame, including "Inter"!)!
    It is very important, because else you would be in big trouble: If there no "Inter=0" frame, Doomsday just silently going crazy, and you'll get nice things, like monster models stretched from their location right to your face, or chaotically shaking instead of moving properly.
    So, don't confuse Doomsday! Set Inter to 0, like in this example:
CORRECT:
Copy Model {State = "CYBER_DIE3";
                     Md2 {frame = "die3";};}
Copy Model {Inter = 0.5;
                      Md2 {frame = "die34";};}
Copy Model {State = "CYBER_DIE4";
                      Inter = 0;
                      Md2 {frame = "die4";};}

WRONG:
Copy Model {State = "CYBER_DIE3";
                     Md2 {frame = "die3";};}
Copy Model {Inter = 0.5;
                      Md2 {frame = "die34";};}
Copy Model {State = "CYBER_DIE4";
                      Md2 {frame = "die4";};}
#Inter = 0.5 will be used... Crash!

2. Watch carefully, that DED file not ends with comment! In this case, comment-skipping code wil just enter infinite loop, and you'll guess endlessly, why Doomsday hangs at startup...

MD2 modeling tutorials

http://www.loonygames.com/content/1.13/totb/
http://www.geocities.com/darinp52/qtip/index.html
http://www.planetquake.com/polycount/cottages/shadokat/q2mtut.html
http://www.planetquake.com/polycount/articles/Steed-gdc99/steed-gdc99-1.shtml
(comment: don't use "weld vertexes" in Q2Modeller - it works incorrectly there, and not deletes any vertices or polygons but just "glues" them together... and use SkyJake's md2tool to delete double vertices. you also can use md2tool to decrease polycount of your model)
http://www.planetquake.com/polycount/resources/quake2/tutorials.shtml


Tools

(If some link here will appear broken - please, tell me, I'll correct it.)

At first, the SkyJake's md2tool

(search for it at DHQ)
Can convert MD2s to DMDs and automatically decrease polcount - a "must have" thing!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

Cheb's MD2 viewer (beta #1)

    I'm still a newbie in OpenGL programming, so this program probably may do many merry things, including system crashes or OpenGL driver lockups - use it with caution.
    Also it cannot read PCX skins in old format (those from initial ZDoom model pack) and cannot use skins which dimensions are not power of 2 (Doomsday can)
    And it still cannot view multiple MD2s at once (i.e. you cannot view multipart monsters) - i will correct this in the future.

A level, containing things of all types (MAP01)  (has one bug: the only type of things that it DOES NOT CONTAIN is Revenant).

NPherno's Skin Tool

 - For easy per-vertex editing of skin mapping.

Warning: at startup it always tries to load model, on which you're worked last, and may crash if you've removed that file, or it has no skins defined, or wrong size of skin - use Q2Modeller to correct skin sizes and file names

Quake2Modeller v0.91

 - can properly display skins with any palette, but cannot play model animation.

Older version of Quake2Modeller(v0.90)

 - cannot properly display skins with palette other than one of Quake2, but can play model animation (on any speed and with inter-frame interpolation)


Severe bugs list:
1. (Nasty) After you rotated 3d-view, each first attempt to move vertices forces them to "jump" in a random direction. Watch out, and hold your fingers over Ctrl-Z keys (undo). Second attempt always works well.
2. (Dangerous) Often crashes at deleting vertices (especially if 3d view is set to "textured")
3. (Dangerous) Sometimes crashes at switching 3d-view to "Textured", and often crashes at loading model if 3d view is set to "textured".
4. (Dangerous) in v0.91, attempt to play animation writes some frames over other ones - DON'T TRY USING IT!  Use only in v0.90.
5. (Dangerous) in v0.91, loading reference model causes frame #0 to be replaced with some other frame.
6. (Annoying) At exporting MD2, you each time must select all skins that model uses.
7. (Disadvantage) AQM files (native Q2Modeller's format, that not adds quantization errors, and MUST be used for saving the work-in-progress) from v0.90 and v.091 are not compatible...  :(


Important keys:
Shift: pan views (synchronously, and it's great!)  or rotate 3d-view by left mouse button, or zoom views by right mouse button.
Also, when pressing "shift" you can drag the view's border (clicking on central intersection), thus resizing wiews.
Alt: substractive selection mode (else additive)

Tips
1. 3d view is always aimed at point, defined by center position of 2d views, and rotates around this point. Great for aiming at part of the model, and rotating around it!
2. To copy part of one model to another model, you may copy-load-paste (unfortunately, Q2Modeler not uses Windows clipboard)
3. There is a great thing: support of reference models (good for synchronising multipart models), but it works properly only if all numbers, names and total number of frames in both models are equal. And often crashes at loading of reference model - be careful, save often (.AQM, of course, to not accumulate quantization distortions)

Warnings:
1. Make sure, that "base path" in "directories" settings is set to folder, containing model that you currently editing (to leave skin path empty), or jDoom will not find skins.
2. option "weld vertices" don't makes one vertex from them, and don't deletes faces using them! It just sets same coordinates for them - so be careful, don't spawn "triple" vertices and zero-size triangles, that will just unnecessarily strain the game engine

MilkShape 3d

- much worse than Q2Modeller, but knows a lot of file formats, and has ability of skeletal animation. It is 30-day shareware with very good crack protection.
A good tutorial about how to use MilkShape for skeletal animation may be found somewhere on the polycount website.

Warnings:
1. Cannot import animated model. Can import only single frame - you should made full skeletal animation yourself.
2. Exported MD2s couldn't be instantly used by jDoom, they are rotated 90degrees clockwise and haven't skins defined. You should open such MD2 in Q2Modeller, rotate (use "Effect frame range" to rotate all frames at once), and create skins. Only then Milkshape product will become the valid MD2.

Sources of my work

    Mancubus (163K) - MilkShape model with skeletal animation (about 250 frames). Don't forget to set animation length to 273 frames before loading it, or MilkShape will cut off all frames except of first 30.

    Imp (70K) - MilkShape model with skeleton (slightly raw, because I finished imp model later in Q2Modeller), but at least it has skeleton

Monster states list

here, if state name is spelled as "CYBER_", then further calling "DIE8(10)14" will mean "State CYBER_DIE8 is 10 game tic long and is presented by 14th sprite frame" - and so on.

Cyberdemon (sprite CYBR)

name: CYBER_
idle: STND(10) - STND2(10) - STND
(if state is not followed by "(<tic length>)", it means that it is defined elsewhere, and cited here only for show state sequence. Also, I don't cite sprite frames for idle states here.)
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3 - RUN1
pain: PAIN(10)6 - RUN1
attack: ATK1(6)4 - ATK2(12)5* - ATK3(12)4 - ATK4(12)5* - ATK5(12)4 - ATK6(12)5* - RUN1
(* means "full-bright sprite")
death: DIE1(10)7 - DIE2(10)8 - DIE3(10)9 - DIE4(10)10 - DIE5(10)11 - DIE6(10)12 - DIE7(10)13 - DIE8(10)14 - DIE9(30)15 - DIE10(-1)15.
(tic length of -1 means "final state of infinite durability")

Demon / Spectre (sprite SARG)

name: SARG_
idle: STND(10) - STND2(10) - STND
run: RUN1(2)0 - RUN2(2)0 - RUN3(2)1 - RUN4(2)1 - RUN5(2)2 - RUN6(2)2 - RUN7(2)3 - RUN8(2)3 - RUN1
pain: PAIN(2)7 - PAIN2(2)7 - RUN1
attack: ATK1(8)4 - ATK2(8)5 -ATK3(8)6 - RUN1
death: DIE1(8)8 - DIE2(8)9 - DIE3(4)10 - DIE4(4)11 - DIE5(4)12 - DIE6(-1)13
raise: RAISE1(5)13 - RAISE2(5)12 - RAISE3(5)11 - RAISE4(5)10 - RAISE5(5)9 - RAISE6(5)8 - RUN1

Keen (sprite KEEN)

name: (variable, so states are cited here with their full names)
idle: KEENSTND(-1)0
pain: KEENPAIN(4)12 - KEENPAIN2(8)12 - KEENSTND
death: COMMKEEN(6)0 - COMMKEEN2(6)1 - COMMKEEN3(6)2 - COMMKEEN4(6)3 - COMMKEEN5(6)4 - COMMKEEN6(6)5 - COMMKEEN7(6)6 - COMMKEEN8(6)7 - COMMKEEN9(6)8 - COMMKEEN10(6)9 - COMMKEEN11(6)10 - COMMKEEN12(-1)11

Zombie (sprite POSS)

name: POSS_
idle: STND(10) - STND2(10) - STND
pain: PAIN(3)6 - PAIN2(3)6 - RUN1
death: DIE1(5)7 - DIE2(5)8 - DIE3(5)9 - DIE4(5)10 - DIE5(-1)11
xdeath: XDIE1(5)12 - XDIE2(5)13 - XDIE3(5)14 - XDIE4(5)15 -XDIE5(5)16 -XDIE6(5)17 - XDIE7(5)18 - XDIE8(5)19 - XDIE9(-1)20
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
attack: ATK1(10)4 - ATK2(8)5* - ATK3(8)4 - RUN1
raise: RAISE1(5)10 - RAISE2(5)9 - RAISE3(5)8 - RAISE4(5)7 - RUN1

Sargeant (sprite SPOS)

name: SPOS_
idle: STND(10) - STND2(10) - STND
pain: PAIN(3)6 - PAIN2(3)6 - RUN1
death: DIE1(5)7 - DIE2(5)8 - DIE3(5)9 - DIE4(5)10 - DIE5(-1)11
xdeath: XDIE1(5)12 - XDIE2(5)13 - XDIE3(5)14 - XDIE4(5)15 -XDIE5(5)16 -XDIE6(5)17 - XDIE7(5)18 - XDIE8(5)19 - XDIE9(-1)20
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
attack: ATK1(10)4 - ATK2(10)5* - ATK3(10)4 - RUN1
raise: RAISE1(5)10 - RAISE2(5)9 - RAISE3(5)8 - RAISE4(5)7 -  RUN1

Chaingun guy (sprite CPOS)

name: CPOS_
idle: STND(10) - STND2(10) - STND
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
attack: ATK1(10)4 - ATK2(4)5* - ATK3(4)4* - ATK4(1)5 - ATK2
pain: PAIN(3)6 - PAIN2(3)6 - RUN1
death: DIE1(5)7 - DIE2(5)8DIE3(5)9 - DIE4(5)10 - DIE5(5)11 - DIE6(5)12 - DIE7(-1)13
xdeath: XDIE1(5)14 - XDIE(5)15 -XDIE3(5)16 - XDIE4(5)17 - XDIE5(5)18 - XDDIE6(-1)19
raise: RAISE1(5)13 - RAISE2(5)12- RAISE3(5)11 - RAISE4(5)10 - RAISE5(5)9 - RAISE6(5)8 - RAISE7(5)7 - RUN1


Imp (sprite TROO)

name: TROO_
idle: STND(10) - STND2(10) - STND
pain: PAIN(2)7 - PAIN2(2)7 - RUN1
death: DIE1(8)8 - DIE2(8)9 - DIE3(6)10 - DIE4(6)11 - DIE5(-1)12
xdeath: XDIE1(5)13 - XDIE2(5)14 - XDIE3(5)15 - XDIE4(5)16 -XDIE5(5)17 -XDIE6(5)18 - XDIE7(5)19 - XDIE8(-1)20
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
attack: ATK1(8)4 - ATK2(8)5 - ATK3(6)6 - RUN1
raise: RAISE1(8)12 RAISE2(8)11 - RAISE3(6)10 - RAISE4(6)9 - RAISE5(6)8 - RUN1

Arachnotron (sprite BSPI)

name: BSPI_
idle: STND(10) - STND2(10) - STND
see: SIGHT(20)0 - RUN1
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2  - RUN7(3)3 - RUN8(3)3 - RUN9(3)4 - RUN10(3)4 - RUN11(3)5 - RUN12(3)5
pain: PAIN(3)8 - PAIN2(3)8 - RUN1
attack: ATK1(20)0* - ATK2(4)6* - ATK3(4)7* - ATK4(1)7* - ATK2
death: DIE1(20)9 - DIE2(7)10 - DIE3(7)11 - DIE4(7)12 - DIE5(7)13 - DIE6(7)14 - DIE7(-1)15
raise: RAISE1(5)15 - RAISE2(5)14 - RAISE3(5)13 - RAISE4(5)12 - RAISE5(5)11 - RAISE6(5)10  - RAISE7(5)9 - RUN1

Mancubus (sprite FATT)

name: FATT_
idle: STND(15) - STND2(15) - STND
run: RUN1(4)0 - RUN2(4)0 - RUN3(4)1 - RUN4(4)1 - RUN5(4)2 - RUN6(4)2 - RUN7(4)3 - RUN8(4)3 - RUN9(4)4 - RUN10(4)4 - RUN11(4)5 - RUN12(4)5 - RUN1
attack: ATK1(20)6 - ATK2(10)7* - ATK3(5)8 - ATK4(5)6 - ATK5(10)7* - ATK6(5)8 - ATK7(5)6 - ATK8(10)7* - ATK9(5)8 - ATK10(5)6 - RUN1
pain: PAIN(3)9 - PAIN2(3)9 - RUN1
death: DIE1(6)10 - DIE2 (6)11 - DIE3(6)12 - DIE4(6)13 - DIE5(6)14 - DIE6(6)15 - DIE7(6)16 - DIE8(6)18 - DIE9(6)18 - DIE10(-1)19
raise: RAISE1(5)17 - RAISE2(5)16 - RAISE3(5)15 - RAISE4(5)14 - RAISE5(5)13 - RAISE6(5)12 - RAISE7(5)11 - RAISE8(5)10 - RUN1


Baron of hell (sprite BOSS)

name: BOSS_
idle: STND(10) - STND2(10) - STND
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
pain: PAIN(2)7 - PAIN2(2)7  - RUN1
attack:  ATK1(8)4 - ATK2(8)5 - ATK3(8)6 - RUN1
death:  DIE1(8)8 - ... - DIE7(-1)14
raise: RAISE1(8)14 - ... - RAISE7(8)8 - RUN1

Knight of hell (sprite BOS2)

name: BOS2_
idle: STND(10) - STND2(10) - STND
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
pain: PAIN(2)7 - PAIN2(2)7  - RUN1
attack:  ATK1(8)4 - ATK2(8)5 - ATK3(8)6 - RUN1
death:  DIE1(8)8 - ... - DIE7(-1)14
raise: RAISE1(8)14 - ... - RAISE7(8)8 - RUN1

Pain elemental (sprite PAIN)

name: PAIN_
idle: STND(10)0 - STND
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN1
pain: PAIN(6)6 - PAIN2(6)6 - RUN1
attack: ATK1(5)3 - ATK2(5)4 - ATK3(5)5* - ATK4(0)5* - RUN1
death: DIE1(8)7* - DIE2(8)8* - DIE3(8)9* - DIE4(8)10* - DIE5(8)11* - DIE6(8)12* - NULL
raise: RAISE1(8)12 - ... - RAISE6(8)7 - What a stupidity! He cannot be raised because after explosion he turns to NULL, and thus, has no corpse!

Lost soul (sprite SKUL (note: with one "L"!))

name: SKULL_ (note: with two "L"s!)
idle: STND(10)0* - STND2(10)1*
run: RUN1(6)0* - RUN2(6)1* - RUN1
pain: PAIN(3)4* - PAIN2(3)4*
attack: ATK1(10)2* - ATK2(4)3* - ATK3(4)2* - ATK4(4)3* - ATK3
death: DIE1(6)5* - ... - DIE4(6)8* - DIE5(6)9 - DIE6(6)10 - NULL

Cacodemon (sprite HEAD)

name: HEAD_
idle: STND(10)0 - STND
run: RUN1(3)0 - RUN1
pain: PAIN(3)4 - PAIN2(3)4 - PAIN3(6)5
attack: ATK1(5)1 - ATK2(5)2 - ATK3(5)3* - RUN1
death: DIE1(8)6 - ... - DIE5(8)10 - DIE6(-1)11
raise: RAISE1(8)11 - ... - RAISE6(8)6

Spider-mastermind (sprite SPID)

name: SPID_
idle: STND(10) - STND2(10) - STND
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3 - RUN9(3)4 - RUN10(3)4 - RUN11(3)5 - RUN12(3)5 - RUN1
pain: PAIN(3)8 - PAIN2(3)8 - RUN1
attack: ATK1(20)0* - ATK2(4)6* - ATK3(4)7* - ATK4(1)7* - ATK2
death: DIE1(20)9 - DIE2(10)10 - DIE3(10)11 - DIE4(10)12* - DIE5(10)13* - ... - DIE9(10)17* - DIE10(30)18 - DIE11(-1)18

Wolf SS (sprite SSWV)

name: SSWV_
idle: STND(10) - STND2(10) - STND
pain: PAIN(3)7 - PAIN2(3)7 - RUN1
death: DIE1(5)8 - DIE2(5)9 - DIE3(5)10 - DIE4(5)11 - DIE5(-1)12
xdeath: XDIE1(5)13 - XDIE2(5)14 - XDIE3(5)15 - XDIE4(5)16 -XDIE5(5)17 -XDIE6(5)18 - XDIE7(5)19 - XDIE8(5)20 - XDIE9(-1)21
run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 - RUN7(3)3 - RUN8(3)3
attack: ATK1(10)4 - ATK2(10)5 - ATK3(4)6* - ATK4(6)5 - ATK5(4)6* - ATK6(1)5 - ATK2
raise: RAISE1(5)12 - RAISE2(5)11 - RAISE3(5)10 - RAISE4(5)9 - RAISE5(5)8 - RUN1

Revenant (sprite SKEL)

name: SKEL_
idle: STND(10) - STND2(10) - STND
run: RUN1(2)0 - RUN2(2)0 - RUN3(2)1 - RUN4(2)1 - RUN5(2)2 - RUN6(2)2 - RUN7(2)3 - RUN8(2)3 - RUN9(2)4 - RUN10(2)4 - RUN11(2)5 - RUN12(2)5 - RUN1
melee attack: FIST1(0)6 - FIST2(6)6 - FIST3(6)7 - FIST4(6)8 - RUN1
missile attack: MISS1(0)9* - MISS2(10)9* - MISS3(10)10 - MISS4(10)10 - RUN1
pain: PAIN(5)11 - PAIN2(5)11 - RUN1
death: DIE1(7)11 - ... - DIE5(7)15 - DIE6(-1)16
raise: RAISE1(5)16 - ... - RAISE6(5)11 - RUN1

Boss cube (sprite BOSF)

SPAWN1(3)0* - SPAWN2(3)1 - SPAWN3(3)2 - SPAWN4(3)3 - SPAWN1