Create, Compete & Win at Redbrick Connect 2024! ๐ŸŽ‰

Perspective Camera

์นด๋ฉ”๋ผ ๊ฐ์ฒด์— ์ถ”๊ฐ€๋˜๋Š” API๋“ค.

๋ฉ”์†Œ๋“œ

.activate()

ํ•ด๋‹น ์นด๋ฉ”๋ผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

.useFPS()

.useFPS () : undefined

์นด๋ฉ”๋ผ๋ฅผ FPS ๋ชจ๋“œ(1์ธ์นญ)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


scriptlist 1์ธ์นญ ํ™”๋ฉด

.useTPV()

.useTPV (mode, setting) : undefined

์นด๋ฉ”๋ผ๋ฅผ 3์ธ์นญ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • mode: 3์ธ์นญ ์‹œ์ ์˜ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ โ€œNORMAL_MODEโ€์ž…๋‹ˆ๋‹ค.
    • โ€œNORMAL_MODEโ€: ๊ธฐ๋ณธ์ ์ธ 3์ธ์นญ ์‹œ์ ์˜ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ๋ฅผ ํšŒ์ „์‹œํ‚ค๋ ค๋ฉด ๋งˆ์šฐ์Šค๋กœ ํ™”๋ฉด์„ ๋“œ๋ž˜๊ทธ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • โ€œMOUSE_LOCKโ€: ๋“œ๋ž˜๊ทธ ์—†์ด, ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์ด๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ ์นด๋ฉ”๋ผ๋ฅผ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • setting: โ€œMOUSE_LOCKโ€ ๋ชจ๋“œ์ผ ๋•Œ, ์นด๋ฉ”๋ผ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • bottomClamp: ์นด๋ฉ”๋ผ์˜ ํ”ผ์น˜(pitch) ๊ฐ๋„๋ฅผ ์ œํ•œํ•˜๋Š” ํ•˜ํ•œ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ -15๋„๋กœ, ์นด๋ฉ”๋ผ๊ฐ€ ์•„๋ž˜๋กœ ์–ผ๋งˆ๋‚˜ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ๊ฐ’์€ -90์ž…๋‹ˆ๋‹ค.
    • topClamp: ์นด๋ฉ”๋ผ์˜ ํ”ผ์น˜(pitch) ๊ฐ๋„๋ฅผ ์ œํ•œํ•˜๋Š” ์ƒํ•œ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 70๋„๋กœ, ์นด๋ฉ”๋ผ๊ฐ€ ์œ„๋กœ ์–ผ๋งˆ๋‚˜ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์€ 90์ž…๋‹ˆ๋‹ค.
    • sensitivityX: ๋งˆ์šฐ์Šค ์›€์ง์ž„์— ๋”ฐ๋ฅธ ์นด๋ฉ”๋ผ์˜ ์ˆ˜ํ‰ ํšŒ์ „ ๋ฏผ๊ฐ๋„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0.05์ž…๋‹ˆ๋‹ค.
    • sensitivityY: ๋งˆ์šฐ์Šค ์›€์ง์ž„์— ๋”ฐ๋ฅธ ์นด๋ฉ”๋ผ์˜ ์ˆ˜์ง ํšŒ์ „ ๋ฏผ๊ฐ๋„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0.05์ž…๋‹ˆ๋‹ค.
    • cameraOffset: ์นด๋ฉ”๋ผ๊ฐ€ ํšŒ์ „ํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ์ค‘์‹ฌ์ ์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์•„๋ฐ”ํƒ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด ๊ฐ’๋งŒํผ ๋–จ์–ด์ง„ ๊ณณ์„ ์ค‘์‹ฌ์ ์œผ๋กœ ์‚ผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
      • x: x์ถ• ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
      • y: y์ถ• ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 5์ž…๋‹ˆ๋‹ค.
      • z: z์ถ• ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • distance: ์„ค์ •๋œ cameraOffset ์ง€์ ๊ณผ ์นด๋ฉ”๋ผ์˜ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ๊ฐ€ ํšŒ์ „ ์ค‘์‹ฌ์ ์œผ๋กœ๋ถ€ํ„ฐ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ์„์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • zoom: ์นด๋ฉ”๋ผ ์คŒ ์„ค์ •์„ ์œ„ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
      • scrollLock: ๋งˆ์šฐ์Šค ํœ ์„ ์‚ฌ์šฉํ•ด distance๋ฅผ ์œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์คŒ ๊ธฐ๋Šฅ์˜ ํ™œ์„ฑํ™” ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true๋กœ, ๋งˆ์šฐ์Šค ํœ ์„ ์‚ฌ์šฉํ•œ ์คŒ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
      • minDistance: ์คŒํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 5์ž…๋‹ˆ๋‹ค.
      • maxDistance: ์คŒํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 15์ž…๋‹ˆ๋‹ค.
    • lookAtPoint: ์นด๋ฉ”๋ผ๊ฐ€ ๋ฐ”๋ผ๋ณผ ์ง€์ ์„ ์„ค์ •ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
      • target: ์นด๋ฉ”๋ผ๊ฐ€ ๋ฐ”๋ผ๋ณผ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ โ€œCAMERA_TARGETโ€์ž…๋‹ˆ๋‹ค.
        • โ€œCAMERA_TARGETโ€: ์นด๋ฉ”๋ผ๊ฐ€ cameraOffset ์ง€์ ์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
        • โ€œAVATARโ€: ์นด๋ฉ”๋ผ๊ฐ€ ์•„๋ฐ”ํƒ€๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
      • x: target์˜ x์ถ•์—์„œ ํ•ด๋‹น ๊ฐ’๋งŒํผ ๋–จ์–ด์ง„ ์ง€์ ์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
      • y: target์˜ y์ถ•์—์„œ ํ•ด๋‹น ๊ฐ’๋งŒํผ ๋–จ์–ด์ง„ ์ง€์ ์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
      • z: target์˜ z์ถ•์—์„œ ํ•ด๋‹น ๊ฐ’๋งŒํผ ๋–จ์–ด์ง„ ์ง€์ ์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.

