Articles

PARTICLE SYSTEMS

Introduction

Hi, I feel I should start this tutorial with a short introduction to who I am. My name is Chris Gilbert and I have been programming for around the past 5 years. My ventures into programming started in the days of DOS with nothing more complex than batch file writing and dabbling in QBasic. Then I got a copy of Visual Basic and stuck to VB for a few years when about 2 years ago I came across C++ for the first time. I now develop almost entirely in C++.

POLYGON CLASSES

This Article

If you have ever worked on a 3D app/game, you will know the importance of the 3D polygon structure. If you have never worked on a 3D app or game, then you might been having a few worries about how to organise such an important structure. This tutorial will describe how a polygon structure should work, what to do and not, and will provide a base for other more advanced tutorials.

CAMERA CLASS TUTORIAL

Step 1: Planning

That's right we're not jumping right into code but I promise we will eventually. Before we start programming our camera class we should figure out what sort of stuff we want it to do. When I started writing this class I came up with a list something like this...

MSDN VIRTUAL-KEY CODES

HTML: Jeff Molofee
Symbolic Constant Name Hexadecimal Value Mouse Or Keyboard Equivalent
VK_LBUTTON 01 Left mouse button
VK_RBUTTON 02 Right mouse button
VK_CANCEL 03 Control-break processing
VK_MBUTTON 04 Middle mouse button (three-button mouse)
VK_XBUTTON1 05 Windows 2000: X1 mouse button
VK_XBUTTON2 06 Windows 2000: X2 mouse button
— 07 Undefined
VK_BACK 08 BACKSPACE key
VK_TAB 09 TAB key
— 0A–0B Reserved
VK_CLEAR 0C CLEAR key
VK_RETURN 0D ENTER key
— 0E–0F Undefined
VK_SHIFT 10 SHIFT key
VK_CONTROL 11 CTRL key
VK_MENU 12 ALT key
VK_PAUSE 13 PAUSE key
VK_CAPITAL 14 CAPS LOCK key
VK_KANA 15 IME Kana mode
VK_HANGUEL 15 IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL 15 IME Hangul mode
— 16 Undefined
VK_JUNJA 17 IME Junja mode
VK_FINAL 18 IME final mode
VK_HANJA 19 IME Hanja mode
VK_KANJI 19 IME Kanji mode
— 1A Undefined
VK_ESCAPE 1B ESC key
VK_CONVERT 1C IME convert
VK_NONCONVERT 1D IME nonconvert
VK_ACCEPT 1E IME accept
VK_MODECHANGE 1F IME mode change request
VK_SPACE 20 SPACEBAR
VK_PRIOR 21 PAGE UP key
VK_NEXT 22 PAGE DOWN key
VK_END 23 END key
VK_HOME 24 HOME key
VK_LEFT 25 LEFT ARROW key
VK_UP 26 UP ARROW key
VK_RIGHT 27 RIGHT ARROW key
VK_DOWN 28 DOWN ARROW key
VK_SELECT 29 SELECT key
VK_PRINT 2A PRINT key
VK_EXECUTE 2B EXECUTE key
VK_SNAPSHOT 2C PRINT SCREEN key
VK_INSERT 2D INS key
VK_DELETE 2E DEL key
VK_HELP 2F HELP key
'0' 30 0 key
'1' 31 1 key
'2' 32 2 key
'3' 33 3 key
'4' 34 4 key
'5' 35 5 key
'6' 36 6 key
'7' 37 7 key
'8' 38 8 key
'9' 39 9 key
— 3A–40 Undefined
'A' 41 A key
'B' 42 B key
'C' 43 C key
'D' 44 D key
'E' 45 E key
'F' 46 F key
'G' 47 G key
'H' 48 H key
'I' 49 I key
'J' 4A J key
'K' 4B K key
'L' 4C L key
'M' 4D M key
'N' 4E N key
'O' 4F O key
'P' 50 P key
'Q' 51 Q key
'R' 52 R key
'S' 53 S key
'T' 54 T key
'U' 55 U key
'V' 56 V key
'W' 57 W key
'X' 58 X key
'Y' 59 Y key
'Z' 5A Z key
VK_LWIN 5B Left Windows key (Microsoft Natural Keyboard)
VK_RWIN 5C Right Windows key (Microsoft Natural Keyboard)
VK_APPS 5D Applications key (Microsoft Natural Keyboard)
— 5E Reserved
VK_SLEEP 5F Computer Sleep key
VK_NUMPAD0 60 Numeric keypad 0 key
VK_NUMPAD1 61 Numeric keypad 1 key
VK_NUMPAD2 62 Numeric keypad 2 key
VK_NUMPAD3 63 Numeric keypad 3 key
VK_NUMPAD4 64 Numeric keypad 4 key
VK_NUMPAD5 65 Numeric keypad 5 key
VK_NUMPAD6 66 Numeric keypad 6 key
VK_NUMPAD7 67 Numeric keypad 7 key
VK_NUMPAD8 68 Numeric keypad 8 key
VK_NUMPAD9 69 Numeric keypad 9 key
VK_MULTIPLY 6A Multiply key
VK_ADD 6B Add key
VK_SEPARATOR 6C Separator key
VK_SUBTRACT 6D Subtract key
VK_DECIMAL 6E Decimal key
VK_DIVIDE 6F Divide key
VK_F1 70 F1 key
VK_F2 71 F2 key
VK_F3 72 F3 key
VK_F4 73 F4 key
VK_F5 74 F5 key
VK_F6 75 F6 key
VK_F7 76 F7 key
VK_F8 77 F8 key
VK_F9 78 F9 key
VK_F10 79 F10 key
VK_F11 7A F11 key
VK_F12 7B F12 key
VK_F13 7C F13 key
VK_F14 7D F14 key
VK_F15 7E F15 key
VK_F16 7F F16 key
VK_F17 80H F17 key
VK_F18 81H F18 key
VK_F19 82H F19 key
VK_F20 83H F20 key
VK_F21 84H F21 key
VK_F22 85H F22 key
VK_F23 86H F23 key
VK_F24 87H F24 key
— 88–8F Unassigned
VK_NUMLOCK 90 NUM LOCK key
VK_SCROLL 91 SCROLL LOCK key
  92–96 OEM specific
