E D R , A S I H C RSS

D3D

์ž‘์„ฑ์ž: ๊น€์˜ํ˜„(erunc0), ์ตœ๊ด‘์‹(woodpage)

"Advanced 3D Game Programming using DirectX" - study.


GameLibrary( http://www.zeropage.org/~erunc0/study/d3d/GameLib.zip )๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ€๋ฉด์„œ ์ฑ…์˜ ๋‚ด์šฉ์„ ๋ณธ๋‹ค๋Š”.. ๋ญ๋ญ๋ญ..

๋ง๋งŒ ๊ทธ๋ ‡์ง€, library๋ถ€๋ถ„์€ ๋Œ€์ถฉ ํ•˜๋Š” ๋А๋‚Œ์ด ๋“œ๋Š”๊ฑด ์™œ์ธ์ง€.

๋ญ, library๋ถ€๋ถ„์€ api ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด ๋ถ€๋ถ„์ •๋„์ด๊ณ , DX ๋„ ์—ญ์‹œ ์ดˆ๊ธฐํ™” ๋ถ€๋ถ„์ •๋„๋ฅผ

๋ฌถ์–ด ๋†“์€ ์ •๋„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์€ ์—†์—ˆ๋‹ค. --;;

Game ์ชฝ ์ฑ…์„ ์‚ฌ์„œ D3D๋ฅผ ๋ณธํ›„, 3D๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๋Š” ๋งˆ์Œ์œผ๋กœ ์ƒ€๋‹ค. ๋ฌด๋ฆฌ์—†์ด ์˜ˆ์ œ๋ฅผ ๋ณด๋Š”์‹์œผ๋กœ ํ• ๊ฒƒ์ž„.

1. ๋ชฉํ‘œ

3D๋ฅผ ์ด์šฉํ•œ ์˜ค๋ฝ ๋งŒ๋“ค๊ธฐ.

๊ตฌ์ฒด์ ์ธ๊ฑด ๋‘˜์ด์„œ ์ƒ๊ฐํ•ด ๋ณผ๊ฒƒ์ž„.

-- v.

2. ์ง„ํ–‰ ์ƒํ™ฉ

2.1. 1์›” 8์ผ

  • ์˜ํ˜„ ์Œ.. ๋ง˜์— ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€ ๊ฐˆํ”ผ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š”๊ฒŒ ํ˜„์‹ค์ด๋‹ค. ๊ด€๋ จ ์ฑ…์ด๋ผ๋„ ์ข€ ๋ด์•ผ ํ•˜๊ฒ ๋‹ค.
    ์•ฝ๊ฐ„์€ ์„ค๋ช…์ด ๋ฏธํกํ•œ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด๊ฐ€ ๋ชจ์ž๋ฅด๊ธฐ ๋•Œ๋ฌธ์ผ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ใ…‹ใ…‹ใ…‹
    ์•„์ง๊นŒ์ง€, ์˜ˆ์ œ๋‹ค์šด ์˜ˆ์ œ๋ฅผ ๋ชป๋ณด๋‹ค. 3D object๋ฅผ ๋ณธ์ ์ด ์—†์Œ. ์•„์ง๊นŒ์ง€.. --; - 232p/602p...
  • ๊ด‘์‹ ์ด์ฑ… ๋ฎ์€์ง€ ํ•œ 20๋œ๊ฑฐ ๊ฐ™๋‹ค. ๋˜์ธต๋˜์ธต ๋ด๊ฐ€์ง€๊ณ  ๊ธฐ์–ต์ด ์•ˆ๋‚œ๋‹ค. ๋‹ˆ๊ฐ€์ ์–ด๋…ผ๊ฑฐ๋ฅผ ๋ณด๋Š”๊ฑฐ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

2.2. 1์›” 9์ผ

  • potential function์— ๋Œ€ํ•ด์„œ๋งŒ ๋ดค๋‹ค.. ์•ฝ๊ฐ„ ์“ธ๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(?) ์ธ๊ฒƒ ๊ฐ™๋‹ค. ใ…‹ใ…‹ใ…‹
    ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” PathPlan์— ๊ด€ํ•œ์–˜๊ธฐ๋Š” ์‰ฌ์šด๊ฒƒ ๊ฐ™์€๋ฐ. ์žฅ๋‚œ์ด ์•„๋‹ˆ๋‹ค.
    ๋จธ๋ฆฌ ์•„ํ”„๋‹ค. - 249p/602p...
  • ์ „์—๋„ ๋А๋‚€๊ฑฐ์ง€๋งŒ ์ด์ฑ…์˜ D3D์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ์ข€ ์•„๋‹Œ๊ฑฐ ๊ฐ™๋‹ค. ์˜ค๋Š˜ ๋„์„œ๊ด€์—๊ฐ€์„œ ์ฑ…์ข€ ๋นŒ๋ ค์•ผ๊ฒ ๋‹ค ๊ด‘์‹
  • ์ฑ…๋น„๋ฅด๋Ÿฌ ๊ฐ„๋‹ค. 3D์— ๊ด€ํ•œ์ฑ….. --+ ๋ฌด์‹  ์ฑ…์ด ๊ฒœ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ๊ฒŒ ์•„๋‹Œ๊ฑฐ ๊ฐ™์–ด.. --+ ์งฑ๋‚˜ ์งฑ๋‚˜.. ์˜ํ˜„

2.3. 1์›” 10์ผ

  • ์ด๋Ÿฐ ์–ด์ œ ์ฑ… ๋ชป๋นŒ๋ ธ๋‹ค ์˜ค๋Š˜ ๋นŒ๋ ค์•ผ๊ฒ ๋‹ค --; ๊ด‘์‹

2.4. 1์›” 11์ผ

  • ์ž ์‹œ ์™ธ๋„. ๊ด‘์‹์ดํ•œํ…Œ ๋นŒ๋ฆฐ ์ฑ…์œผ๋กœ 3D๋ฅผ ๊ณต๋ถ€.

~cpp 
์ฟ ์ฟ .. ์—ด์‹ฌ์ด๊ตฌ๋‚˜.. ^^a.. DX ๊ณต๋ถ€ํ•˜๋ฉด ๋‚˜์คŒ ๊ฐˆ์ผœ๋‹ค์˜ค.. ํ—คํ—ค.. ๋‚˜๋‘ ์ง€๊ธˆ ํ•˜๊ตฌ ์žˆ๋Š”๊ฑฐ.. ์‹œ๊ฐ„๋˜๋ฉด ์—ฌ๊ธฐ๋‹ค(์œ„ํ‚ค..) ์“ธ๊ป˜..
๋„ˆ๋„ค๋‘ ๊ณง ํ•„์š”ํ•ด์งˆ ๋‚ด์šฉ์ด ์žˆ์„ํ…Œ๋‹ˆ.. ๊ทผ๋ฐ ์ง€๊ธˆ์€ ๋‚ด์ฝ”๊ฐ€ ์ข€ ์„์ž๋ผ์„œ.. ์‹œ๊ฐ„์— ์ซ“๊ธฐ๋Š” ๊ด€๊ณ„๋กœ.. ์–ธ์  ๊ฐ€.. ๊ผญ.. ^^;; - ํ•ด์„ฑ
์˜ค์˜ท.. ํ•ด์„ฑ์ด๊ฐ€ ๊ธ€์„ ์ผ๋‹ค! --์„์ฒœ

3. Direct 3D

3.1. Chapter 1.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฑ…๋“ค์ด ๋‹ค ๊ทธ๋ ‡๋“ฏ์ด, winapi๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๋ฐ˜์˜ ํ•œ chapter๋Š” ๊ฑฐ์˜๋‹ค winapi๋ฅผ ์‚ฌ์šฉํ•ด์„œ

"Hello, World!"๋ฅผ ์ฐ๋Š” source๋ฅผ ๋„ฃ์–ด ์ค€๋‹ค. --;

3.2. Chapter 2.

DX ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด๊ณผ, game loop(message loop)๋ฅผ ํฌํ•จํ•œ library๋ฅผ ์‹ค์ œ๋กœ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์˜ˆ์ œ source 1๊ฐœ์ •๋„.. ์—ฌ๊ธฐ ๊นŒ์ง€ ๋ดค์Œ.. - ๊ณง update , 01.06.2002 Sun

...

์Šฌ์Šฌ ์ฑ…์ด ์งœ์ฆ๋‚˜๋ ค๊ณ  ํ•œ๋‹ค. --+ ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฑ…์—์„œ ์ œ๊ณตํ•˜๋Š” library๋ฅผ ์“ฐ๋ฉด chapter2๋Š” ์†”์งํžˆ

๋ณด์ง€ ์•Š์•„๋„ ๋ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌด์Šจ ์†Œ๋ฆฌ๋“ค์„ ํ•˜๋Š”์ง€. ์ „๋ถ€ ์ดˆ๊ธฐํ™”.. --+ ํ•จ์ˆ˜ ์„ค๋ช… ๋ฟ์ด๋„ค. ํ๋ฏธ.. ๊ทธ๋ƒฅ..

์ผ๋ฐ˜์ ์ธ 3D์ด์•ผ๊ธฐ๋ฅผ ์‚ด๊ฒƒ์„.. Game์ชฝ์„ ์‚ฌ์„œ.. T-T ์•„๋ฌดํŠผ ๋ณด๊ธฐ๋Š” ๋‹ค ๋ด์•ผ์ง€. DX ๋Š” ํ• ๊ฒƒ์ด ์ •๋ง ์ดˆ๊ธฐํ™” ๋ฟ์ด๋˜๊ฐ€?

chapter 3 ๋ถ€ํ„ฐ๋Š” ์ˆ˜ํ•™์ด๋ž๋‹ˆ๋‹ค.. --;;

  • Chapter 2: skip. ์ดˆ๊ธฐํ™” ๋ถ€๋ถ„์ •๋„. ํšก์„ฑ ์ˆ˜์„ค์ž„. ๋ฌด์Šจ ์†Œ๋ฆฌํ•˜๋Š”์ง€ ๋ชป์•Œ์•„ ๋จน์„ ์ •๋„์ž„.

๊ด‘์‹์•„ Chapter2 ์ข€ ๋‹ˆ๊ฐ€ ์ •๋ฆฌํ•ด๋ผ. ๋‚œ ๋ณด๋Š”๊ฒŒ ์งœ์ฆ๋‚˜์„œ ๋ชปํ•ด ๋จน๊ฒ ๋‹ค. ํ›„ํ›„ํ›„. ๊ฐ™์ด ํ•˜๋‹ˆ ์ด๊ฒŒ ํŽธํ•˜๊ตฐ.. ์ผ€์ผ€
์ด๊ฑฐ ์ •๋ฆฌํ•˜๋Š”๊ฑด ๋ฌด๋ฆฌ๋‹ค--;
~cpp 
์ถ”์ฒœ ๋„์„œ: Inside DirectX (ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด ๋งํ•˜์‹œ์˜ค. ์ „์ž์ฑ…์œผ๋กœ ์žˆ์–ด์š”. --;;)
           Tricks of the Windows Game Programming Gurus : Fundamentals of 2D and 3D Game Programming. (DirectX, DirectMusic, 3D sound)

3.3. Chapter 3. 3D ์ˆ˜ํ•™์  ๊ธฐ์ดˆ (50%~60%)

์ด chapter๋Š” math3D๋ผ๋Š” library๋ฅผ ๋งŒ๋“œ๋Š” chapter์ด๋‹ค

.. 1์›” 8์ผ ํ˜„์žฌ.. ์ด ๋ถ€๋ถ„์€ ์—„์ฒญ๋‚œ ๋ณ€ํ™”๊ฐ€ ์š”๊ตฌ.. --a

์ฑ…์˜ ๋‚ด์šฉ์ค‘ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์•„๋‹ˆ, ๋ง์ด ์–ด๋ ค์šด๊ฒƒ ๊ฐ™๋‹ค.

3.3.1. ์ 

์ ์€ 3D ๊ทธ๋ž˜ํ”ฝ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ๋ž๋‹ˆ๋‹ค. ์ฑ…์—์„œ ๊ทธ๋Ÿฌ๋ฐ์š”.

- ์ ์€ 3D ๊ณต๊ฐ„์—์„œ์˜ ํ•˜๋‚˜์˜ ์œ„์น˜์ด๊ณ , ๋ฒกํ„ฐ๋Š” 3D๊ณต๊ฐ„ ๋‚ด์—์„œ ์›์ ์œผ๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ์œ„์น˜๋ฅผ ์ž‡๋Š” ์ง์„ ์ด๋‹ค. -

vector(3D ๊ณต๊ฐ„์ƒ์˜ ์ ์ด ์žˆ๋Š” ์ผ์ •ํ•œ ๊ฑฐ๋ฆฌ)์˜ ํฌ๊ธฐ (magnitude)๋ฅผ ๊ตฌํ•˜๋Š” ๊ณต์‹์€

~cpp 
   ๋‹ค๋“ค ์•Œ๊ณ  ๊ณ„์‹œ์ ธ? --;; ํ•˜ํ•˜..
๋‹จ์œ„ ๋ฒกํ„ฐ- ์„ธ๊ฐœ์˜ ์ฃผ์š” ์ถ•๋“ค์˜ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ๋ฒกํ„ฐ.

i<1,0,0>, j<0,1,0>, k<0,0,1>

i, j, k๋ฒกํ„ฐ์˜ ์„ ํ˜• ์กฐํ•ฉ์œผ๋กœ 3D๋‚ด์˜ ์–ด๋– ํ•œ ์ ์ด๋ผ๋„ ๋‚˜ํƒ€๋‚ผ์ˆ˜ ์žˆ๋‹ค.


a = <3, 5, 2>

a = 3i+5j+2k

๊ทธ๋ฆฌ๊ณ , ์ด ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ํ–‰๋ ฌ๊ณผ ํ–‰๋ ฌ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ณต๊ฐ„์„ ์„ค๋ช…ํ•  ๋•Œ ๋งค์šฐ ์ค‘์š”์‹œ ๋œ๋‹ค.

3.3.2. point3 ๊ตฌ์กฐ์ฒด

3D์ ์„ ์บก์Аํ™” ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์กฐ์ฒด.
~cpp 
struct point3
{
 union // use union - ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์„ฑ๋ถ„๋“ค์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ.
 {     // y๋ณ€์ˆ˜์™€ v[1]๋ณ€์ˆ˜๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
   struct
   {
     float x, y, z; // ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด ์ •์˜๋˜์ง€ ์•Š์•˜์ง€ ๋•Œ๋ฌธ์— x,y,z ์„ฑ๋ถ„์„ ์›์ž ๋‹จ์œ„๋กœ ์‚ฌ์šฉ.
   };
   float v[3];
 }

 point3 () {}
 point3 (float X, float Y, float Z) : x(X), y(Y), z(Z) {} // ์ดˆ๊ธฐํ™” ๋ชฉ๋ก์„ ์‚ฌ์šฉ. (compiler๊ฐ€ ์ž‘์—…์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค๋”๊ตฐ.)
 // ...
};

3.3.3. point3์˜ ์—ฐ์‚ฐ์ž์™€ ๊ธฐ๋ณธ์  ํ•จ์ˆ˜

~cpp 
struct point3
{
 ...
 point3 operator +(point3 const &a, point3 const &b);
 point3 operator -(point3 const &a, point3 const &b);
 point3 operator *(point3 const &a, float const &b);
 point3 operator *(float const &a, point3 const &b);
 point3 operator /(point3 const &a, float const &b);
 ...
};
// ์ขŒํ‘œ ํ• ๋‹น
inline void point3::Assign (float X, float Y, float Z)  
{
 x = X; y = Y; z = Z;
}
// vector ๊ฐ’
inline float point3::Mag () const
{
 return (flaot)sqrt (x*x + y*y + z*z);
}
// ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ ๊ฐ’
inline float point3::MagSquared () const
{
 return (x*x + y*y + z*z);
}
// Normalize
inline void point3::Normailze ()
{
 float foo = 1/Mag ();
 x *= foo; y *= foo; z *= foo;
}

3.3.4. ๋ฒกํ„ฐ ๋™๋“ฑ

float์ด๋‚˜ double์ด ๋‚˜ํƒ€๋‚ผ์ˆ˜ ์žˆ๋Š” ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด vector๋ผ๋ฆฌ ๋™๋“ฑํ•œ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๊ทธ๋ž˜์„œ, epsilon (์ด ์ฑ…์—์„œ๋Š” 0.001๋กœ ์ •์˜)์ด๋ผ๋Š” ๊ฒƒ์„ ๋‘์–ด ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

~cpp 
// point3์˜ ๋“ฑ๊ฐ€ ์—ฐ์‚ฐ์ž
#define EPSILON 0.001
inline bool operator ==(point3 const &a, point3 const &b)
{
 if (fabs (a.x - b.x) < EPSILON)
 {
   if (fabs (a.y - b.y) < EPSILON)
   {
     if (fabs (a.z - b.z) < EPSILON)
     {
       return true;
     }
   }
 }
 return false;
}

3.3.5. ๋‚ด์  & ์™ธ์ 

~cpp 
// ๋‚ด์ 
inline float operator *(point3 const &a, point3 const &b)
{
 return a.x*b.x + a.y*b.y + a.z*b.z;
}
// ์™ธ์ 
inline point3 operator ^(point3 const &a, point3 const &b)
{
 return point3 ( (a.y*b.z - a.z*b.y), (a.z*b.x - a.x*b.z), (a.x*b.y - a.y*b.x) );
}
--; ๊ณ ๋ฉํ•™๊ต๋•Œ ๋ฐฐ์› ๋˜ ๋‚ด์ ๊ณผ ์™ธ์ . ์ง€๊ธˆ๋ณด๋‹ˆ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€.. ใ…Žใ…Žใ…Ž ๊ทธ๋ƒฅ ์ ์–ด ๋ดค์Œ. --;

3.3.6. ํด๋ฆฌ๊ณค

ํด๋ฆฌ๊ณค์€ ๊ฐœ์ฒด์˜ ํ…Œ๋‘๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

- http://www.gameschool.co.kr/cyberhtm/3dPolygon.htm - ํด๋ฆฌ๊ณค์— ๊ด€ํ•œ page
~cpp 
template <class type>
struct polygon 
{
	int nElem; // number of elements in the polygon
	int maxElem;

	type *pList;

	polygon()
	{
		nElem = 0;
		maxElem = 0;
		pList = NULL;
	}

	polygon( int maxSize )
	{
		maxElem = maxSize;
		pList = new type[maxSize];
	}

	polygon( const polygon &in )
	{
		CloneData( in );
	}

	~polygon()
	{
		DestroyData();
	}

	void CloneData( const polygon &in )
	{
		if( !in.pList ) 
			return;

		pList = new type[in.maxElem];
		maxElem = in.maxElem;
		nElem = in.nElem;
		for( int i=0; i<in.nElem; i++ )
		{
			pList[i] = in.pList[i];
		}
	}

	void DestroyData( )
	{
		delete[] pList;
		pList = NULL;
	}

	polygon& operator=( const polygon<type> &in )
	{	
		if( &in != this )
		{
			DestroyData();

			CloneData( in );
		}
		
		return *this;
	}
};

3.3.7. ๋ฉด

3D์—์„œ ๋ฉด์€ 2D์˜ ์„ ๊ณผ๊ฐ™๋‹ค.

๋ฉด์„ ์ •์˜ํ•˜๋Š” ์‹
~cpp 
   ax + by + cz + d = 0
์‚ผ์›์Œ <a, b, c>๋Š” ๋ฉด์˜ ๋ฒ•์„ (๋ฒ•์„ : ๊ทธ ๋ฉด๋‚ด์˜ ๋ชจ๋“  ์ ๋“ค์— ๋Œ€ํ•ด ์ˆ˜์ง์ธ ๋ฒกํ„ฐ), d๋Š” ๋ฉด์—์„œ ์›์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ

์œ„์˜ ์‹์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ์ ์˜ ์‚ผ์›์Œ <x, y, z>๋Š” ๋ฐ”๋กœ ๋ฉด์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ ๋“ค์ด๋‹ค

๋ฉด์„ ์ •์˜ํ•˜๋Š” ๊ตฌ์กฐ์ฒด
~cpp 
struct plane3 {

	point3 n; // Normal of the plane
	float d;  // Distance along the normal to the origin 

	plane3( float nX, float nY, float nZ, float D) : n( nX, nY, nZ ), d( D )
	{
		// All done.
	}
	plane3( const point3& N, float D) : n( N ), d( D )
	{
		// All done.
	}

	// Construct a plane from three 3-D points
	plane3( const point3& a, const point3& b, const point3& c);

	// Construct a plane from a normal direction and a point on the plane
	plane3( const point3& norm, const point3& loc);

	// Construct a plane from a polygon
	plane3( const polygon<point3>& poly );

	plane3()
	{
		// Do nothing
	}

         // Flip the orientation of the plane
	void Flip();
};

3.3.8. ๋ณ€ํ™˜

3D์˜ ์œ„์น˜์ด๋™์ด๋‚˜ ํšŒ์ „ ๋“ฑ์ด ํ–‰๋ ฌ๋กœ ์ด๋ฃจ์–ด ์ง„๋‹ค๋Š” ์–˜๊ธฐ.

์œ„์น˜ ์ด๋™์ด์•ผ ๋”ํ•ด์ฃผ๊ณ  ๋นผ์ฃผ๋ฉด ๋˜๋Š”๊ฑด ๋‹ค ์•„๋Š” ์‚ฌ์‹ค์ด๋‹ˆ.. ์ฉ.. --; ํšŒ์ „์ด๋‚˜ ์•Œ๋ฉด ๋ ๊ฒƒ ๊ฐ™์Œ.

...

ํšŒ์ „์„ ๋•๋Š” ์„ธ๊ฐ€์ง€ ํ‘œ์ค€ ํ–‰๋ ฌ. (Euler ํšŒ์ „)
~cpp  
Rx (r) = | 1         0         0    |
         | 0       cos(r)    sin(r) |
         | 0       -sin(r)   cos(r) |

Ry (r) = | cos(r)    0       -sin(r)|
         | 0         1         0    |
         | 0       sin(r)    cos(r) |

Rz (r) = | cos(r)  sin(r)      0    |
         | -sin(r) cos(r)      0    |
         | 0         0         1    |

ex ) v0 = <2, 0, 0>์„ z์— ๊ด€ํ•ด ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 45๋„ ํšŒ์ „
      v1 = Rz(45)v0
     v1์ด v0๋ฅผ z์— ๊ด€ํ•ด ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 45๋„ ํšŒ์ „์‹œํ‚จ ์ง€์ ์ด๋‹ค.

