2014-02-06 7 views
0

Чтобы добавить молнию к кубу OpenGL ES20, мне нужно вычислить нормали для каждой плоскости. Я нашел «учебник» по молнии, но они просто жестко закодировали нормали в кубе, который кажется мне не лучшим вариантом, поскольку он кажется ограниченным?OpenGL ES20 - Света куба, как получить нормали?

Так что мой подход к кубу выглядит следующим образом:

private float[] mVertices = { 
     -1, -1, -1, // bottom left 
     1, -1, -1, // bottom right back 
     1, 1, -1, // top right 
     -1, 1, -1, // top left 
     -1, -1, 1, // bottom left 
     1, -1, 1, // bottom right front 
     1, 1, 1, // top right 
     -1, 1, 1 // top left 
}; 

private float[] mColors = { 
     0.6f, 0f, 0.6f, 
     0.6f, 0f, 0.6f, 
     0.6f, 0f, 0.6f, 
     0.6f, 0f, 0.6f, 

     0.8f, 0f, 0.6f, 
     0.8f, 0f, 0.6f, 
     0.8f, 0f, 0.6f, 
     0.8f, 0f, 0.6f 
}; 

private float[] mNormal = new float[?]; ? 

private short[] mIndices = { 
     0, 4, 5, 
     0, 5, 1, 

     1, 5, 6, 
     1, 6, 2, 

     2, 6, 7, 
     2, 7, 3, 

     3, 7, 4, 
     3, 4, 0, 

     4, 7, 6, 
     4, 6, 5, 

     3, 0, 1, 
     3, 1, 2 
}; 

т.е. у меня есть все 8 вершин определены, а также показатели, о том, как объединить их в треугольники. Чтобы получить нормальную матрицу, я прочитал, что должен преобразовать матрицу, а затем перенести ее. Так что я попытался это:

float[] mTempMatrix = new float[mVertices.length]; 
    Matrix.invertM(mTempMatrix, 0, mVertices, 0); 
    Matrix.transposeM(mNormal, 0, mTempMatrix, 0); 

Но это всегда заполнен нулями, а мой кубик остается черным. Как пример, я должен вычислить нормальную матрицу? Должно ли это быть что-то с модельной матрицей? Если да, то где я должен это делать, поскольку единственное место, где они действительно объединены, находится в шейдере? Есть ли другой способ сделать это, что было бы более уместным?

+0

Ваши вершины жестко закодированы, поэтому имеет смысл также жестко кодировать нормали (они не будут меняться больше, чем вершины). Каким образом вы видите это как представляющее какое-то ограничение? – NigelK

+0

Mh да, это правда, я думал иначе, так как я меняю вершины в конструкторе, но я только перемещаю их по ширине, высоте и глубине куба. Я больше думал о «будущем», о более подробных и сложных объектах, таких как полигоны и т. Д. Также я смущен тем, как добавить нормали, жестко закодированные так, как сейчас, особенно с индексами, сколько я нужны и где они должны основываться? EDIT: В примерах, которые я видел, у них было намного больше вершин, определенных без индексов, поэтому я не могу понять, как я должен адаптировать эту часть. – damian

+0

Хорошо, я кое-что пытался. Я думаю, что «жестко закодировать» нормали в нем, я должен изменить способ рисования куба. Я изменил цвета, чтобы определить, какой индекс представляет собой ту часть куба, но меняя все цвета на белый, за исключением одного, что привело к цветному углу, sinde вершина используется более одного раза. Поэтому я не знаю, как я должен добавить нормальную плоскость в реализацию моего куба. – damian

ответ

1

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

В качестве примера рассмотрим верхнюю/правую/переднюю вершину (которую вы разделяете с передней, правой и верхней сторонами).

При использовании на лицевой поверхности, нормальные потребности, чтобы указать к вам, как 0, 0, 1 При использовании на правой грани, нормальные потребности, чтобы указать на право как 1, 0, 0 При использовании на верхняя грань, нормальная должна указывать как 0, 1, 0

Так как смириться с этим? Вы можете установить нормальное значение для вершины, чтобы указать из угла, например. 0,707, 0,707, 0,707. Это, скорее всего, даст вам интересный световой эффект на углу, но, вероятно, не то, что вам нужно.

Другим решением является не повторное использование вершин между гранями. Таким образом, вам понадобится 24 (4 на сторону) вместо 8. Затем вы получите 3 версии каждой вершины, но каждый из них теперь принадлежит только одному лицу, поэтому вы можете установить нормальный вектор перпендикулярно этому лицу. Вы также сможете установить цвет только для этого лица, так как вы больше не будете делиться вершиной с другими лицами.

+0

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

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

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