2016-12-31 11 views
2

У меня есть 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 и заимствован их имидж, но, к сожалению, ответа есть слишком общий характер, чтобы быть полезным.)

ответ

0

Документация D3DXMatrixLookAtLH говорит, что FOV задается в направлении у, так что вы, вероятно, хотите чтобы сделать ваш расчет на основе высоты, а не ширины.

https://msdn.microsoft.com/en-us/library/windows/desktop/bb205350(v=vs.85).aspx

+0

Спасибо, что ответили! :) Как вы можете видеть в коде DirectX, который я опубликовал, я уже компенсирую это, разделив на aspectRatio: 'FOVx.valueRadians()/aspectRatio'. Вы упустили из виду это или вы имеете в виду, что я перехожу из FOVx в FOVy неправильно? – Oogst

0

В то же время я, наконец, решить мою проблему. :) Ошибка заключается в том, что переход от fovX к fovY - это не просто деление на соотношение сторон. Так эта линия была проблема:

fovX.valueRadians()/aspectRatio 

Переход от fovX к fovY может быть сделано несколькими способами, в зависимости от того, какие параметры вы используете. Вот один из способов сделать это:

fovY = 2 * atan((cameraHeight/2)/((cameraWidth/2)/tan(fovX/2))) 

Позиция Z камеры, которую я подсчитал, была уже правильной! :)