// ๋ฌธ์ œ์ 
// x, y, z์ถ•์œผ๋กœ ํšŒ์ „์‹œํ‚จ ํ–‰๋ ฌ๋“ค์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๊ธฐ์œ„ํ•œ ํ‘œ์ค€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. // ??
์ผ์ •ํ•œ ํšŒ์ „์„ ์ฃผ๊ธฐ์œ„ํ•ด ํ•ด์•ผํ•  ์ผ์€ ๋‹จ์ง€ ํ•„์š”ํ•œ ์ด๋ จ์˜ ๋ณ€ํ™˜์„ ์•Œ์•„๋‚ด๊ณ 

๋ชจ๋ธ์˜ ๊ฐ ์ ์— ์ด๋“ค ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

~cpp 
- ํŠน์ •ํ•œ ์  p์— ์กด์žฌํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ z์ถ•์„ ๋”ฐ๋ผ ํšŒ์ „์‹œํ‚ค๋ ค๋Š” ๊ฒฝ์šฐ -
v = vT(-p)   // ์›์ ์œผ๋กœ ์œ„์น˜์ด๋™
v = vRz(ํŒŒ์ด/2)  // ํŒŒ์ด.. ๋ญ”์ง€๋Š” ์•Œ๊ฒ ์ง€.. ใ…กใ…ก; 
v = vT(p)    // ๋‹ค์‹œ ์ „ p๋กœ ์ด๋™.
but, ๊ฐ์ ๋“ค ๋งˆ๋‹ค ์ด๋Ÿฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋„ˆ๋ฌด ๋А๋ฆฌ๋‹ค.

