Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Это дает Вам два набора, каждое из трех уравнений в 3 переменных:
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
Просто использование безотносительно метода решения одновременных уравнений является самым легким в Вашей ситуации (даже не трудно решить их "вручную"). Затем Ваша матрица преобразования просто ((a, b, c) (d, e, f)).
...
На самом деле, который упрощен и принимает, камера указала на источник Вашей 3D системы координат и никакой перспективы.
Для перспективы, матрица преобразования работает больше как:
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
, но 4x3 матрица более ограничивается, чем 12 степеней свободы, так как мы должны иметь
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
, Таким образом, у Вас должно, вероятно, быть 4 точки, чтобы заставить 8 уравнений покрывать эти 6 переменных для положения камеры и угла и еще 1 для масштабирования 2-D точек наблюдения, так как мы сможем устранить "центральные" координаты (xc, yc).
Поэтому, если Вы имеете 4 точки и преобразовываете Ваши 2-D точки наблюдения, чтобы быть относительно центра Вашего дисплея, затем можно получить 14 одновременных уравнений в 13 переменных и решить.
, К сожалению, шесть из уравнений не являются линейными уравнениями. К счастью, все переменные в тех уравнениях ограничиваются значениями между-1 и 1, таким образом, все еще, вероятно, выполнимо решить уравнения.
Ваша камера имеет (по крайней мере) 7 степеней свободы - 3 для положения, 3 для ориентации и 1 для FOV. Я уверен, что кто-то исправит меня, если я буду неправ, но не кажется, что 3 точки достаточно для полного решения.
Для обобщенного решения этой проблемы, ищите 'Корреляцию Представления' в Графических Драгоценных камнях II.
Я не думаю, что существует достаточно информации для нахождения категорического решения. Не зная Ваше местоположение камеры и не зная Вашу плоскость представления, существует бесконечное число матриц, которые могут решить эту проблему.