Three.js: рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП FOV рдХреА рдЧрдгрдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдлрд╝рд░ре░ 2012  ┬╖  19рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рдЪреВрдБрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ 3D рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкрд┐рдЫрд▓рд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдБ рдЬреЛ рдЖрдкрдХреЛ 3D рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ;)ред
рдореЗрд░реЗ рдкрд╛рд╕ рджреГрд╢реНрдп рдЖрдХрд╛рд░ (800x600, 1200x100 рдЖрджрд┐) рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ 0 рдХреА az рд╕реНрдерд┐рддрд┐ рд╡рд╛рд▓реА рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдПрдХ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ рдЬреЛ рджреГрд╢реНрдп рдХреЗ рдкреВрд░реЗ рджреГрд╢реНрдп рдХреЛ рднрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред

рдЙрджрд╛рд╣рд░рдг: рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрд╖ A 1200x100 рд╣реИ рдФрд░ Z рд╕реНрдерд┐рддрд┐ рдкрд░ рд╣реИред рджреГрд╢реНрдп 1200x100 рднреА рд╣реИред рдХреИрдорд░рд╛ z рд╕реНрдерд┐рддрд┐ 1500 рдкрд░ рд╣реИред рд╡рд╕реНрддреБ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП FOV рдХреНрдпрд╛ рд╣реИ?

((рдП / рдмреА) * рд╕реА рдХреА рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ: рдбреАред

рдХреБрджреЛрд╕ рдХреА рдЕрдирдВрдд рд░рд╛рд╢рд┐ рдЬреЛ рднреА рдореЗрд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рд╣реИ :)

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

рджреГрд╢реНрдп height рдиреЗ рд▓рдВрдмрд╡рдд рдлрд╝реАрд▓реНрдб-рдСрдл-рд╡реНрдпреВ vFOV рдФрд░ рдХреИрдорд░реЗ рд╕реЗ рджреВрд░реА dist рд╣реИ

height = 2 * Math.tan( ( vFOV / 2 ) ) * dist;

рджреГрд╢реНрдп width рд╣реИ

aspect = window_width / window_height;
hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
width  = 2 * Math.tan( ( hFOV / 2 ) ) * dist;

THREE.js рдореЗрдВ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб-рдСрдл-рд╡реНрдпреВ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд▓рдВрдмрд╡рдд рд╣реИред

рджреЛ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ vFOV рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдмрдбрд╝реЗ рдЙрддреНрддрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рд╕рднреА 19 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рджреГрд╢реНрдп height рдиреЗ рд▓рдВрдмрд╡рдд рдлрд╝реАрд▓реНрдб-рдСрдл-рд╡реНрдпреВ vFOV рдФрд░ рдХреИрдорд░реЗ рд╕реЗ рджреВрд░реА dist рд╣реИ

height = 2 * Math.tan( ( vFOV / 2 ) ) * dist;

рджреГрд╢реНрдп width рд╣реИ

aspect = window_width / window_height;
hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
width  = 2 * Math.tan( ( hFOV / 2 ) ) * dist;

THREE.js рдореЗрдВ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб-рдСрдл-рд╡реНрдпреВ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд▓рдВрдмрд╡рдд рд╣реИред

рджреЛ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ vFOV рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдмрдбрд╝реЗ рдЙрддреНрддрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж :)
рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдБред рдореБрдЭреЗ рдЪрд░ vFOV рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓реЗрдЧрд╛?
рдХреНрдпрд╛ рдпрд╣ рдЙрд╕ рд╡рд╕реНрддреБ рдХреА рдКрдВрдЪрд╛рдИ рд╣реИ рдЬреЛ рджреГрд╢реНрдп рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЕрдЬреАрдм рд╕рдВрдЦреНрдпрд╛рдПрдБ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ (1000 рд░реЗрдВрдЬ рдореЗрдВ) рддреЛ рдореИрдВ рдЗрд╕реЗ рдЖрдЦрд┐рд░рдХрд╛рд░ FOV рдХреИрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░реВрдБред