๊ทธ๋ž˜์„œ ๋ง์ธ๋ฐ, ํ–‰๋ ฌ์— ์žˆ์–ด์„œ ์ข‹์€ ์ ์€ ๊ณฑํ•˜๊ธฐ ์ „์— ๊ทธ ์ ๋“ค์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

๋‘ ๊ฐ€์ง€ ํšŒ์ „, ์ฆ‰, A์™€ B๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๊ฒฐํ•ฉ ๋ฒ•์น™์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

~cpp 
v` = (vA)B => v` = v(AB)    // ์˜ค!~

3.3.9. ์ถ•-๊ฐ๋„ ํšŒ์ „

๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€...

์•ž์—์„œ๋ณธ EulerํšŒ์ „์˜ ๋ฌธ์ œ์ ์„ ๋ณด์•ˆํ•œ ํšŒ์ „ํ–‰๋ ฌ.

~cpp 
 | xx(1-cos(r)) + cos (r)      yx(1-cos(r)) + z sin(r)     xz(1-cos(r)) - y sin(r)     0 |
 | xy(1-cos(r)) + z sin(r)     yy(1-cos(r)) + cos(r)       yz(1-cos(r)) - x sin(r)     0 |
 | xz(1-cos(r)) + y sin(r)     yz(1-cos(r)) + x sin(r)     zz(1-cos(r)) - cos(r)       0 |
 |          0                            0                            0                1 |

