์๋ ์ฌ๋ฌ๋ถ!
์ฐ์ Pixi.js์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ๋ฅญํ ๋๊ตฌ์ ๋๋ค. ์ฌ๋ํฉ๋๋ค! 2D ์ธ๊ณ๋ฅผ์ํ three.js์ ์๋ฒฝํ ๋์ ๋ถ๋ถ์ ๋๋ค.
์ด ๊ตฌ์ฑ์ ๊ฐ๊ณ ์ถ์ ํ๋ก์ ํธ์์ ์์ ์ค์ ๋๋ค.
Three.js ์บ๋ฒ์ค ์์ Pixi.js ์บ๋ฒ์ค๋ฅผ ์บก์ํํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
์๊ฐ ๋ด ์ค์ ๊ณ ๋ง์ !
๊ฑด๋ฐฐ
์ ๋ง๋์
three.js๊ฐ ์บ๋ฒ์ค๋ฅผ ํ ์ค์ฒ๋ก ์ง์ํ๋ ๊ฒฝ์ฐ pixi๋ฅผ ์คํ ์คํฌ๋ฆฐ ์บ๋ฒ์ค๋ก ๋ ๋๋งํ์ฌ three.js ์ฅ๋ฉด์์ ํ ์ค์ฒ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ฑ ๋ง๋ค! ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค!
2015 ๋
1 ์ 21 ์ผ ์์์ผ ์คํ 4:45, Chad Engler [email protected]
์ผ๋ค :
three.js๊ฐ ์บ๋ฒ์ค๋ฅผ ํ ์ค์ฒ๋ก ์ง์ํ๋ ๊ฒฝ์ฐ pixi๋ฅผ ๋ ๋๋งํ์ฌ
์คํ ์คํฌ๋ฆฐ ์บ๋ฒ์ค๋ฅผ ์ฌ์ฉํ์ฌ three.js ์ฅ๋ฉด์์ ํ ์ค์ฒ๋ก ์ฌ์ฉํฉ๋๋ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/GoodBoyDigital/pixi.js/issues/1366#issuecomment -70872648
.
Mat Groves
_ ๊ธฐ์ ํํธ๋ _
์ ํ : 07708 114496 :: www.goodboydigital.com
1 ์ธต, Unit 9B, Queens Yard, White Post Lane, London, E9 5EN
goodboy ยฉ. ํ๊ถ ์์ .
Wahou ... ๊ณ ๋ง์์ ์ฌ๋ฌ๋ถ! :)
์ด๊ฒ์ด ์ ๊ฐ Fast Feedback์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋๋ค!
๋๋ ๋จ์ง ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
3D ์ธ๊ณ (Three.js) ์์ ๋ ๋๋ง ๋ 2D UI ํจ๋ (Pixi.js)์ ๊ทธ๋ฆด ์์๋ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ 2D UI ํจ๋์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ด ์์ด์ผํฉ๋๋ค.
์บ๋ฒ์ค๋ฅผ ๋ ๋๋งํ๋ ํธ๋ฆญ์ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ๋ก ์ ์ฉํ๋ฉด. ๋ฐฐ๊ฒฝ์ ํ๋ฆผ์ด ๋ถ๊ฐ๋ฅ ํ ๊น ๋๋ ต์ต๋๋ค.
์ด๊ฒ์ ์ค๋ช
ํ๊ธฐ ์ํด ์ด๋ฏธ์ง๋ฅผ ์ฒจ๋ถํ์ต๋๋ค.
Three.js ์ธก์์ ๋ธ๋ฌ๊ฐ ๋ฐ์ํฉ๋๊น? pixi ๊ฐ์ฒด๋ฅผ ํฌ๋ช ํ๊ฒ ๋ง๋ ๋ค์ ์ํ๋๋๋ก ํ ์ค์ฒ๋ฅผ 3D ์ฅ๋ฉด์ ํผํฉํ๋ฉด๋ฉ๋๋ค.
๋์ ์ฃผ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ด์ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ง ํ์ผ๋ ... ๊ทธ๊ฒ์ ํ์คํ ๊ฐ์ฅ ๋ ผ๋ฆฌ์ ์ธ ๊ฒฝ๋ก์ ๋๋ค! :)
๊ฑด๋ฐฐ
์ด์ํ
๋๋ ai๊ฐ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๊ฒ์๋ฌผ์ ํธ์งํ๊ณ ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์์ ์ฝ๋๋ฅผ ๊ฒ์ํฉ๋๋ค.
<body>
<script src="js/pixi.js"></script>
<script src="js/three.min.js"></script>
<script>
width = window.innerWidth;
height = window.innerHeight;
//-------------------------------------------------------------------------------------
// 3D Scene canvas
//-------------------------------------------------------------------------------------
var scene_3D = new THREE.Scene();
scene_3D.fog = new THREE.Fog( "#a1a1a1", 2000, 4000 );
var camera = new THREE.PerspectiveCamera( 75, width / height, 1, 10000 );
camera.position.set( 0, 0, 700);
camera.updateProjectionMatrix();
var canvas_3D = new THREE.WebGLRenderer( { antialias: true } );
canvas_3D.setSize( width, height );
canvas_3D.setClearColor( scene_3D.fog.color, 1 );
document.body.appendChild( canvas_3D.domElement );
var geometry = new THREE.BoxGeometry( 500, 500, 500 );
var material = new THREE.MeshNormalMaterial();
var cube = new THREE.Mesh( geometry, material );
cube.position.z = -500;
cube.rotation.z = -45;
scene_3D.add( cube );
//-------------------------------------------------------------------------------------
// 2D UI canvas
//-------------------------------------------------------------------------------------
var scene_UI = new PIXI.Stage( 0x66FF99 );
var canvas_UI = PIXI.autoDetectRenderer(width, height, {transparent:true});
canvas_UI.view.style.position = "absolute";
canvas_UI.view.style.top = "0px";
canvas_UI.view.style.left = "0px";
var graphics = new PIXI.Graphics();
graphics.beginFill( 0xe60630 );
graphics.moveTo( width/2-200, height/2+100 );
graphics.lineTo( width/2-200, height/2-100 );
graphics.lineTo( width/2+200, height/2-100 );
graphics.lineTo( width/2+200, height/2+100 );
graphics.endFill();
scene_UI.addChild( graphics );
//-------------------------------------------------------------------------------------
// Map 2D UI canvas on 3D Plane
//-------------------------------------------------------------------------------------
var texture_UI = new THREE.Texture( canvas_UI.view );
texture_UI.needsUpdate = true;
var material_UI = new THREE.MeshBasicMaterial( {map: texture_UI, side:THREE.DoubleSide } );
material_UI.transparent = true;
var mesh_UI = new THREE.Mesh( new THREE.PlaneGeometry(width, height), material_UI );
mesh_UI.position.set(0,0,0);
scene_3D.add( mesh_UI );
//-------------------------------------------------------------------------------------
// Render Animation
//-------------------------------------------------------------------------------------
function animate() {
requestAnimationFrame( animate );
canvas_UI.render( scene_UI );
cube.rotation.y += 0.01;
canvas_3D.render( scene_3D, camera );
}
animate();
</script>
</body>
์ฐ๋ฆฌ๋ ํ๋ก์ ํธ์์ ์ด์ ๊ฐ์ ์ผ์ํ๊ณ ์์ต๋๋ค. ๋ ์์ง (pixi ๋ฐ ThreeJS)์ด ์ค๋ณต ํธ์ถ์ ์ต์ํํ๊ธฐ ์ํด GL ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๊น๋ค๋ก์์ง๋๋ค. ์ฆ, ์๋ก ์ ์ด์ธ๋ฆฌ์ง ์์ผ๋ฏ๋ก ๋ ๋๋ฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ํ๋๊ทธ๋ฅผ ์ฌ์ค์ ํด์ผํฉ๋๋ค.
ThreeJS์ ์ ๋ฒ์ ์์๋ renderer.resetGLState()
์ฌ์ฉํ ์ ์์ต๋๋ค.
PIXI์์๋ ์ข ๋ ๋ณต์กํฉ๋๋ค. ์ด์ ๊ฐ์ ๊ฒ์ WebGLRenderer์์ ๋ฉ์๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ๋ค์ ์ ์ ํ์ํฉ๋๋ค
gl.disable(gl.DEPTH_TEST)
gl.enable(gl.BLEND)
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
gl.disable(gl.STENCIL_TEST)
gl.disable(gl.CULL_FACE)
gl.frontFace( gl.CCW )
gl.cullFace( gl.FRONT )
gl.colorMask(true, true, true, true)
gl.activeTexture(gl.TEXTURE0)
var shaderManager = session.shaderManager
shaderManager._currentId = undefined
for (var i=0; i<shaderManager.attribState.length; i++)
shaderManager.attribState[i] = false
shaderManager.setShader(shaderManager.currentShader)
var blend = session.blendModeManager.currentBlendMode
if (blend in PIXI.blendModesWebGL) {
session.blendModeManager.currentBlendMode = undefined
session.blendModeManager.setBlendMode(blend)
}
์ด๋ฅผ ํตํด ํ๋ ์ ๋ฒํผ ์ ํ์์ด 3D ์ฅ๋ฉด ์์ UI๋ฅผ ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
UI ์๋์์ ํ๋ฆผ ํจ๊ณผ๋ฅผ ์ป๋ ๊ฒ์ ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. ๋ค์์ ์ํํด์ผํฉ๋๋ค.
๋งค์ฐ ์ ํํ๊ณ ๋ฌธ์ํ ๋ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค Matt! :)
WebGL ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๋๋ ๋จผ์ Mix 2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ค ์๋๋ฐ, ํนํ ํดํน ๋ Three.js๊ฐ ๋ด๊ฐ ํ์๋กํ๋ ๊ฒ์ ์ํด pixi๋ฅผ ์ผ๋ถ ํ์ฅํ์ฌ ๋์ฒด ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ ํ์ต๋๋ค.
๊ทธ๋ฌ๋ 2D ๊ฐ๋ฐ์์ ์ด์ ์ธ ํ๋ฅญํ ์๋ gl2d ํธ์ถ์ pixi๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ฅผ ์ค๋ํ์ต๋๋ค.
Mix ์ ๊ทผ ๋ฐฉ์์ ์ ํํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฏ๋ก Pixi๊ฐ WebGL๋ก 2D ์์๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ํ์คํ ๋ ํจ์จ์ ์ธ ์ ํ์์ ํ์ธํ์ต๋๋ค.
๊ฑด๋ฐฐ
์ด์ํ
Mix ์ ๊ทผ ๋ฐฉ์์ ์ ํํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฏ๋ก Pixi๊ฐ WebGL๋ก 2D ์์๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ํ์คํ ๋ ํจ์จ์ ์ธ ์ ํ์์ ํ์ธํ์ต๋๋ค.
๊ธ์, ์๋ง๋. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ถ๊ฐ ์ฑ๋ฅ์ ๋ฌธ์ ์ด๋ฉฐ (ํ ๋ฒ์ 3000 ๊ฐ์ ๋ฒํผ ์ ๋๋ฉ์ด์ ์ด ํ์ํ๊ฐ์?) ๊ฐ๋ ฅํ ํ ์คํธ ๋ ๋๋ง, ํ ์คํธ ์ ๋ ฅ ๋ฐ ์คํฌ๋กค ์ด๋ฒคํธ์ ๊ฐ์ ๊ฒ์ WebGL์์ ๋งค์ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ UI์ DOM / CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. WebGL์ ์ ํํด์ผํ๋ ๊ฒฝ์ฐ (์ : ํน์ ํจ๊ณผ, ๊น์ด ํ ์คํธ ๋ฑ) Pixi๋ ์๋ง๋ 2D UI ์ฉ ThreeJS๋ณด๋ค ์ฌ์ธ ๊ฒ์ ๋๋ค.
๋๋ต ํ ๊ฒ ๊ฐ์์ ๋ซ์ผ๋ ค๊ณ ํฉ๋๋ค.
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ai๊ฐ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๊ฒ์๋ฌผ์ ํธ์งํ๊ณ ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์์ ์ฝ๋๋ฅผ ๊ฒ์ํฉ๋๋ค.