โ€œNORMAL_MODEโ€ : ๋งˆ์šฐ์Šค๋กœ ํ™”๋ฉด์„ ํด๋ฆญํ•œ ํ›„ ๋Œ์–ด์„œ(๋“œ๋ž˜๊ทธ) ํšŒ์ „


โ€œMOUSE_LOCKโ€ : ๋งˆ์šฐ์Šค์˜ ์›€์ง์ž„๋งŒ์œผ๋กœ ํšŒ์ „

โš ๏ธ

.useFPS()์™€ useTPV()๋Š” ์•„๋ฐ”ํƒ€์— .setFollowingCamera() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์–ด์•ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Ex) ์‚ฌ์šฉ ์˜ˆ์‹œ

camera_customizing
const avatar = REDBRICK.AvatarManager.createDefaultAvatar();
const camera = WORLD.getObject("MainCamera");
const followingCamera = avatar.setFollowingCamera(camera); //์•„๋ฐ”ํƒ€์— setFollowingCamera()๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
avatar.setDefaultController();
 
//"MOUSE_LOCK" ๋ชจ๋“œ ์ผ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ’์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
//์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฐ’๋“ค์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ธํŒ…๋ฉ๋‹ˆ๋‹ค.
camera.useTPV("MOUSE_LOCK", {
    distance : 20,
    cameraOffset : {
        z : 5,
        y : 7
    },
    sensitivityX : 0.2,
    topClamp : 90,
    zoom : {
        scrollLock : false
    }
});

.useVR()

.useVR({ VRObject: object }) : undefined

์นด๋ฉ”๋ผ๋ฅผ VR๋ชจ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
VR ์˜ต์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด๊ณณ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • object : Avatar ๊ฐ์ฒด ๋˜๋Š” Object3D ๊ฐ์ฒด