3.4. Chapter 4. ์ธ๊ณต ์ง€๋Šฅ (Artificail Intelligence)

3.4.1. ์ถœ๋ฐœ์ 

''
  • ์–ด๋–ป๊ฒŒ ๊ฐœ์ฒด๋ฅผ ์›€์ง์ด๊ณ , ์–ด๋–ป๊ฒŒ ๋Œ๊ณ , ์–ด๋–ป๊ฒŒ ๊ฑท๋А๋ƒ๋Š” ์›€์ง์ž„์— ๊ด€ํ•œ๋ฌธ์ œ (locomotion or motor skills)
  • ๊ฐœ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์žฅ์• ๋ฌผ ๋ฐ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋“ค์„ ํ”ผํ•˜๋ฉด์„œ A์—์„œ B๋กœ ์ด๋™ํ•  ๊ฒƒ์ธ๊ฐ€? (task generation)
  • ์‹ค์ œ์‚ฌ๊ณ , ๊ฐœ์ฒด๋“ค์ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์›€์ง์ด๋Š” ๋Šฅ๋ ฅ์„ ์ด์šฉํ•˜๋ฉฐ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋ฅผ ํ–‰ํ•  ๊ณ„ํš์„ ์„ธ์šฐ๋Š”๊ฒƒ (acion steering)
