Three.js: CubeTexture ๋ฐฉํ–ฅ

์— ๋งŒ๋“  2019๋…„ 04์›” 25์ผ  ยท  31์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๋‚ด ์•ฑ์—์„œ ์žฅ๋ฉด ๋ฐฐ๊ฒฝ๊ณผ ํ™˜๊ฒฝ ๋งต ๋ฐ˜์‚ฌ๋ฅผ ์ •์˜ํ•˜๋Š” CubeTexture๋ฅผ ์ˆ˜์ง y์ถ•์„ ๋”ฐ๋ผ 180ยฐ ํšŒ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚ด ํšŒ์ „์€ ๋ฐฐ๊ฒฝ ํ•„๋“œ์— ๋Œ€ํ•œ VRML ๋ฐ X3D ์‚ฌ์–‘์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

mapping , flipY ๋ฐ rotation ํ…์Šค์ฒ˜ ํ•„๋“œ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด๊ฐ€ ๋†“์นœ ๋ช…๋ฐฑํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • three.js ์ด๊ฒƒ์ด ๋‚˜์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ(์˜ˆ Texture.flipX ๋ฐ CubeTexture.flipZ )? ์ด ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?
Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

scene.background ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด... ์˜ˆ, ํ™•์‹คํžˆ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด API๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ...

scene.background = new THREE.Background( cubeTexture );`
scene.background.rotation.y = Math.PI / 2;

๋ชจ๋“  31 ๋Œ“๊ธ€

scene.background ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด... ์˜ˆ, ํ™•์‹คํžˆ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด API๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ...

scene.background = new THREE.Background( cubeTexture );`
scene.background.rotation.y = Math.PI / 2;

๋‚˜๋Š” ์ง€๊ธˆ ๋ฐ”๋กœ ์ด๊ฒƒ๊ณผ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ๋‹ค. ํ๋ธŒ๋งต์—์„œ ํƒœ์–‘ ๋ฐฉํ–ฅ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๊ตฌ์šด ๋•… ๊ทธ๋ฆผ์ž๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ํ๋ธŒ ๋งต์ด 180๋„ ๋’ค์ง‘ํžˆ๋Š” ๊ธธ์„ ๋”ฐ๋ผ ์–ด๋”˜๊ฐ€์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ํ๋ธŒ๋งต์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ณ  ๊ทธ๋Ÿฐ ์ผ์ด ์–ด๋””์—์„œ ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ๊ธฐ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@fabienrohrer ์‹œ๋„

scene.rotation.y = Math.PI;

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ •ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๋Š” ์‹ค์ œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

์˜ค, ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜ฎ ๊ทธ๋ž˜๋„ ์นด๋ฉ”๋ผ๋Š” ๊ทธ ์žฅ๋ฉด์˜ ์ž์‹์ด๊ฒ ์ฃ ?

๊ทธ๋ž˜๋„ ์นด๋ฉ”๋ผ๋Š” ๊ทธ ์žฅ๋ฉด์˜ ์ž์‹์ž„์— ํ‹€๋ฆผ์—†๋‹ค?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mrdoob ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค :-)

@WestLangley :

์ „์ฒด ์žฅ๋ฉด์„ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ์€ ๊ณผ๋„ํ•˜๊ณ  ๋‚ด ์•ฑ์—์„œ ๋งŽ์€ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ๋งŒ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํ™˜๊ฒฝ ๋งต๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

API๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ ๋ฐ๋ชจ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ ํ๋ธŒ๋งต(์˜ˆ: https://threejs.org/examples/#webgl_materials_cubemap)์ด ์žˆ๊ณ  y์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐฐ๊ฒฝ๋งŒ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ๊ฒฝ์— ํšŒ์ „์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ํšŒ์ „ ํ–‰๋ ฌ/์ฟผํ„ฐ๋‹ˆ์–ธ์„ ํ๋ธŒ๋งต์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

three.js๋Š” ์žฌ๋ฃŒ ๋ฐ˜์‚ฌ๊ฐ€ ์„ธ๊ณ„ ๊ณต๊ฐ„ ์ขŒํ‘œ๊ณ„์— ์ •์˜๋œ envMap ์žฌ๋ฃŒ์™€ ์ผ์น˜ํ•˜๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ๋ฉด ๋ฐฐ๊ฒฝ์„ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ๋ฐฐ๊ฒฝ์ด ์žฌ์งˆ ๋ฐ˜์‚ฌ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•ฑ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์„ธ๊ณ„ ๊ณต๊ฐ„ ํ๋ธŒ ๋งต์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ž˜๋„ ์นด๋ฉ”๋ผ๋Š” ๊ทธ ์žฅ๋ฉด์˜ ์ž์‹์ž„์— ํ‹€๋ฆผ์—†๋‹ค?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

webgl_materials_standard ์˜ ์ฝ˜์†”์—์„œ scene.rotation.y ++ ๋ฅผ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ด์ด ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ scene.add( camera ) ์‹œ๋„ํ•œ ๋‹ค์Œ scene.rotation.y ++ ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ๋Œ€๋กœ ๋˜์ง€๋งŒ ์นด๋ฉ”๋ผ ์ปจํŠธ๋กค์ด ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜

THREE.Background ๊ฐœ์ฒด๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” API๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ Œ๋”๋Ÿฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var envMap = material.envMap;
if ( scene.background && scene.background.isBackground && envMap === null ) {
    envMap = scene.background.texture;
}

๋‚˜๋Š” ๋งํ–ˆ๋‹ค

scene.rotation.y = Math.PI๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ...

์ฆ‰, ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :-)

์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. OrbitControls ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์—†์Œ: webgl_materials_standard ์˜ˆ์ œ๋Š” ์–ด์จŒ๋“  IMO์—์„œ ๊ถค๋„ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

scene.background๋ฅผ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด... ์˜ˆ, ํ™•์‹คํžˆ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜ ์ˆ˜์ค€์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด IBL ์กฐ๋ช…์ด ๋ฐฐ๊ฒฝ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜ ํ…์Šค์ฒ˜์˜ ํšŒ์ „์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ๋ธŒ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๊นŒ?

์•ฑ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์„ธ๊ณ„ ๊ณต๊ฐ„ ํ๋ธŒ ๋งต์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ํ๋ธŒ ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์„ ํ–ˆ์œผ๋ฉฐ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ํ๋ธŒ ๋งต์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ๊ฐ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ์•ฝ 15-20๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ™˜๊ฒฝ ์กฐ๋ช…์˜ ๋ฐฉํ–ฅ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ PMREM ํ™˜๊ฒฝ ๋งต์„ ์‹ค์‹œ๊ฐ„ ๊ทธ๋ฆผ์ž๋ฅผ ์œ„ํ•œ ๋ฐฉํ–ฅ ์กฐ๋ช…๊ณผ ๊ฒฐํ•ฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งต์„ ์Šค์นด์ด๋ฐ•์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋‹นํžˆ ๊ดœ์ฐฎ์€ ์ผ๊ด‘ ํšจ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋ถ„๋ช…ํžˆ ํ™˜๊ฒฝ ๋งต์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์—๋Š” ์ œํ•œ์ด ์žˆ์ง€๋งŒ .envMapIntensity ๋ฅผ ์กฐ์ •ํ•˜๋ฉด์„œ ๋ฐฉํ–ฅ ์กฐ๋ช…๊ณผ ๋™๊ธฐํ™”ํ•˜์—ฌ ๋งต์„ ํšŒ์ „ํ•˜์—ฌ ์ ์–ด๋„ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ์˜ ์ผ๊ด‘์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ๋˜ํ•œ ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” ์œ„์ชฝ ๋ฐ ์•„๋ž˜์ชฝ ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜๊ณ  ๋‹ค๋ฅธ ํ…์Šค์ฒ˜๋ฅผ ๊ต์ฒดํ•˜๋ ค๋Š” ํ•ดํ‚น์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. JS์—์„œ 1024x1024 ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜๋Š” ๋ฐ ์•ฝ 10ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋˜๋Š” CubeTexture ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜ต์…˜๊ณผ 3D ํ˜•์‹(X3D, VRML ๋“ฑ .). ๋‘ ํ˜•์‹์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ฆฌํ”Œ๋ ‰์…˜์˜ ์ผ๊ด€์„ฑ์„ ์‰ฝ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์นœ์ˆ™ํ•˜๊ฒŒ ๋“ค๋ฆฐ๋‹ค #11103

