Three.js: unproject-ํŠน์ • 3D ๊ฐœ์ฒด์˜ 'ํ™”๋ฉด (์œ„, ์™ผ์ชฝ)'์—์„œ ์‹ค์ œ ์œ„์น˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™”๋ฉด์˜ ํ•œ ์ง€์  (x, y)์„ '3d'์ง€์ ์œผ๋กœ ํˆฌ์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ๋ฒˆ์—ญํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Question

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

์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ํ•„์š”๋กœํ•œ๋‹ค๋ฉด ...

function screenXY(obj){

  var vector = obj.clone();
  var windowWidth = window.innerWidth;
  var minWidth = 1280;

  if(windowWidth < minWidth) {
    windowWidth = minWidth;
  }

  var widthHalf = (windowWidth/2);
  var heightHalf = (window.innerHeight/2);

  vector.project(camera);

  vector.x = ( vector.x * widthHalf ) + widthHalf;
  vector.y = - ( vector.y * heightHalf ) + heightHalf;
  vector.z = 0;

  return vector;

};

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

์•„๋งˆ๋„ ํ”„๋กœ์ ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ MrDoob์€ ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

์Œ์€, ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผ object3d.screen ๋  ๊ฒƒ์ด๋ผ๊ณ  Vector2 ๋ชจ๋“  ๋ Œ๋”๋ง์— ์—…๋ฐ์ดํŠธ?

ํ•ด๋‹น object3D.screen Vector๊ฐ€ ๋ชจ๋“  object3D์˜ object3D.position์„ 2D๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ object3D.screen ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์ง€ ์•Š์„๊นŒ์š”? ๋‚ด ๋ง์€ : x, y, z ์œ„์น˜์—์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์˜ ๋ชจ๋“  ์  x, y, z๋ฅผ 2D ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋ชจ๋“  ๋ฌผ์ฒด์˜ ๋ชจ๋“  3D ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Vector3 (์žฅ๋ฉด์˜ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ„) ๋˜๋Š” Vector3์™€ ๊ฐœ์ฒด (Vector3๊ฐ€ ๊ฐœ์ฒด์˜ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ„)๋ฅผ ์ทจํ•˜๋Š” THREE.3dto2d() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ์ด ํ•จ์ˆ˜๋Š” ์žฅ๋ฉด์—์„œ 3D ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ์นด๋ฉ”๋ผ, ์œ„์น˜, ํšŒ์ „, projectionMatrix ๋“ฑ์„ ๊ฐ€์ ธ ์™€์„œ ์ ์„ ๋‹ค์‹œ 2D๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์นด๋ฉ”๋ผ๋„ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„ ... Projector.projectScene ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค;)

๋ด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ”„๋กœ์ ํ„ฐ ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค ... ;-)

๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ  ... ์•„์ง ...์ด ํ•จ์ˆ˜๋Š” Renderer์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฐ์ฒด์™€ ๊ด€๊ณ„์—†์ด ๋ Œ๋”๋ง ํ•  ์š”์†Œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋„ฃ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ... ์Œ, ์ข€ ๋” ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ ํœด์ผ์ด์ง€๋งŒ ๋Œ์•„ ์˜ค์ž๋งˆ์ž (๋‹ค์Œ ์ฃผ) ๋ Œ์ฆˆ ํ”Œ๋ ˆ์–ด ๋ฐ๋ชจ (๋˜๋Š” ๋ฌด์–ธ๊ฐ€)๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์ฆ๊ฑฐ์šด ํœด๊ฐ€ ๋ณด๋‚ด์‹œ๊ณ  ์ƒˆ๋กœ์šด ๋ฐ๋ชจ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! :-)

ํ , ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ (r32), r35์—์„œ๋Š” ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ..

  toScreenXY: function(position, camera, jqdiv) {
    // converts 3D position to screen coords
    var pos = position.clone();
    projScreenMat = new THREE.Matrix4();
    projScreenMat.multiply( camera.projectionMatrix, camera.matrix);
    projScreenMat.multiplyVector3(pos);
    return { x: (pos.x+1)*jqdiv.width()/2 + jqdiv.offset().left, 
             y:(-pos.y+1)*jqdiv.height()/2 +jqdiv.offset().top }; 
  },