''

3.4.2. ์กฐ์ข… - about move 1

1.์ถ”์ 

๊ฐ„๋‹จํžˆ ์ ์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ. ๋ญ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€๊ฑด ์žˆ์ง€๋„ ์•Š์„๊ฒƒ ๊ฐ™๋‹ค.

2.ํƒˆ์ถœ

... ํ• ๋ง ์—†์Œ.

3.ํŒจํ„ด (๊ธฐ๋ณธ)

... ํ• ๋ง ์—†์Œ.

3.4.3. ์กฐ์ข… - 2

์ „์œ„ ํ•จ์ˆ˜
์šฐ๋ฆฌ๋Š” ๋ช…๋ฒฝํ•˜๊ฒŒ ์žฅ์• ๋ฌผ 2๋ณด๋‹ค๋Š” ์žฅ์• ๋ฌผ 1์„ ํ”ผํ•˜๊ธฐ๋ฅผ ๋” ์›ํ•  ๊ฒƒ์ด๋‹ค.

์ฆ‰, ์žฅ์• ๋ฌผ 2๋Š” ํ›จ์”ฌ ๋” ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

~cpp 
            --------------
            | obstacle 2 |                        | goal |
            --------------

             



       --------------
       | obstacle 1 |
       --------------

    |creature.|
