Базовый рендеринг 3D перспективной проекции на 2D экран с помощью камеры (без opengl)

Допустим, у меня есть структура данных, подобная следующей:

Camera {
   double x, y, z

   /** ideally the camera angle is positioned to aim at the 0,0,0 point */
   double angleX, angleY, angleZ;
}

SomePointIn3DSpace {
   double x, y, z
}

ScreenData {
   /** Convert from some point 3d space to 2d space, end up with x, y */
   int x_screenPositionOfPt, y_screenPositionOfPt

   double zFar = 100;

   int width=640, height=480
}

...

Без обрезания экрана или чего-либо еще, как бы я мог вычислить экранную позицию x,y некоторой точки, учитывая некоторую 3d точку в пространстве. Я хочу спроецировать эту 3d точку на 2D экран.

Camera.x = 0
Camera.y = 10;
Camera.z = -10;


/** ideally, I want the camera to point at the ground at 3d space 0,0,0 */
Camera.angleX = ???;
Camera.angleY = ????
Camera.angleZ = ????;

SomePointIn3DSpace.x = 5;
SomePointIn3DSpace.y = 5;
SomePointIn3DSpace.z = 5;

ScreenData.x и y - это положение 3d-точки в пространстве. Как мне вычислить эти значения?

Я мог бы использовать уравнения, найденные здесь, но я не понимаю, как в дело вступает ширина/высота экрана. Также, я не понимаю в вики, что такое позиция зрителя по отношению к позиции камеры.

http://en.wikipedia.org/wiki/3D_projection

25
задан Berlin Brown 2 January 2012 в 05:33
поделиться