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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: reinterpret_cast класса в массив  (Прочитано 23861 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Январь 19, 2016, 12:55 »

Привет, друзья!
Интересуюсь такой темой. Возможно ли гарантировано перевести массив QVector3D в массив float?
Для наполнения буфера QOpenGLBuffer нужно в качестве void *data передавать координаты вершин (xyzxyzxyz...). Но если я храню вершины именно в таком виде, то проводить какие-либо операции с таким массивом неудобно. Постоянно приходится индексы домножать на 3... Вот и интересуюсь возможностью передавать в void *data указатель на массив QVector3D.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 19, 2016, 13:19 »

Но если я храню вершины именно в таком виде, то проводить какие-либо операции с таким массивом неудобно.
Та неужели Непонимающий И вумные итераторы никак не помогают?  Улыбающийся

Интересуюсь такой темой. Возможно ли гарантировано перевести массив QVector3D в массив float?
Таких средств в языке нет, все приводят. Для очистки совести вставьте
Код
C++ (Qt)
Q_ASSERT(sizeof(QVector3D) == sizeof(float) * 3);
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Январь 19, 2016, 13:27 »

Нет, итераторы помогают в другой задаче.
В этой же я рассматриваю вариант иметь QVector<QVector3D> vertices и в функцию наполнения буфера вставлять vertices.data(). Но я боюсь так делать, потому что завтра класс QVector3D может обзавестись новыми членами...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 19, 2016, 14:13 »

Но я боюсь так делать, потому что завтра класс QVector3D может обзавестись новыми членами...
Ну это вряд ли, такие "конкретные" классы практически нерасширяемы. На всякий случай гляньте что они используют в Qt3D - там тоже надо скармливать OpenGL флоты
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Январь 19, 2016, 17:14 »

Да, можно.

Структура Vertex, например, плотно пакуется, поэтому можно использовать

Код
C++ (Qt)
struct Vertex
{
  float x;
  float y;
  float z;
}
 
Q_STATIC_ASSERT( sizeof( Vertex ) == 3 * sizeof( floet ) );
 
QVector< Vertex > vertices;
QOpenGLBuffer buffer;
 
...
 
buffer.write( offset, vertices.constData(), 3 * vertices.count() );
 

Все же нужно гарантировать размер, поэтому используем Q_STATIC_ASSERT
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 20, 2016, 07:51 »

Но я боюсь так делать, потому что завтра класс QVector3D может обзавестись новыми членами...
Код
C++ (Qt)
typedef QVector3D Vector3D;
 

а если завтра поломают кютешный, то пишете свой класс, и меняете только тайпдеф:
Код
C++ (Qt)
typedef MyValidVector3D Vector3D;
 
« Последнее редактирование: Январь 20, 2016, 07:52 от Old » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Январь 20, 2016, 09:27 »

Old, мне нравится ваш вариант.
А нам стандарт гарантирует, что x и z не будут поменяны местами в памяти? Ну это так, уже перфекционизм Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 20, 2016, 12:05 »

А нам стандарт гарантирует, что x и z не будут поменяны местами в памяти?
Да

Напомню что QVector3D - мягко говоря, далеко не самая лучшая реализация класса вектор/точка. Напр сейчас большинство таких классов в различных приложениях имеют не 3, а 4 float. Возможно есть смысл подыскать более продвинутый класс, зависимостей он не тянет
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Январь 20, 2016, 12:35 »

Igors, вы можете посоветовать какой-то конкретный класс?
Для 4 float можно же взять QVector4D
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 20, 2016, 13:21 »

Igors, вы можете посоветовать какой-то конкретный класс?
Напр очень неплох btVector3 (open sources Bullet). Или погуглите Vec3, Vector3, Vec3f
Для 4 float можно же взять QVector4D
Тут дело не просто в "четырех", подумайте зачем так сейчас делают (Вы знаете ответ, даже создавали такие темы)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Январь 20, 2016, 14:17 »

Честно говоря, я не увидел преимуществ у btVector3 над QVector3D...

Тут дело не просто в "четырех"
Не понимаю, на что именно вы намекаете. Четвёртая координата - так называемый множитель. Я всегда использую w=1.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Январь 20, 2016, 14:18 »

у btVector3 w=0 в конструкторе
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 20, 2016, 14:48 »

Не понимаю, на что именно вы намекаете. Четвёртая координата - так называемый множитель. Я всегда использую w=1.
Видимо Вы просмотрели doхygen документацию, а Вы сам хедер-то откройте (btVector3.h), там "аж кишит", какие уж тут "намеки".

Честно говоря, я не увидел преимуществ у btVector3 над QVector3D...
А Вы поизучайте, сравните напр доступ к членам, конструкторы по умолчанию, операции скалярного и векторного произведения и.т.п. Возможно Вы обнаружите что btVector3 многое делает "совсем не так как в книжке" Улыбающийся Он заточен на профессионала, а QVector3D - на читателя ассыстента.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Январь 20, 2016, 15:13 »

Он заточен на профессионала, а QVector3D - на читателя ассыстента.
"Ты посмотри какой котон, какие лейблы..." (c) СОиП
Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #14 : Январь 20, 2016, 22:58 »

QVector3D богомерзок... Юзайте флоты и будэ щастя...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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