Three.js: unproject - рд╡рд┐рд╢рд┐рд╖реНрдЯ 3D рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА 'рд╕реНрдХреНрд░реАрди (рдКрдкрд░, рдмрд╛рдПрдВ)' рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЬрдире░ 2011  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ (x, y) рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреЛ '3 рдбреА' рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХрд┐рд╕реА рднреА рд╕реБрд░рд╛рдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЙрдиреНрдирдпрди рдХреЗ рдмрд╛рдж рднреА рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

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 рд╡реЗрдХреНрдЯрд░ рдХреЗрд╡рд▓ object3D.position рдХреЛ рд╣рд░ object3D рдХреЛ 2 рдбреА рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ object3D.screen рдмрд╣реБрдд рдХрдо рдореВрд▓реНрдп рдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ x, y, рд╕реНрдерд┐рддрд┐ x рдкрд░ рдХрд┐рд╕реА рднреА рдЬрд╛рд▓ рдХреЗ z, 2D рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ z, рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рд╡рд╕реНрддреБ рдХреА рд╣рд░ 3 рдбреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди THREE.3dto2d() рдЬреЛ рдпрд╛ рддреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ 3 (рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ 3 рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЬрд╣рд╛рдВ рд╡реЗрдХреНрдЯрд░ 3 рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдлрд╝рдВрдХреНрд╢рди рддрдм рджреГрд╢реНрдп рдореЗрдВ 3 рдбреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреИрдорд░рд╛, рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐, рд░реЛрдЯреЗрд╢рди, рдкреНрд░реЛрдЬреЗрдХреНрд╢рдирдореИрдЯрд┐рдХреНрд╕ рдЖрджрд┐ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдВрджреБ рдХреЛ 2 рдбреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреИрдорд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдЦреИрд░ ... Projector.projectScene рдереЛрдбрд╝реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ;)

рджреЗрдЦреЗрдВ, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯрд░ рдерд╛ ... ;-)

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рд╣рдореНрдо ... рдЕрднреА рддрдХ рдирд╣реАрдВ ... рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЗрдВрдбрд░рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рд╡реЗ рдореВрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдореБрдЭреЗ рдореВрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдВрдХ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ ... рд╣рдореНрдо, рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдкрд░ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдореИрдВ рд╡рд╛рдкрд╕ (рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣) рдПрдХ рд▓реЗрдВрд╕ рднрдбрд╝рдХрдирд╛ рдбреЗрдореЛ (рдпрд╛ рдХреБрдЫ) рдХрд░реВрдВрдЧрд╛ред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдкрдиреА рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ рдФрд░ рдореИрдВ рдирдП рдбреЗрдореЛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ! :-)

рд╣рдореНрдо, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП (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 };

}

рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рд╛рдБ, рдкрд░рд┐рд╡рд░реНрддрди matrices рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдорд╛рд░реЛрд╣ рдиреЗ alivedise рдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 3 рдбреА рдХреНрдпреВрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рд╕рд╣реА рдзрд╛рдЧрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд╛рде рдХреИрдирд╡рд╛рд╕ рдкрд░ рдПрдХ рдХреНрдпреВрдм рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпреВ рдПрдХреНрд╕ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдЕрдХреНрд╖ рдкрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдШреВрдо рд░рд╣рд╛ рд╣реИред рдЬрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдмрд╕реЗ рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рдЪреЗрд╣рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдЙрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдШреБрдорд╛рдХрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдорджрдж рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реЛрдЧреАред

рдзрдиреНрдпрд╡рд╛рджред

@ imrantariq2011 : рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдорди рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред

рдмрдирд╛рд╡рдЯ рдорд╛рдирдЪрд┐рддреНрд░рдг рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ x рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, y рд╕реНрдХреНрд░реАрди рдПрдХ рджрд┐рдП рдЧрдП рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд (toScreenXY: function) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡ рд░реВрдкрд╛рдВрддрд░рд┐рдд (рд╕реНрдХреЗрд▓реНрдб, рдЕрдиреБрд╡рд╛рджрд┐рдд рдФрд░ рдШреБрдорд╛рдП рдЧрдП) рдХреЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ Projector.projectScene рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЙрдкрд░реЛрдХреНрдд рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ редmatrixWorld.getPosition () рдЪреЗрд╣рд░реЗ рдХреЗ рдХреЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХреЗрдВрджреНрд░рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдБ, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХрд┐рд╕реА рдПрдХ рдХреЗ рд▓рд┐рдП рдерд╛ред рдпрджрд┐ рдЖрдкрдХреЛ .projectScene() рд╕реЗ рдХреЛрдб рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рддреЛ рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

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

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдлрдВрдХреНрд╢рди toScreenXY (рдкреЙрд╕ 3 рдбреА)
{{
var рдкреНрд░реЛрдЬреЗрдХреНрдЯрд░ = рдирдпрд╛ THREE.Projector ();
var v = рдкреНрд░реЛрдЬреЗрдХреНрдЯрд░.projectVector (рдкреЙрд╕ 3 рдбреА, рдХреИрдорд░рд╛);
var percX = (vx + 1) / 2;
var percY = (-vy + 1) / 2;
var left = percX * window.innerWidth;
var top = percY * window.innerHeight;

рдирдпрд╛ THREE.Vector2 (рдмрд╛рдПрдВ, рдКрдкрд░) рд▓реМрдЯреЗрдВ;
}

рд╢реБрдХреНрд░рд╡рд╛рд░, 1 рдЕрдЧрд╕реНрдд, 2014 11:24 рдкреВрд░реНрд╡рд╛рд╣реНрди, рдЖрд░реНрдЯреЗрдо рдлрд┐рдЯрд┐рд╕реНрдХрд┐рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЬрдм рдореИрдВ toScreenXY рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВред
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдкреЙрдЬрд╝): // x: -1474.1436403989792, y: -730.829023361206, z: 3.0004000663757324
рдФрд░ рдЗрд╕реЗ jqdiv рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рдмрдбрд╝рд╛ x рдФрд░ y рджреЗрддрд╛ рд╣реИред
рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ?
-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