์šฐ๋ฆฌ๋Š” ์ด ์„œ์ˆ ์„ ํ•˜๋‚˜์˜ ๋“ฑ์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ตœ์ดˆ ์šฐ๋ฆฌ์˜ ๋ฐฉํ–ฅ์€

๋ชฉํ‘œ ์ง€์ ์„ ํ–ฅํ•œ ํ‰๊ท ํ™”๋œ ๋ฒกํ„ฐ์ด๋‹ค(or ๋ชฉํ‘œ ์ง€์ ์˜ ์œ„์น˜์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋บ€ ๊ฒƒ)

๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ์˜ ์žฅ์• ๋ฌผ์— ๋Œ€ํ•ด ๊ณง์žฅ ๋„๋ง๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ‰๊ท  ๋ฒกํ„ฐ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

์ด ํ‰๊ท  ๋ฒกํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์ƒ์ˆ˜๋กœ ๊ณฑํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์žฅ์• ๋ฌผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ์˜

์ œ๊ณฑ์œผ๋กœ ๋‚˜๋ˆ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ๋Š” ๋ฌผ์ฒด๊ฐ€ ๋ฐฉํ–ฅ ๋ฒกํ„ฐ๋กœ์„œ ์ด์šฉํ•ด์•ผ๋  ํ•˜๋‚˜์˜ ๋ฒกํ„ฐ๋ฅผ ์–ป๋Š”๋‹ค.