CubeMap.rotation = matrix3 ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด r105์— ๋ณ‘ํ•ฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ๋˜ํ•œ ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” ์œ„์ชฝ ๋ฐ ์•„๋ž˜์ชฝ ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜๊ณ  ๋‹ค๋ฅธ ํ…์Šค์ฒ˜๋ฅผ ๊ต์ฒดํ•˜๋ ค๋Š” ํ•ดํ‚น์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. JS์—์„œ 1024x1024 ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜๋Š” ๋ฐ ์•ฝ 10ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์•ฑ์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

@WestLangley ์—ฌ๊ธฐ์—์„œ ์ž์„ธํ•œ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/pull/16507#discussion_r286337864

์•ฑ์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

๋ณ„๋กœ. ํด๋ผ์ด์–ธํŠธ๋‹น ๋กœ๋“œ ์‹œ ํ•œ ๋ฒˆ, ๋ฐฐ๊ฒฝ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•œ ๋ฒˆ(๋งค์šฐ ๋“œ๋ฌธ ๊ฒฝ์šฐ). DEFINE๋„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ๋˜ํ•œ ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ์•ฝ 10ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์•ฑ์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

๋ณ„๋กœ. ํด๋ผ์ด์–ธํŠธ๋‹น ๋กœ๋“œ ์‹œ ํ•œ ๋ฒˆ, ๋ฐฐ๊ฒฝ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•œ ๋ฒˆ(๋งค์šฐ ๋“œ๋ฌธ ๊ฒฝ์šฐ).

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋…ผ๋ฆฌ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ @WestLangley ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ(๋ณด์ถฉ mat3 ๊ณฑ์…ˆ) ๋•Œ๋ฌธ์— CubeTexture.rotation์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ threejs์—์„œ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์•„์ด๋””์–ด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
threejs ๊ธฐ์—ฌ์ž๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์œผ์‹ญ์‹œ์˜ค.

์ด ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

@FishOrBear ๋ถˆํ–‰ํžˆ๋„ threejs ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ํŒจ์น˜๋ฅผ ํ”„๋กœ์ ํŠธ์— ํฌํ•จํ•˜๋ ค๋ฉด ํฌํฌ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/pull/16507

@mrdoob #18157์—์„œ ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์žฌ๊ณ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

AutoCAD์™€ ์œ ์‚ฌํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด threejs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ xy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‰๋ฉด์— ์•‰์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ CubeTexture๋Š” ์šฐ๋ฆฌ ๊ฒƒ๊ณผ ์•ฝ๊ฐ„ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

BTW: Babylon.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์†Œํ•œ y์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ์Šค์นด์ด๋ฐ•์Šค๋ฅผ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://www.babylonjs-playground.com/#UU7RQ #447

์—”์ง„์€ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—์„œ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ •ํ™•ํžˆ #16507์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Babylon.js ์กฐ๊ฐ ์…ฐ์ด๋”์˜ ์ฝ”๋“œ:

https://github.com/BabylonJS/Babylon.js/blob/1c4627141f83c08fe4a7e30e2621c916b4e6c9c9/src/Shaders/ShadersInclude/reflectionFunction.fx#L114 -L117

@mrdoob ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํฌ๋Ÿผ์— ๋˜ ๋‹ค๋ฅธ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://discourse.threejs.org/t/rotate-a-scenes-background-skybox-texture/12199