— 97–9F Unassigned
VK_LSHIFT A0 Left SHIFT key
VK_RSHIFT A1 Right SHIFT key
VK_LCONTROL A2 Left CONTROL key
VK_RCONTROL A3 Right CONTROL key
VK_LMENU A4 Left MENU key
VK_RMENU A5 Right MENU key
VK_BROWSER_BACK A6 Windows 2000: Browser Back key
VK_BROWSER_FORWARD A7 Windows 2000: Browser Forward key
VK_BROWSER_REFRESH A8 Windows 2000: Browser Refresh key
VK_BROWSER_STOP A9 Windows 2000: Browser Stop key
VK_BROWSER_SEARCH AA Windows 2000: Browser Search key
VK_BROWSER_FAVORITES AB Windows 2000: Browser Favorites key
VK_BROWSER_HOME AC Windows 2000: Browser Launch and Home key
VK_VOLUME_MUTE AD Windows 2000: Volume Mute key
VK_VOLUME_DOWN AE Windows 2000: Volume Down key
VK_VOLUME_UP AF Windows 2000: Volume Up key
VK_MEDIA_NEXT_TRACK B0 Windows 2000: Next Track key
VK_MEDIA_PREV_TRACK B1 Windows 2000: Previous Track key
VK_MEDIA_STOP B2 Windows 2000: Stop Media key
VK_MEDIA_PLAY_PAUSE B3 Windows 2000: Play/Pause Media key
VK_LAUNCH_MAIL B4 Windows 2000: Launch Mail key
VK_LAUNCH_MEDIA_SELECT B5 Windows 2000: Select Media key
VK_LAUNCH_APP1 B6 Windows 2000: Launch Application 1 key
VK_LAUNCH_APP2 B7 Windows 2000: Launch Application 2 key
— B8-B9 Reserved
VK_OEM_1 BA Windows 2000: for the US standard keyboard, the ';:' key
VK_OEM_PLUS BB Windows 2000: for any country/region, the '+' key
VK_OEM_COMMA BC Windows 2000: for any country/region, the ',' key
VK_OEM_MINUS BD Windows 2000: for any country/region, the '-' key
VK_OEM_PERIOD BE Windows 2000: for any country/region, the '.' key
VK_OEM_2 BF Windows 2000: for the US standard keyboard, the '/?' key
VK_OEM_3 C0 Windows 2000: for the US standard keyboard, the '`~' key
— C1–D7 Reserved
— D8–DA Unassigned
VK_OEM_4 DB Windows 2000: for the US standard keyboard, the '[{' key
VK_OEM_5 DC Windows 2000: for the US standard keyboard, the '\|' key
VK_OEM_6 DD Windows 2000: for the US standard keyboard, the ']}' key
VK_OEM_7 DE Windows 2000: for the US standard keyboard, the 'single-quote/double-quote' key
VK_OEM_8 DF  
— E0 Reserved
  E1 OEM specific
