SimulationBall

๊ฐœ์š”

SimulationBall์€ ๊ณต์˜ ์›€์ง์ž„์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•œ ๋’ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์ƒํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฌผ๋ฆฌ ๊ณต๋ณด๋‹ค ๊ถค์ ์„ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๊ณ , ์—ฌ๋Ÿฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ•จ๊ป˜ ๋ณด๋Š” ํ™˜๊ฒฝ์—์„œ๋„ ๋ณด๋‹ค ์•ˆ์ •์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ถ•๊ตฌ๊ณต, ๋†๊ตฌ๊ณต์ฒ˜๋Ÿผ ๊ณต์˜ ๊ถค์ ์ด ์ค‘์š”ํ•œ ๊ฒŒ์ž„

  • ๋ฒฝ์ด๋‚˜ ๋ฐ”๋‹ฅ์— ํŠ€๋Š” ๊ณต์˜ ์›€์ง์ž„์„ ์—ฐ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • ๊ณต์˜ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ธํ•˜๋ฉด์„œ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด๋ฅผ ์กฐ์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

SimulationBall ์ƒ์„ฑ ๋ฐ ์ถฉ๋Œ ๋Œ€์ƒ Trace Channel ์„ค์ •

๋ ˆ๋ฒจ ๋ธŒ๋ผ์šฐ์ €์—์„œ SimulationBall์„ ์ƒ์„ฑํ•œ ๋’ค, ์‚ฌ์šฉํ•  ์œ„์น˜์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

SimulationBall์ด ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ์™€ ์ถฉ๋Œํ• ์ง€๋Š” Collision Profile๊ณผ Trace Channel์„ ํ†ตํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • BallTraceChannel: SimulationBall์ด ์ถฉ๋Œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  Trace Channel์ž…๋‹ˆ๋‹ค. ์ด ์ฑ„๋„์„ ๊ธฐ์ค€์œผ๋กœ Trace๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, ํ•ด๋‹น ์ฑ„๋„์— ๋Œ€ํ•ด Block์œผ๋กœ ์‘๋‹ตํ•˜๋Š” Collision Profile์„ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ์™€๋งŒ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

  • BallMeshCollisionProfile: SimulationBall ์ž์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” Collision Profile์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒฝ์ด๋‚˜ ๋ฐ”๋‹ฅ์ฒ˜๋Ÿผ ๊ณต์ด ์ถฉ๋Œํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์—๋Š”, BallTraceChannel๋กœ ์ง€์ •๋œ Trace Channel์— ๋Œ€ํ•ด Block์œผ๋กœ ์‘๋‹ตํ•˜๋Š” Collision Profile์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ Simaulation ์กฐ์ž‘

SimulationBall์„ ์ฐพ์€ ๋’ค, ์‹œ์ž‘ ์œ„์น˜์™€ ์†๋„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Simulate()๋Š” ํ˜ธ์ถœ ์งํ›„ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋กœ ์™„์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Simulate() ์งํ›„์—๋Š” ์•„์ง ๊ฒฐ๊ณผ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BallSimParam์˜ ์ฃผ์š” ์†์„ฑ

๊ณต์˜ ์›€์ง์ž„์€ BallSimParams์˜ ์ฃผ์š” ์„ค์ •๊ฐ’์„ ๋ฐ”๊พธ๋ฉด์„œ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ
์„ค๋ช…

InitialCFrame

๊ณต์ด ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.

InitialVelocity

๊ณต์ด ๋‚ ์•„๊ฐ€๋Š” ๋ฐฉํ–ฅ๊ณผ ํž˜์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.

InitialSpinAxis

๊ณต์ด ํšŒ์ „ํ•˜๋Š” ์ถ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

InitialSpinSpeed

๊ณต์˜ ํšŒ์ „ ์†๋„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Mass

๊ณต์˜ ๋ฌด๊ฒŒ๊ฐ์„ ์กฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

BaseGravity

๊ณต์ด ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๋Š” ์ •๋„(์ค‘๋ ฅ ๊ฐ’)๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ 980 ์œผ๋กœ 0์ธ ๊ฒฝ์šฐ ๋ฌด์ค‘๋ ฅ ์ƒํƒœ์ด๊ณ , ์Œ์ˆ˜๊ฐ€ ๋˜๋ฉด ์ค‘๋ ฅ์ด ๋ฐ˜๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

EnablePathMarker

๊ณต์˜ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

SpinMagnusWeight

๊ณต์ด ํšŒ์ „ํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ๋งˆ๊ทธ๋ˆ„์Šค ํšจ๊ณผ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ํด ์ˆ˜๋ก, ๊ถค์ ์ด ํœ˜๋Š” ์ •๋„๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค.

Simsteps

์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋ช‡ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ํด์ˆ˜๋ก ๋” ์ •๋ฐ€ํ•ด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ ๋น„์šฉ๋„ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

DeltaTime

๊ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋‹จ๊ณ„์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. `Simsteps`์™€ ํ•จ๊ป˜ ์ „์ฒด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธธ์ด์™€ ์ •๋ฐ€๋„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋” ๋ฉ€๋ฆฌ ๋‚ ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด InitialVelocity ๊ฐ’์„ ํ‚ค์šฐ๊ณ , ๋” ๋†’์€ ๊ณณ์—์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด InitialCFrame์˜ ๋†’์ด ๊ฐ’์„ ์˜ฌ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

SimaulationBall ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์‚ฌ์šฉ