рдореИрдВрдиреЗ рдПрдХ рдлрд┐рдбреЗрд▓ http://jsfiddle.net/dmYgr/6/ рдмрдирд╛рдпрд╛
рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?

рдпреБрдЧ рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХреЗ рдкреЛрд╕реНрдЯ рд╕реЗ рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдореБрдЭрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рд╣реИрдВ;)

рдкрд╣рд▓реЗ рд╕рдореАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ vFOV рд▓рд┐рдП рд╣рд▓ рдХрд░реЗрдВ, рдлрд┐рд░ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП fov рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдореЗрд░рд╛ рд╕реАрди 800 * 600 рдХрд╛ рд╣реИред
рдХреИрдорд░реЗ рдХреА рджреВрд░реА 1000 рд╣реИред

рдореИрдВ рдЖрдкрдХреЗ рдлреЙрд░реНрдореВрд▓реЗ рдореЗрдВ рдЗрди рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ vFOV рдореЗрдВ рдХреНрдпрд╛ рднрд░рдирд╛ рд╣реИред

рдКрдВрдЪрд╛рдИ = 2 * рдЧрдгрд┐рддред ((vFOV / 2)) * dist; <- рдЖрдк рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕ рдирдВрдмрд░ рдХреЛ vFOV рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкрд╣рд▓реЗ рд╕рдореАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ vFOV рддрд░рд╣ рд╣рд▓ рдХрд░реЗрдВ

vFOV = 2 * Math.atan( height / ( 2 * distance ) );

рдЗрд╕рдХреЗ рдмрд╛рдж рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП fov рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

var renderWidth = 800;
var renderHeight = 600;
var cameraPosition = 1000;
var vFOV = 2 * Math.atan( renderWidth / ( 2 * cameraPosition ) );
var height = 2 * Math.tan( ( vFOV / 2 ) ) * cameraPosition;
var aspect = renderWidth / renderHeight;
var hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
var width  = 2 * Math.tan( ( hFOV / 2 ) ) * cameraPosition;

рдкрд░рд┐рдгрд╛рдо:
vFOV = 0.7610127542247298 рдЬреЛ рдорд╛рдиреНрдп FOV рдирд╣реАрдВ рд╣реИ

var vFOV = 2 * Math.atan( renderHeight / ( 2 * cameraPosition ) );
var height = 2 * Math.tan( ( vFOV / 2 ) ) * cameraPosition;

var aspect = renderWidth / renderHeight;
var hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
var width  = 2 * Math.tan( ( hFOV / 2 ) ) * cameraPosition;

vFOV = 0.5829135889557342 рдЬреЛ рдПрдХ рдорд╛рдиреНрдп FOV рднреА рдирд╣реАрдВ рд╣реИ

рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рднрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реИрдз FOV рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИ?
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ 37 рд╣реИ

рдЕрдкрдиреА рдмреЗрд▓рд╛ рдореЗрдВ,

рдКрдБрдЪрд╛рдИ = рдЕрдкрдиреЗ рд╡рд┐рдорд╛рди рдЬрд╛рд▓ рдХреА рдКрдБрдЪрд╛рдИ = релрежрежред

рджреВрд░реА = camera.z - plane.z = 1000 - 100 = 900ред

vFOV = 2 * Math.atan (рдКрдВрдЪрд╛рдИ / (2 * рджреВрд░реА)) = 0.5419 рд░реЗрдбрд┐рдпрди, рдпрд╛ 31.04 рдбрд┐рдЧреНрд░реАред

2 * рдореИрде.рдЯрди (500 / (2 * 900)) = 0.5418937006768411 рдореЗрд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ (google chrome)

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рд░реЗрдбрд┐рдпрди рд╕реЗ рдбрд┐рдЧреНрд░реА рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рджрд┐рдЦрд╛рдиреЗ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреА рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдХреАред

рдЖрдкрдХреЛ рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! : рдбреА
рд╣рд╣, рдпрд╣ 10 рдЙрддреНрддрд░реЛрдВ рдХреА рддрд░рд╣ рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)ред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

@ рдЯреЛрдмреИрд╕рд╛рд░реНрдЯреНрдЬ :-)

рд╡реЗрд╕реНрдЯ рд▓реИрдВрдЧреНрд▓реАред рдЖрдк рдПрдХ рд░рд╛рдЬрд╛ рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣ рд╕реБрдкрд░ рд╕рд╣рд╛рдпрдХ рдерд╛ !! рдзрдиреНрдпрд╡рд╛рдж @WestLangley !

рдзрдиреНрдпрд╡рд╛рдж @WestLangley !!
рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдХрд┐ рдореБрдЭреЗ рд░реЗрдбрд┐рдПрдВрдЯ рд╕реЗ рдбрд┐рдЧреНрд░реА рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рдпрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ:

var distance = 1000;
var FOV = 2 * Math.atan( window.innerHeight / ( 2 * distance ) ) * 180 / Math.PI;
var camera = new THREE.PerspectiveCamera( FOV, window.innerWidth/window.innerHeight, 0.1, distance );
camera.position.z = distance;

@ Emanuele-Spatola рдЖрдкрдХреЗ рд╕реВрддреНрд░ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред window.innerHeight рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реИрдВред distance рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рджреГрд╢реНрдпрдорд╛рди рдКрдБрдЪрд╛рдИ рдХреА рджреВрд░реА рдХреЗ рд╕рдорд╛рди рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЙрд╕ рдлреЙрд░реНрдореВрд▓реЗ рдХреЗ рд╕рд╛рде рдЯреЛрдмреАрд╕рд╛рд░реНрдЯреНрдЬ рдХреА рдлрд┐рдбреЗрд▓ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ:
http://jsfiddle.net/dmYgr/63/
рдХреИрдирд╡рд╛рд╕ 500px рд╣реИ, рд╡рд┐рдорд╛рди 495x495 рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдЧрднрдЧ 5px рд╕реАрдорд╛ рд╣реИред
1000px рдПрдХ рд╡реИрдз рджреВрд░реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

http://jsfiddle.net/dmYgr/65/

1000px рдПрдХ рд╡реИрдз рджреВрд░реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рдЕрдкрдиреЗ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдХреИрдорд░рд╛ 1000 рдкрд┐рдХреНрд╕реЗрд▓ рд░рдЦрд╛ рд╣реИ?

рдЖрдк 10 рдлреАрдЯ рдЪреМрдбрд╝реЗ рдПрдХ рджреГрд╢реНрдп рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП 10 рдлреАрдЯ рджреВрд░ рдПрдХ рдЕрд╕рд▓реА рдХреИрдорд░рд╛ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдЖрдк рдПрдХ рджреГрд╢реНрдп рдХреЛ 1000px рдЪреМрдбрд╝рд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрднрд╛рд╕реА рдХреИрдорд░рд╛ 1000px рджреВрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдореБрдЭреЗ рдХреИрдорд░реЗ рдХреА рдКрдВрдЪрд╛рдИ, рдЪреМрдбрд╝рд╛рдИ рдФрд░ рджреВрд░реА рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ ...

var distance = 1000,height=window.innerHeight,width=window.innerWidth
var diag = Math.sqrt((height*height)+(width*width))
var FOV = 2 * Math.atan( diag / ( 2 * distance ) ) * 180 / Math.PI;
var camera = new THREE.PerspectiveCamera( FOV, window.innerWidth/window.innerHeight, 0.1, distance );
camera.position.z = distance;

рдЗрд╕ рддрд░рд╣ рдКрдВрдЪрд╛рдИ> рдЪреМрдбрд╝рд╛рдИ рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреА рдЬрд╛рддреА рд╣реИрдВ ...

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

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

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

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

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

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

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