VK_OEM_102 E2 Windows 2000: either the '<>' key or the '\|' key on the RT 102-key keyboard
  E3–E4 OEM specific
VK_PROCESSKEY E5 Windows 95, Windows NT 4.0, and Windows 2000: IME PROCESS key
  E6 OEM specific
VK_PACKET E7 Windows 2000: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. The Unicode character is the high word.
— E8 Unassigned
  E9–F5 OEM specific
VK_ATTN F6 Attn key
VK_CRSEL F7 CrSel key
VK_EXSEL F8 ExSel key
VK_EREOF F9 Erase EOF key
VK_PLAY FA Play key
VK_ZOOM FB Zoom key
VK_NONAME FC Reserved for future use
VK_PA1 FD PA1 key
VK_OEM_CLEAR FE Clear key

 

HOW TO DETERMINE IF A POINT IS IN A TRIANGLE PLANE

First off we have a triangle below with a point in it.

We all see that the point is in the plane but how do we make the computer realize this?

At this point we only use the x and y coordinates to determine if the point is in the plane.
We can create three new triangles using the point as in the picture below.
I have given each corner of the original triangle coordinates as have I given the point one.
The triangle could have z coordinates too but we ignore these right now.
I have named the sides of our first sub triangle to a, b, c as have I named the angle between b and c to A.

This could be called the XY plane.
As we all know a complete circle is 360 degrees or 2p.
The angle A is represented by the segment of the dotted circle that’s inside the sub triangle.
The goal is to calculate the angle A for each sub triangle and if the point actually is in the triangle plane the sum of all the angles A should be 360 degrees or 2p

But how to calculate the length of the sides a, b, c?

To calculate the distance between two point you use the formula

So to determine the length of side a it would go like this

and side b

side c

And now how to finally determine the angle A we use the formula

We have the length of all the sides in the sub triangle so we just put them in there.

So now we have the angle of the first sub triangle and we just repeat the calculations for all the sub triangles.
If we add them all together the result should be 360 degrees if the point actually is in the triangle plane.

Now you may ask, but I wanna test in 3D so what about the z axis? Look at the picture below. It is the same triangle as before but now where looking at it from above.

We use the same calculations but now we put in the z coordinate instead of the y coordinate.

This could be called the XZ plane and calculate it just like the XY plane.

The same goes for the ZY plane that could look like this “looking at the triangle from the side” as you may suspect we use the z and y coordinates to make up our triangle.

Finally

If you calculate all of the angles in each plane and if the sum off the angles in each plane is 360 degrees then the point is actually in the triangle plane.
Remember: treat each plane as a simple triangle.

 

Additional Information

 

By: Alex Bijamov

I beleive the author's aim is to determine if the point is in "triangle's plane", while it can be both "inside and outside of the triangle". In this case, I don't think there is a need to use such time-consuming operations as: sqr() sqrt() and cos(), which are actually used.

Using the notation used in the article, let me introduce the slightly different method, that is used in analytical geometry. It is pretty simple and deals only with some multiplications: Say, the triangle is given by the three points:

A ( xA, yA, zA)
B ( xB, yB, zB)
C ( xC, yC, zC)

and we want to determine if the point

M ( x, y, z)

is inside that triangle.

It is necessary (and more than enough) for the three vectors "MA", "MB" and "MC" to be co-planar. That is - one of them is a certain linear combination of others.

From analytical geometry we know, that 3 vectors are co-planar if:

|x-xA     y-yA     z-zA|
|x-xB     y-yB     z-zB| = 0
|x-xC     y-yC     z-zC|

(that is: det((MA)...,(MB)...,(MC)...)=0)

But to calculate a 3x3 determinant very few calculations are needed! Something like 12 multiplications and 6 sumations. After that we have to calculate the deviation of the result from 0 (like in the article we calculate the deviation of the total angle from 360 deg) to find out if the point is inside the triangle plane!

That's all about it! So instead of calculating the unnecessary information about triangles, sides, lengths, angle sizes, etc for 4 triangles, we only calculate a 3x3 determinant!

This can also be used to determine if the point is "inside" the triangle and so on...

- Christian Westman