我正在尝试获取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)。
非常感谢任何帮助!
答案 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;
...
}
返回的x
和y
值介于-0.5 ... 0.5