... ํ ํ . ๋ญ”์†Œ๋ฆฐ์ง€. ๋‚˜๋Š” ์•Œ์ง€~ ^^

๊ณต์‹]

http://zp.cse.cau.ac.kr/~erunc0/study/d3d/potential.bmp
~cpp 
// ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ.
bool Process()
{
	point3 goalVec = g_goalLoc - m_loc;

	if( goalVec.Mag() < g_creatureSpeed )
		return false; // goal๊นŒ์ง€ ๋„์ฐฉํ–ˆ๋‹ค.

	point3 dirVec = goalVec / goalVec.Mag();

	float k = .1f; 

	// ๊ฐ๊ฐ์˜ obstacle๊ณผ ๊ฒ€์‚ฌ
	for( int i=0; i<g_obstacles.size(); i++ )
	{
		// creature์—์„œ obstacle๊นŒ์ง€์˜ vector
		point3 obstacleVec = m_loc - g_obstacles[i].m_loc;

		// obstacle๊ณผ creature์‚ฌ์ด์˜ ์‹ค์ œ ๊ฑฐ๋ฆฌ
		float dist = obstacleVec.Mag() - g_obstacles[i].m_rad - m_rad;

		// this is the vector pointing away from the obstacle ??
		obstacleVec.Normalize(); 

		dirVec += obstacleVec * ( k / (dist * dist) ); // creature๋ฅผ ํ‰ํ–‰์ด๋™ ์‹œํ‚ฌ ํ–‰๋ ฌ์„ ์–ป๋Š”๋‹ค. ๋ชจ๋“  obstacle์„ ๊ฒ€์‚ฌ ํ•˜๋ฉด์„œ...
	}
	dirVec.Normalize();

	m_loc += g_creatureSpeed * dirVec;
	return true; // ok. obstacle์„ ํ”ผํ–ˆ๋‹ค.
}
์‹คํ–‰ ํŒŒ์ผ: http://zp.cse.cau.ac.kr/~erunc0/study/d3d/potentialFunc.exe


์žฅ์ 

  • ์•ผ์™ธ์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ๋ฌผ๋ฆฌ์  ์žฅ์• ๋ฌผ์ด ๋“œ๋ฌธ ๊ฒฝ์šฐ์—๋Š” ์ž˜๋œ๋‹ค.
  • ์žฅ์• ๋ฌผ๋“ค์ด ์Šค์Šค๋กœ ์›€์ง์ผ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ.
๋‹จ์ 

  • ์žฅ์• ๋ฌผ๋“ค์ด ๋„ˆ๋ฌด ๊ฐ€๊นŒ์ด ๋ฐ€์ง‘ํ•ด์„œ ๋ถ™์–ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๋น ์ ธ ๋‚˜์˜ฌ์ˆ˜ ์—†๋‹ค.

3.4.4. ๊ฒฝ๋กœ ์ถ”์ 

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:04
Processing time 0.0119 sec