如何应用转换矩阵?

时间:2009-05-11 21:30:10

标签: 3d projection

我正在尝试获取3D空间中某个点的2D屏幕坐标,即我知道相机的位置,它的平移,倾斜和滚动,我有一个点的3D x,y,z坐标我希望项目

我很难理解转换/投影矩阵,我希望这里的一些聪明人可以帮助我;)

这是我到目前为止一起抛出的测试代码:

public class TransformTest {

public static void main(String[] args) {

    // set up a world point (Point to Project)
    double[] wp = {100, 100, 1};
    // set up the projection centre (Camera Location)
    double[] pc = {90, 90, 1};

    double roll = 0;
    double tilt = 0;
    double pan = 0;

    // translate the point
    vSub(wp, pc, wp);

    // create roll matrix
    double[][] rollMat = {
            {1, 0, 0},
            {0, Math.cos(roll), -Math.sin(roll)},
            {0, Math.sin(roll), Math.cos(roll)},
    };
    // create tilt matrix
    double[][] tiltMat = {
            {Math.cos(tilt), 0, Math.sin(tilt)},
            {0, 1, 0},
            {-Math.sin(tilt), 0, Math.cos(tilt)},
    };
    // create pan matrix
    double[][] panMat = {
            {Math.cos(pan), -Math.sin(pan), 0},
            {Math.sin(pan), Math.cos(pan), 0},
            {0, 0, 1},
    };

    // roll it
    mvMul(rollMat, wp, wp);
    // tilt it
    mvMul(tiltMat, wp, wp);
    // pan it
    mvMul(panMat, wp, wp);

}

public static void vAdd(double[] a, double[] b, double[] c) {
    for (int i=0; i<a.length; i++) {
        c[i] = a[i] + b[i];
    }
}

public static void vSub(double[] a, double[] b, double[] c) {
    for (int i=0; i<a.length; i++) {
        c[i] = a[i] - b[i];
    }      
}

public static void mvMul(double[][] m, double[] v, double[] w) {

    // How to multiply matrices?
} }

基本上,我需要的是获得3D点相交的给定屏幕的2D XY坐标。我不知道如何使用滚动,倾斜和平移矩阵来改变世界点(wp)。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:28)

答案 1 :(得分:3)

这个范围太大,无法在这里得到一个好的答案:我建议阅读一个关于这个主题的好参考。我一直很喜欢Foley and VanDam ...

答案 2 :(得分:1)

我发布了一些代码here,可以满足您的需求。

它包含OpenGL gluPerspective()gluLookAt()函数的Java实现:

Camera camera = new Camera();

Point3d eye = new Point3d(3, 4, 8);
Point3d center = new Point3d(0, 0, 0);
Vector3d up = new Vector3d(0, 1, 0);

camera.perspective(60.0, 1.6, 0.1, 20); // vertical fov, aspect ratio, znear, zfar
camera.lookAt(eye, center, up);

要使用其中的project()功能,请使用:

void plot(Camera camera, Point4d p) {
    Point4d q = Camera.project(p);
    float x = q.x / q.w;
    float y = q.y / q.w;
    ...
}

返回的xy值介于-0.5 ... 0.5

范围内