Предистория
собственно сам проэкт - игра лабиринт.
на данном этапе надо нарисовать нарисовать кубик и использовать для отрисовки индексные массивы.
со стандартной отрисовкой кубик рисовался нормально сейчас же получается вот такая фигня:
http://dump.bitcheese.net/images/html/seveboj/le.jpeg.html
какие могут быть тому причины? вот сам проэкт: http://dump.bitcheese.net/files/rukujaz/La...tEditor.tar.bz2
используемые инструменты c++, qt, opengl.
создание массивов вершин и индексов происходит в файле boxcretor.h
P.S
вот такая еще фигня обнаружилась:
IVerticalPlane и IVerticalPlaneNext - две противоположные стороны бокса перед рисованием IVerticalPlaneNext должно изменяется Position.z на заданную ддлину бокса и он должен рисоватся сдвинутым ... а оно и если сдвигать и если закомментировать изменение Position.z рисует одноитоже...
Проблеммы с отрисовкой при использовании индексных массивов OpenGl
Модератор: Модераторы разделов
-
Stvad
- Сообщения: 106
- ОС: Gentoo Linux
-
Alxn1
- Сообщения: 402
- Статус: Красноглазик со стажем
- ОС: Mavericks
Re: Проблеммы с отрисовкой при использовании индексных массивов OpenGl
Посмотрел я ваш код. Вы просто не совсем понимаете, что такое индексный буфер, и что в них должно храниться.
Смотрите, у вас есть буфер вершин. Их там, предположим, 4-е - это углы квадрата. Буфер вершин - это, собственно, массив вершин. Таким образом, верхняя левая вершина квадрата будет иметь индекс в массиве 0, верхняя правая - 1, нижняя правая - 2, и оставшаяся вершина (нижняя левая) - 3. (Тут хорошо бы нарисовать на бумажке квадрат, и расставить у вершин номера).
Теперь проведите линию из вершины 0 в вершину 2. У вас получится на рисунке 2 треугольника, образующих квадрат. Обходим по часовой стрелке оба треугольника и записываем подряд индексы вершин этих треугольников: 0, 1, 2, 0, 2, 3 - вот это вот и есть соответствующий индексный буфер, с помощью которого из вертексного буфера на 4-е вертекса мы можем нарисовать квадрат из 2-х треугольников.
Ничего сложного, в общем, если рисовать на бумаге
Аналогично можно так на бумаге нарисовать кубик, триангулировать его (разбить на треугольники), пронумеровать вершины и обойти все треугольники по часовой стрелке - и построить буфер индексов для кубика
Главное только, что бы в вертексном буфере вертексы лежали в том же порядке, в котором вы их пронумеровали 
И вот пример кода для построения одной грани куба (я взял за основу ваш код и немного порисовал):
Весь кубик лень было рисовать, да и вам самому будет интереснее, думаю
Смотрите, у вас есть буфер вершин. Их там, предположим, 4-е - это углы квадрата. Буфер вершин - это, собственно, массив вершин. Таким образом, верхняя левая вершина квадрата будет иметь индекс в массиве 0, верхняя правая - 1, нижняя правая - 2, и оставшаяся вершина (нижняя левая) - 3. (Тут хорошо бы нарисовать на бумажке квадрат, и расставить у вершин номера).
Теперь проведите линию из вершины 0 в вершину 2. У вас получится на рисунке 2 треугольника, образующих квадрат. Обходим по часовой стрелке оба треугольника и записываем подряд индексы вершин этих треугольников: 0, 1, 2, 0, 2, 3 - вот это вот и есть соответствующий индексный буфер, с помощью которого из вертексного буфера на 4-е вертекса мы можем нарисовать квадрат из 2-х треугольников.
Ничего сложного, в общем, если рисовать на бумаге
И вот пример кода для построения одной грани куба (я взял за основу ваш код и немного порисовал):
Код: Выделить всё
Box BoxCreator::CreateBox( Point3D Position,
float Width,
float Height,
float Length,
float VertexPerWidth,
float VertexPerHeight,
float VertexPerLength )
{
points.clear();
indexes.clear();
float dx = Width / VertexPerWidth;
float dy = Height / VertexPerHeight;
float dz = Length / VertexPerLength;
Vertex temp;
int currentVertexNumber = 0;
int countVertexesPerWidth = VertexPerWidth;
int lastLineIndexStart = VertexPerWidth * VertexPerHeight - VertexPerWidth - 1;
temp.Position.z = Position.z + Length / 2.0;
for( float y = 0.0; y < Height; y += dy )
for( float x = 0.0; x < Width; x += dx )
{
temp.Position.x = Position.x - Width / 2.0 + x;
temp.Position.y = Position.y - Height / 2.0 + y;
points.push_back( temp );
if( ( ( currentVertexNumber + 1 ) % countVertexesPerWidth ) != 0 &&
currentVertexNumber < lastLineIndexStart ||
currentVertexNumber == 0 )
{
indexes.push_back( currentVertexNumber );
indexes.push_back( currentVertexNumber + 1 );
indexes.push_back( currentVertexNumber + countVertexesPerWidth + 1 );
indexes.push_back( currentVertexNumber );
indexes.push_back( currentVertexNumber + countVertexesPerWidth + 1 );
indexes.push_back( currentVertexNumber + countVertexesPerWidth );
}
currentVertexNumber++;
}
return Box( points, indexes );
}Весь кубик лень было рисовать, да и вам самому будет интереснее, думаю