projScreenMat.multiplyVector3(pos); ์ดํ›„์˜ ์œ„์น˜๋Š”๋ณด๊ธฐ์˜ ์ค‘์‹ฌ์—์„œ -1๊ณผ 1 ((0,0) ์‚ฌ์ด๋กœ ์ œํ•œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.) ์ด์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ..

์˜ˆ, camera.matrix ๋ฅผ ์ง€๊ธˆ camera.matrixWorldInverse ๋กœ ๋ฐ”๊ฟ”์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค :

toScreenXY: function ( position, camera, jqdiv ) {

    var pos = position.clone();
    projScreenMat = new THREE.Matrix4();
    projScreenMat.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
    projScreenMat.multiplyVector3( pos );

    return { x: ( pos.x + 1 ) * jqdiv.width() / 2 + jqdiv.offset().left,
         y: ( - pos.y + 1) * jqdiv.height() / 2 + jqdiv.offset().top };

}

๊ทธ๋ž˜, ๋งคํŠธ๋ฆญ์Šค ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ์…˜ ๊ธฐ๋Šฅ์ด alivedise์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

3D Cube์— ๋Œ€ํ•ด ์ œ ์งˆ๋ฌธ์„ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ ๊ฐ€๋Šฅํ•œ๋ฉด์œผ๋กœ ์บ”๋ฒ„์Šค์— ํ๋ธŒ๋ฅผ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค. ํ๋ธŒ๋Š” X ์ถ•๊ณผ Y ์ถ•์—์„œ ์ž์œ ๋กญ๊ฒŒ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์šฐ์Šค๋ฅผ ๋†“์„ ๋•Œ ๊ฐ€์žฅ ์•ž๋ฉด์„ ์–ป๊ณ  ์ž๋™์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ์™„์ „ํžˆ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋งฅ๋ฝ์—์„œ ์–ด๋–ค ๋„์›€์ด๋ผ๋„ ๋งค์šฐ ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ imrantariq2011 :์ด ๋ฌธ์ œ์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋„ ๋ ๊นŒ์š”? ๊ฐ์‚ฌ.