์กฐ๊ฐ๋‹น ๋‹จ์ผ ์ถ”๊ฐ€ ํ–‰๋ ฌ/๋ฒกํ„ฐ ๊ณฑ์…ˆ์ด ์„ฑ๋Šฅ์— ๋ˆˆ์— ๋„๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์•ฑ์—๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ดํ‚น์€ ์ถ”์•…ํ•˜๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค... ๋˜ํ•œ ์ด ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ €๋„ ์ด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐจ๋‹จ๊ธฐ๋Š” ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆ˜์šฉํ•  ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด ๋ฐฐ๊ฒฝ ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •์  ์…ฐ์ด๋”์—์„œ ์ง์ ‘ ๊ด‘์„  ๋ฐฉํ–ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ modelMatrix ๋ณ€ํ™˜๋งŒํผ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์นด๋ฉ”๋ผ๋กœ ์บก์ฒ˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ํ๋ธŒ๋งต์„ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ง„์˜ ๋ฐฉํ–ฅ์ด ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์—…๋กœ๋“œ ํ›„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํšŒ์ „์„ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๊ณ  ๋ Œ๋”๋ง ์ง์ „ ์žฅ๋ฉด์— ์ ์šฉํ•œ ๋‹ค์Œ ๋ Œ๋”๋ง ์งํ›„ ์žฅ๋ฉด์˜ ํšŒ์ „์„ ID quat๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ๋ชจ๋“  ์žฅ๋ฉด ๊ฐœ์ฒด์˜ ์„ธ๊ณ„ ํ–‰๋ ฌ์ด ๋‘ ๋ฒˆ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ onBeforeRender์—์„œ ์œ„์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์žฅ๋ฉด์„ ์ •์ƒ์ ์ธ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Btw(์•„๋ฌด๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—) 6๊ฐœ์˜ ์žฌ๋ฃŒ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์ „ํ•˜๋Š” "๊ณ ์ „์ ์ธ" ์Šค์นด์ด๋ฐ•์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ™์€ :

const urls = [
  '/assets/skybox/right.png',
  '/assets/skybox/left.png',
  '/assets/skybox/top.png',
  '/assets/skybox/bottom.png',
  '/assets/skybox/front.png',
  '/assets/skybox/back.png',
];

const materials = urls.map((url) => {
  const texture = new THREE.TextureLoader().load(url);

  return new THREE.MeshBasicMaterial({
    map: texture,
    side: THREE.BackSide,
    fog: false,
    depthWrite: false,
  });
});

const skybox = new THREE.Mesh( new THREE.BoxBufferGeometry(10000, 10000, 10000), materials );
scene.add(skybox);

skybox.rotation.y = Math.PI / 2;

์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ: https://woodenraft.games/demos/skybox-rotation-threejs.html

@wmcmurray ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ด ์Šค์นด์ด๋ฐ•์Šค๋ฅผ ์นด๋ฉ”๋ผ์™€ ํ•จ๊ป˜ ์›€์ง์—ฌ์•ผ ํ•˜๊ณ  ์ƒ์ž ํฌ๊ธฐ๊ฐ€ X < Math.sqrt(0.75 * camera.far * camera.far)์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋ณด๊ธฐ์— ๋งž์ง€๋งŒ ์žฅ๋ฉด์„ ํšŒ์ „/ํšŒ์ „ ํ•ด์ œํ•˜๋Š” ํ•ดํ‚น๋ณด๋‹ค ๋” ์‰ฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด PR์„ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฉฐ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ ค๋ฉด ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 1: ํ™˜๊ฒฝ์€ ํ•œ ๋ฒˆ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋˜๋ฉฐ ์…ฐ์ด๋”์—์„œ ํšŒ์ „ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ CPU์—์„œ ๋˜๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ GPU์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 2: ๋ทฐ์–ด์—์„œ ์ž‘์—…ํ•  ๋•Œ ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์šฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐฐ๊ฒฝ์„ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€ 1 ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ„๋‹จํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

renderer.dynamicBackground = true;

๊ทธ์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝ ์…ฐ์ด๋”๋ฅผ ์ปดํŒŒ์ผํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋™์•ˆ

@wmcmurray ์™€ @capnmidnight๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์‹ ์˜ ๋ฐฐ๊ฒฝ ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ ํ‰๋ฉด(๊ทผ๊ฑฐ๋ฆฌ ๋ฐ ์›๊ฑฐ๋ฆฌ ๊ฐ’)์— ํŠนํžˆ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

MeshBasicMaterial ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ShaderMaterial ํ™•์žฅํ•˜๋Š” ์ž์ฒด ์…ฐ์ด๋”๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ํ๋ธŒ๋งต์„ ์ƒ˜ํ”Œ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