2014-09-03 2 views
0

В настоящее время я кодирую систему меню в 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, и поэтому функция будет бесполезной. Это должно быть сделано с помощью математической математики.

ответ

1

Эти вычисления перезаписывают значения в векторе v с новыми, а затем используют их там, где все еще должны использоваться старые значения.

Просто глядя на первых двух заданий:

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[0], а затем использует его на правой стороне второго заявления. Поэтому для расчета v[1] новое значение для v[0] используется вместе со старыми значениями v[1], v[2] и v[3].

Такая же картина продолжается по всем расчетам.

Самый простой способ избежать этого - использовать новый вектор для каждого шага вычисления. Например:

float[] vModel = new float[4]; 
vModel[0] = model[0]*v[0] + model[4]*v[1] + model[8]*v[2] + model[12]*v[3]; 
vModel[1] = model[1]*v[0] + model[5]*v[1] + model[9]*v[2] + model[13]*v[3]; 
... 

float[] vProj = new float[4]; 
vProj[0] = projection[0]*vModel[0] + ... 
... 

Это позволяет избежать перезаписи значений новыми, в то время как старый все еще используется.

+0

o.O Должно быть, я слишком долго работал над этим кодом, чтобы пропустить такую ​​простую ошибку. Большое вам спасибо за указание на это. Сейчас работает как сон. –

 Смежные вопросы

  • Нет связанных вопросов^_^