Russian Qt Forum
Май 02, 2024, 16:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Итератор (?) для shared/unshared  (Прочитано 2923 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 07, 2014, 12:04 »

Добрый день

Сколько "вершин" (вертексов) имеет простейший кубик? Нормальный человек ответит 8 (восемь). Однако изучающий OpenGL скажет 24. Да, обычно так, чтобы удобнее было "рисовать массивами", в каждом углу по 3 вертекса. И вот пользователь кликнул на один вертекс, допустим чтобы изменить его цвет. И требуется менять у всех 3 "совпадающих". Ясно что сначала, на этапе предрасчета надо посчитать какие совпадают, напр
Код
C++ (Qt)
int ver[24] = { 0, 1, 0, 5, 6, 0, 1 ... };   // значения 0..7 для 24 вертексов  
 
Т.е. известно что нулевой, второй и пятый вертексы совпадают. Теперь как, получив напр только 5-й вертекс удобно применить ту же операцию для 0-го и 2-го?

Спасибо
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Август 07, 2014, 13:32 »

Я вижу так:
Описать каждую реальную вершину в виде 3 значений, которые будут указывать на вершины GL.
Обращаясь к реальной вершине мы получаем 3 вершины GL.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 07, 2014, 16:29 »

Я вижу так:
Описать каждую реальную вершину в виде 3 значений, которые будут указывать на вершины GL.
Обращаясь к реальной вершине мы получаем 3 вершины GL.
Три в каждой - всего лишь частный случай, а в общем любое число unshared может соответствовать 1 позиции shared
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Август 07, 2014, 17:30 »

Не совсем понимаю что такое shared/unshared.

Я бы взял структуру наподобии
Код:
struct MyVertex
{
    int count;                     //Число вершин в точке
    int* glVertexesId;          //Номера этих вершин
    //double x, y, z;
};

Создал бы вектор таких структур, который бы полностью описал бы "человеческие" вершины.

Для каждой вершины GL записал бы номер, соответствующий номеру "человеческой" вершины в этом векторе.

Получается, что пользователь выбирает gl вершину (я понял, что происходит это именно так). Для вершины у нас записан номер в векторе MyVertex. Далее смотрим, что за gl вершины у нас записаны в glVertexesId.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 07, 2014, 18:03 »

Не совсем понимаю что такое shared/unshared.
Если полигоны используют (шарят) одни и те же индексы вертексов - то это shared (кубик Крутой. Если же используются разные индексы (для совпадающих позиций) - это unshared (кубик 24).

Я бы взял структуру наподобии
Код:
struct MyVertex
{
    int count;                     //Число вершин в точке
    int* glVertexesId;          //Номера этих вершин
    //double x, y, z;
};

Создал бы вектор таких структур, который бы полностью описал бы "человеческие" вершины.

Для каждой вершины GL записал бы номер, соответствующий номеру "человеческой" вершины в этом векторе.

Получается, что пользователь выбирает gl вершину (я понял, что происходит это именно так). Для вершины у нас записан номер в векторе MyVertex. Далее смотрим, что за gl вершины у нас записаны в glVertexesId.
Поняли правильно. Такой подход в стиле С вполне возможен. Однако надо иметь и второй массив для хранения glVertexesId, причем создать его не так уж просто. Использование выглядит несколько громоздким, напр
Код
C++ (Qt)
// получен index одного из вертексов
for (int i = 0; i < indices[index]; ++i)
 SetColor(indices[index].glVertexesId[i]);
Хотелось бы более "в духе плюсов"  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Август 07, 2014, 18:39 »

Код
C++ (Qt)
// получен index одного из вертексов
for (int i = 0; i < indices[index]; ++i)
 SetColor(indices[index].glVertexesId[i]);
Хотелось бы более "в духе плюсов"  Улыбающийся
А я бы это же сделал так
Код:
int* currentVertex = &indices[index];
int* endVertex = currentVertex + indices[index].count;
while (currVertex != endVertex)
{
    SetColor(currVertex->glVertexesId[i]);
    currVertex++;                     // <-- в стиле плюсов ;)
}

или короче

Код:
for (; currVertex != endVertex; ++currVertex)
    SetColor(currVertex->glVertexesId[i]);

или суперкратко Улыбающийся

Код:
while (currVertex != endVertex)
    SetColor((currVertex++)->glVertexesId[i]);


не в духе плюсов, но почему бы и нет Улыбающийся

можно использовать ссылку на переменную MyVertex перед применением цикла.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 23.