ํ…์Šค์ฒ˜ ๋งคํ•‘์„ ์œ„ํ•ด ์ฃผ์–ด์ง„ ์–ผ๊ตด์— ๋Œ€ํ•œ ๊ฐ ์ •์ ์— ๋Œ€ํ•œ x, y ํ™”๋ฉด ์ขŒํ‘œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ (toScreenXY : ํ•จ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋จผ์ € ์ฃผ์–ด์ง„ ์–ผ๊ตด์— ๋Œ€ํ•ด ๋ณ€ํ™˜ ๋œ (ํฌ๊ธฐ ์กฐ์ •, ์ด๋™ ๋ฐ ํšŒ์ „ ๋œ) ์ •์  ์„ธ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Projector.projectScene์„ ์‚ดํŽด๋ณด๋ฉด์„œ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ์œ„์˜ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. object.matrixWorld.getPosition ()์ด ์–ผ๊ตด ์ •์ ์ด ์•„๋‹Œ ๊ฐ์ฒด์˜ ์ค‘์‹ฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์œ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. .projectScene() ์ž์ฒด์—์„œ ์ฝ”๋“œ ๋น„ํŠธ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์œผ๋ฉด ๋งŽ์€ ํฌ์ธํŠธ๋ฅผ ํˆฌ์˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ.

์—ฌ๊ธฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์‹ถ์–ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :

https://github.com/zachberry/threejs-tracking-3d-to-2d

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

toScreenXY (pos3D) ํ•จ์ˆ˜
{
var projector = new THREE.Projector ();
var v = projector.projectVector (pos3D, ์นด๋ฉ”๋ผ);
var percX = (vx + 1) / 2;
var percY = (-vy + 1) / 2;
var left = percX * window.innerWidth;
var top = percY * window.innerHeight;

return new THREE.Vector2 (left, top);
}

2014 ๋…„ 8 ์›” 1 ์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 11:24์— Artem Fitiskin [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

toScreenXY๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‚˜๋Š” ๋งค์šฐ ํฐ ๊ฐ€์น˜๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
console.log (pos) : // x : -1474.1436403989792, y : -730.829023361206, z : 3.0004000663757324
jqdiv์™€ ๊ณฑํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ๋งค์šฐ ํฐ x์™€ y๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ˆ?
โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋ฟก ๋นต๋€จ

์ง€์นจ์— ๋ช…์‹œ๋œ๋Œ€๋กœ ๋„์›€๋ง ์š”์ฒญ์€ stackoverflow๋กœ ์ „๋‹ฌ ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒŒ์‹œํŒ์€ ๋ฒ„๊ทธ ๋ฐ ๊ธฐ๋Šฅ ์š”์ฒญ์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„์š” ... ๋‘๋ธŒ ์”จ๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ ํ–ˆ์œผ๋‹ˆ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

@arieljake # 1979

์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ํ•„์š”๋กœํ•œ๋‹ค๋ฉด ...

function screenXY(obj){

  var vector = obj.clone();
  var windowWidth = window.innerWidth;
  var minWidth = 1280;

  if(windowWidth < minWidth) {
    windowWidth = minWidth;
  }

  var widthHalf = (windowWidth/2);
  var heightHalf = (window.innerHeight/2);

  vector.project(camera);

  vector.x = ( vector.x * widthHalf ) + widthHalf;
  vector.y = - ( vector.y * heightHalf ) + heightHalf;
  vector.z = 0;

  return vector;

};

์ข‹์•„, ์•„์ฃผ ์˜ค๋ž˜๋œ ๋ฌธ์ œ์ด์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ค‘์ฒฉ ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ œ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ํ›„ ์ค‘์ฒฉ ๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์‹ค์ œ x-and-y (๋ฐ z) ์œ„์น˜๋ฅผ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์˜ˆ๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ  :

  1. ์ด์ œ ์œ„์˜ ์˜ˆ์—์„œ object.position๋งŒ์ด ์•„๋‹ˆ๋ผ ์ „์ฒด ๊ฐœ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ๋˜ํ•œ ์ด๊ฒƒ์€ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ํ˜ธ์ถœ ํ•œ ํ›„์— ๋งŒ โ€‹โ€‹์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ค‘์ฒฉ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด์—์„œ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๊ณ„์‚ฐ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋˜ํ•œ domElements ๋˜๋Š” zSort ๋ ˆ์ด๋ธ”์„ ์ •๋ ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” screen-Z๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    screen-z ์ƒ๋Œ€๋Š” ์นด๋ฉ”๋ผ / ๋ Œ๋”๋Ÿฌ์˜ ์ „๋ฉด ๋ฐ ํ›„๋ฉด ํด๋ฆฌํ•‘ ํ‰๋ฉด์„ ๊ธฐ์ค€์œผ๋กœ 0๊ณผ 1 ์‚ฌ์ด์ด๋ฉฐ ๋‚ด ๋ชฉ์  (์ •๋ ฌ)์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  5. renderer.domElement.width ๋ฐ renderer.domElement.height๋กœ ๋ Œ๋”๋Ÿฌ์˜ ํ˜„์žฌ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
scene.updateMatrixWorld(); 

๊ณผ

parent.updateMatrixWorld(); 

```js
function nestedObjecttoScreenXYZ (obj, camera, width, height)
{
var vector = new THREE.Vector3 ();
vector.setFromMatrixPosition (obj.matrixWorld);
var widthHalf = (๋„ˆ๋น„ / 2);
var heightHalf = (๋†’์ด / 2);
vector.project (์นด๋ฉ”๋ผ);
vector.x = (vector.x * widthHalf) + widthHalf;
vector.y =-(vector.y * heightHalf) + heightHalf;
๋ฆฌํ„ด ๋ฒกํ„ฐ;
};

typical call:
```js
var screenpos=NestedObjecttoScreenXY(object,camera,renderer.domElement.width,renderer.domElement.height,true);

๋ˆ„๊ตฐ๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ์— ๋ถ€๋”ช ํž ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด.

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