@ рдпрд╛рд░реАрд▓рдЬреЗрдХ

рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рджрд┐рд╢рд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ , рдорджрдж рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП stackoverflow ред рдпрд╣ рдмреЛрд░реНрдб рдмрдЧ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред

рдареАрдХ рд╣реИ ... рдЕрднреА рддрдХ рд╢реНрд░реА doob рдЦреБрдж рдХреЛрдб рдбрд╛рд▓ рджрд┐рдпрд╛, рддреЛ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ?

@ рд╕рд╛рд▓рд▓рдЬреЗрдХ # 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. рдЕрдм рдЖрдк рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддреЗ рд╣реИрдВред
  2. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рд░реЗрдВрдбрд░рд░ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдмреБрд▓рд╛рдпрд╛ рд╣реИ
  3. рдпрд╣ рдЧреИрд░-рдиреЗрд╕реНрдЯреЗрдб рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдЧрдгрдирд╛ рднреА рдХрд░реЗрдЧрд╛ред
  4. рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдХреНрд░реАрди-рдЬрд╝реЗрдб рднреА рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдбреЛрдорд┐рдирд▓ рдпрд╛ zSort рд▓реЗрдмрд▓ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
    рд╕реНрдХреНрд░реАрди-рдЬреЗрдб рд╕рд╛рдкреЗрдХреНрд╖ 0 рдФрд░ 1 рдХреЗ рдмреАрдЪ рд╣реИ, рдХреИрдорд░реЗ / рд░реЗрдВрдбрд░рд░ рдХреЗ рд╕рд╛рдордиреЗ рдФрд░ рдкреАрдЫреЗ рдХреА рдХрддрд░рди рд╡рд╛рд▓реЗ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдФрд░ рдпрд╣ рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рдЫрдВрдЯрд╛рдИ) рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  5. рдЖрдк рд░реЗрдВрдбрд░рд░реНрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд░реЗрдВрдбрд░рд░.рдбреЛрдореЗ.рд▓реАрдореЗрдВрдЯреЗрд╢рди рдФрд░ рд░реЗрдВрдбрд░рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
scene.updateMatrixWorld(); 

рддрдерд╛

parent.updateMatrixWorld(); 

`` `рдЬреЗ.рдПрд╕.
рдлрд╝рдВрдХреНрд╢рди nestedObjecttoScreenXYZ (obj, рдХреИрдорд░рд╛, рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ)
{{
var рд╡реЗрдХреНрдЯрд░ = рдирдпрд╛ THREE.Vector3 ();
рд╡реЗрдХреНрдЯрд░.рд╕реЗрдЯрдлреНрд░реЙрдордореИрдЯреНрд░рд┐рдХреНрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ (obj.matrixWorld);
var widthHalf = (рдЪреМрдбрд╝рд╛рдИ / 2);
var heightHalf = (рдКрдВрдЪрд╛рдИ / 2);
рд╡реЗрдХреНрдЯрд░.рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдХреИрдорд░рд╛);
рд╡реЗрдХреНрдЯрд░.x = (рд╡реЗрдХреНрдЯрд░.x * рдЪреМрдбрд╝рд╛рдИрд╣рд▓реНрдлрд╝) + рдЪреМрдбрд╝рд╛рдИрд╣рд▓реНрдлрд╝;
рд╡реЗрдХреНрдЯрд░.рдп = - (рд╡реЗрдХреНрдЯрд░.рдп * рдКрдВрдЪрд╛рдИрд╣рд▓реНрдлрд╝) + рдКрдВрдЪрд╛рдИрд╣рд▓реНрдлрд╝;
рд╡рд╛рдкрд╕реА рд╡реЗрдХреНрдЯрд░;
};



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

рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

clawconduce picture clawconduce  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Horray picture Horray  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alexprut picture alexprut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yqrashawn picture yqrashawn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

boyravikumar picture boyravikumar  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