SimulationBall์€ ์ผ๋ฐ˜์ ์ธ ์‹ค์‹œ๊ฐ„ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ๋‹ฌ๋ฆฌ, ์‚ฌ์ „์— ์ž…๋ ฅ๋œ BallSimParams์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฏธ๋ฆฌ ๊ณต์˜ ๊ถค์ ๊ณผ ์ถฉ๋Œ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Playํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Play ์ „์— ๊ณต์˜ ์ด๋™ ๊ฒฝ๋กœ ๋˜๋Š” ์ถฉ๋Œ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์˜ ๋‹ค์Œ Bound ์œ„์น˜ ์•Œ์•„๋‚ด๊ธฐ

SimulationBall์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ๋๋‚œ ๋’ค, ๋‹ค์Œ์œผ๋กœ ํŠ•๊ธธ ์ง€์ ์˜ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณต์ด ์–ด๋А ๋ฒฝ์—์„œ ํŠˆ์ง€ ๋ฏธ๋ฆฌ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • ๋‹ค์Œ ๋ฐ”์šด๋“œ ์œ„์น˜์— ์ดํŽ™ํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • AI ๋˜๋Š” ๊ฒŒ์ž„ ๋กœ์ง์—์„œ ๋‹ค์Œ ์ถฉ๋Œ ์ง€์ ์„ ์˜ˆ์ธกํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

์œ„ ์ฝ”๋“œ์—์„œ๋Š” FindNextBallBounce()๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์Œ ๋ฐ”์šด๋“œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๊ฐ’ ์•ˆ์—๋Š” ๋ฐ”์šด๋“œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์‹œ๊ฐ„๊ณผ ์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด, ๊ณต์ด ์–ด๋””์—์„œ ํŠˆ์ง€ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ, Simulate() ์งํ›„ ๋ฐ”๋กœ FindNextBallBounce()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„์ง ๊ณ„์‚ฐ์ด ๋๋‚˜์ง€ ์•Š์•„ ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ task.wait()๋กœ ์ž ์‹œ ๋Œ€๊ธฐํ•œ ๋’ค ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

N์ดˆ ํ›„ ๊ณต์˜ ๋ฌผ๋ฆฌ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

SimulationBall์€ ํŠน์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ๋’ค ๊ณต์˜ ์ƒํƒœ๋„ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • N์ดˆ ๋’ค ๊ณต์˜ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • ๊ณต์˜ ์†๋„๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • ํšŒ์ „ ์†๋„๊นŒ์ง€ ํฌํ•จํ•ด์„œ ๋ฏธ๋ž˜ ์ƒํƒœ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

์œ„ ์˜ˆ์ œ์—์„œ๋Š” 2์ดˆ ํ›„ ๊ณต์˜ ๋ฌผ๋ฆฌ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • GetCFrameAtTime() : ํ•ด๋‹น ์‹œ์ ์˜ ์œ„์น˜์™€ ํšŒ์ „

  • GetLinearVelocityAtTime() : ํ•ด๋‹น ์‹œ์ ์˜ ์ด๋™ ์†๋„ ๋ฐฉํ–ฅ๊ณผ ํฌ๊ธฐ

  • GetSpeedAtTime() : ํ•ด๋‹น ์‹œ์ ์˜ ์†๋ ฅ๋งŒ ์ˆซ์ž๋กœ ํ™•์ธ

  • GetAngularVelocityAtTime() : ํ•ด๋‹น ์‹œ์ ์˜ ํšŒ์ „ ์†๋„ ํ™•์ธ

์ฆ‰, SimulationBall์€ ๋‹จ์ˆœํžˆ ๊ณต์„ ์žฌ์ƒํ•˜๋Š” ๊ฒƒ๋ฟ ์•„๋‹ˆ๋ผ, ๋ฏธ๋ž˜ ์‹œ์ ์˜ ์œ„์น˜์™€ ์†๋„, ํšŒ์ „๊นŒ์ง€ ๋ฏธ๋ฆฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ๋„ Simulate() ์งํ›„ ๋ฐ”๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์€ ํ”ผํ•˜๊ณ , task.wait()๋กœ ์ž ์‹œ ๋Œ€๊ธฐํ•œ ๋’ค ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ CheckTime์ด ํ˜„์žฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋ฉด ๊ธฐ๋Œ€ํ•œ ๊ฐ’์„ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Simsteps ร— DeltaTime๊ฐ€ ์กฐํšŒํ•˜๋ ค๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ์ถฉ๋ถ„ํžˆ ํฌ๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

SimulationBall์ด ๋ฒฝ ๋˜๋Š” ๋ฐ”๋‹ฅ๊ณผ ์ถฉ๋Œํ•˜๋ ค๋ฉด, ํ•ด๋‹น ๋ฒฝ/๋ฐ”๋‹ฅ์— ์ ์šฉ๋œ Collision Profile์ด SimulationBall์˜ BallTraceChannel์— ๋Œ€ํ•ด Block์œผ๋กœ ์‘๋‹ตํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Simulate()๋Š” ์ฆ‰์‹œ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ฒฐ๊ณผ ์กฐํšŒ ์ „์— task.wait()๋กœ ์ž ์‹œ ๋Œ€๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณต์„ ์žฌ์ƒํ•˜๊ธฐ ์ „์— ๋จผ์ € ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์†๋„ ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ๊ณต์ด ๊ฑฐ์˜ ์›€์ง์ด์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ์ค‘์—๋Š” EnablePathMarker๋ฅผ ์ผœ ๋‘๋Š” ๊ฒƒ์ด ํ™•์ธ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ

SimulationBallBallSimParams

Last updated