В настоящее время я кодирую систему меню в JAVA и вам необходимо преобразовать из координат мира в координаты экрана. Я прочитал много поста о том, как это сделать, и построил следующее:opengl нормализованные координаты устройства больше 1
float[] v = new float[]{0,0,0,1}; //four vector location of object in object space
//multiply by model matrix
v[0] = model[0]*v[0] + model[4]*v[1] + model[8]*v[2] + model[12]*v[3];
v[1] = model[1]*v[0] + model[5]*v[1] + model[9]*v[2] + model[13]*v[3];
v[2] = model[2]*v[0] + model[6]*v[1] + model[10]*v[2] + model[14]*v[3];
v[3] = model[3]*v[0] + model[7]*v[1] + model[11]*v[2] + model[15]*v[3];
//multiply by projection matrix
v[0] = projection[0]*v[0] + projection[4]*v[1] + projection[8]*v[2] + projection[12]*v[3];
v[1] = projection[1]*v[0] + projection[5]*v[1] + projection[9]*v[2] + projection[13]*v[3];
v[2] = projection[2]*v[0] + projection[6]*v[1] + projection[10]*v[2] + projection[14]*v[3];
v[3] = projection[3]*v[0] + projection[7]*v[1] + projection[11]*v[2] + projection[15]*v[3];
//account for distortions
v[0] = v[0]/v[3];
v[1] = v[1]/v[3];
v[2] = v[2]/v[3];
v[3] = v[3]/v[3];
//transform to screen coords.
onScreenX = (int)((viewport[2] * (v[0] + 1.0f))/2.0f) + viewport[0];
onScreenY = (int)((viewport[3] * (v[1] + 1.0f))/2.0f) + viewport[1];
System.out.println(onScreenX + ", " + onScreenY);
Сейчас большая проблема, которую я имею, что после того, как я в перспективе разрыв я должен иметь значение от -1 до 1. Однако , Я получаю некоторые, которые находятся за пределами этого диапазона, хотя объект явно отображается на экране. Я не знаю, чего я мог бы здесь потерять.
Я уже знаю о функции gluProject()
, но этот расчет расположен вдали от того места, где находится мой объект glu
, и поэтому функция будет бесполезной. Это должно быть сделано с помощью математической математики.
o.O Должно быть, я слишком долго работал над этим кодом, чтобы пропустить такую простую ошибку. Большое вам спасибо за указание на это. Сейчас работает как сон. –