If you equate the world origin (0,0,0) with the camera focus (center of projection as you call it) and you assume the camera is pointing along the positive z-axis, then the situation looks like this in the plane x=0:
Here the axes are z (horizontal) and y (vertical). The subscript v
is for "viewport" or screen, and w
is for world.
If I get your meaning correctly, you know h
, the screen height in pixels. Also, zw
, yv
and xv
. You want to know yw
and xw
. Note this calculation has (0,0) in the center of the viewport. Adjust appropriately for the usual screen coordinate system with (0,0) in the upper left corner. Apply a little trig:
tan(43/2) = (h/2) / f = h / (2f), so f = h / ( 2 tan(43/2) )
and similar triangles
yw / zw = yv / f also xw / zw = xv / f
Solve:
yw = zw * yv / f and xw = zw * xv / f
Note this assumes the "focal length" of the camera is equal in the x-direction. It doesn't have to be. For best accuracy in xw
, you should recalculate with f = w / 2 tan(57/2)
where w
is the screen width. This is because f
isn't a true focal length. It's just a constant of conversion. If the pixels of the camera are square and optics have no aberrations, these two f
calculations will give the same result.
NB: In a deleted (improper) article the OP seemed to say that it isn't zw that's known but the length D of the hypotenuse: origin to (xw,yw,zw). In this case just note zw = D * f / sqrt(xv2 + yv2 + f2)
(assuming camera pixels are square; some scaling is necessary if not). They you can proceed as above.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…