У меня есть 2D-движок для прокрутки и хочу иметь возможность добавлять 3D-объекты. Так что мне нужна 3D-камера. Чтобы 2D-объекты выглядели точно так же, как раньше, мне нужно вычислить положение 3D-камеры, но почему-то мои расчеты отключены: он слишком сильно затухает. Ситуация:Расчет положения 3D-камеры на основе 2D-камеры
- Все мои 2D объекты при Z = 0.
- My 2D камера определяется как положение (X, Y) и ширину.
- Соотношение сторон изображения автоматически определяет высоту камеры.
- Для 3D-камеры пользователь устанавливает FOVx.
Так что, я думаю, на самом деле вопрос: как рассчитать положение Z камеры на основе ширины и FOVx?
Я понял, что могу просто использовать загар. Глядя на это изображение:
camera http://www.proun-game.com/Random/CameraMath.gif
Я полагал, что я мог бы вычислить камеры Z так:
cameraPos.z = width/2/tan(FOVx/2)
В результате, однако, неверно: зуммировании слишком далеко. Сколько слишком сильно зависит от установленного FOVx, поэтому он даже не согласован.
Это общий код, используемый для этого:
float cameraZ = -cameraWidth/2/tan(FOVx.valueRadians()/2);
D3DXMATRIX viewMatrix;
D3DXMatrixLookAtLH(&viewMatrix,
&D3DXVECTOR3(cameraPos.x, cameraPos.y, cameraZ), // the eye point
&D3DXVECTOR3(cameraPos.x, cameraPos.y, 0), // the camera look-at target
&D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // the current world's up direction
D3DXMATRIX projectionMatrix;
D3DXMatrixPerspectiveFovLH(&projectionMatrix,
FOVx.valueRadians()/aspectRatio, // Field of view in the y direction, in radians
aspectRatio, // Aspect ratio, defined as view space width divided by height
0.01f, // Z-value of the near view-plane
100.0f); // Z-value of the far view-plane
DXMatrix multiplied = worldMatrix * viewMatrix * projectionMatrix;
D3DXMatrixTranspose(&totalMatrixForCurrentObject, &multiplied);
Что я здесь делаю неправильно?
(я нашел this similar question и заимствован их имидж, но, к сожалению, ответа есть слишком общий характер, чтобы быть полезным.)
Спасибо, что ответили! :) Как вы можете видеть в коде DirectX, который я опубликовал, я уже компенсирую это, разделив на aspectRatio: 'FOVx.valueRadians()/aspectRatio'. Вы упустили из виду это или вы имеете в виду, что я перехожу из FOVx в FOVy неправильно? – Oogst