Я пытаюсь получить двумерные экранные координаты точки в трехмерном пространстве, т.е. я знаю местоположение камеры в ее панорамировании, наклоне и рулоне, и у меня есть координаты 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?
} }
В принципе, мне нужно получить координаты 2D XY для данного экрана, где точка 3D пересекается. Я не уверен, как использовать матрицы roll, tilt и pan для преобразования точки мира (wp).
Любая помощь с этим очень ценится!