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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QGLSceneNode текстуры (добавление или изменение)  (Прочитано 18615 раз)
spirits25
Гость
« : Октябрь 30, 2012, 16:38 »

Доброе время суток.
Я создаю произвольный объект QGLSceneNode
Код:

QGeometryData prim;

//наполняю вертексами, нормалями и текстурными координатами.
prim.appendVertex(...);
prim.appendNormal(...);
prim.appendTexCoord(...);

//добавляю в QGLBuilder объект
builder.addQuadStrip(prim);

//получаю свой объект QGLSceneNode
return builder.finalizedSceneNode();

Вопрос:
1) как наложить новую текстуру на этот же объект QGLSceneNode, но не на весь, а на часть его (задав новые текстурные координаты??)?
2) как изменить текстурные координаты уже существующего объекта QGLSceneNode? или просто заменить старую текстуру на новую?

Если кто знает, можете минимальный пример показать? хотя и подсказкам буду рад=)
« Последнее редактирование: Май 08, 2013, 12:00 от spirits25 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 31, 2012, 13:33 »

Судя по доке текстурные координаты (UV) доступны (texCoords(At). Другое дело откуда Вы их возьмете (т.е. на что менять). Они должны быть кем-то созданы (напр в спец редакторе), это не так просто. Если у Вас есть наборы UV - то просто заряжайте их QGL::TextureCoord0, QGL::TextureCoord1, а потом указывайте текстурам какие юзать.

Вообще текстура имеет параметры наложения (масштаб и др), обычно их меняют (а не UV). Наложение на часть сводится к изменению параметров текстуры и указанию нужного clamp'а. Ну можно использовать имедж с альфа-каналом чтобы покрыть часть.

Ну и по-хорошему UV - это 3 значения (а не 2). Это мне у них не понравилось
Записан
spirits25
Гость
« Ответ #2 : Октябрь 31, 2012, 14:26 »

Судя по доке текстурные координаты (UV) доступны (texCoords(At). Другое дело откуда Вы их возьмете (т.е. на что менять). Они должны быть кем-то созданы (напр в спец редакторе), это не так просто. Если у Вас есть наборы UV - то просто заряжайте их QGL::TextureCoord0, QGL::TextureCoord1, а потом указывайте текстурам какие юзать.

Вообще текстура имеет параметры наложения (масштаб и др), обычно их меняют (а не UV). Наложение на часть сводится к изменению параметров текстуры и указанию нужного clamp'а. Ну можно использовать имедж с альфа-каналом чтобы покрыть часть.

Ну и по-хорошему UV - это 3 значения (а не 2). Это мне у них не понравилось

Можете дать ссылку на документацию? и это Qt3D или OpenGL?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 31, 2012, 14:37 »

Можете дать ссылку на документацию? и это Qt3D или OpenGL?
Как изменить текстурные координаты

QVector2D & QGeometryData::texCoord

Как наложить часть текстуры

QGLTexture2D::setVerticalWrap
QGLTexture2D::HorizontalWrap
QGLTexture2D::setSize
Записан
spirits25
Гость
« Ответ #4 : Октябрь 31, 2012, 14:54 »

Как изменить текстурные координаты

QVector2D & QGeometryData::texCoord

Как наложить часть текстуры

QGLTexture2D::setVerticalWrap
QGLTexture2D::HorizontalWrap
QGLTexture2D::setSize

Подскажите ещё:
1) вот у меня есть сфера, созданная с помощью QGLSphere. То есть чтобы так наложить произвольно текстуру QGLSphere не подойдёт? необходимо рисовать сферу самому?

2) Сферу нарисовать не проблема но у меня получится очень много QGeometryData. Необходимо будет хранить их все, например, в массиве с доступом по координатам?

3) вместо QGLMaterial нужно использовать QGLTexture2D?

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 31, 2012, 15:39 »

Подскажите ещё:
Хотя я еще не видел Qt3D "живьем", общие принципы везде одинаковы. Материал - это набор параметров который полностью определяет внешний вид объекта. Материал может иметь хоть 100 текстур (по крайней мере в теории), и не только текстур, а много еще чего. Можете Вы добавить QGLSphere как нод сцены. Нод имеет материал, материал может иметь текстуру. Плюс QGLSphere имеет UV - значит можете
Записан
spirits25
Гость
« Ответ #6 : Ноябрь 01, 2012, 11:09 »

Или я не понял, или мы друг друга не поняли. мне нужно не часть текстуры на сферу, а всю текстуру на часть сферы. То есть мой вопрос сводится к тому, как при наложении текстуры указать к каким координатам на сфере привязать её границы? мне нужно, чтобы не вся сфера была обтянута текстурой, а только часть её. причём после создания самой сферы, чтобы можно было так наложить. Можете мне с этой "стороны" помочь?=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 01, 2012, 12:17 »

1) подготовить имедж в центре которого уменьшенный исходный а по краям черная альфа - он сам ее и обрежет

2) изменить текстурные координаты - я бы попробовал сначала тупенько поделить/умножить на 2 и посмотреть что получится. Надо только установить wrap'ы чтобы текстура не тайлилась

3) наверное есть лучший способ/сервис - но я его пока не нашел
Записан
spirits25
Гость
« Ответ #8 : Ноябрь 01, 2012, 12:33 »

1) подготовить имедж в центре которого уменьшенный исходный а по краям черная альфа - он сам ее и обрежет

2) изменить текстурные координаты - я бы попробовал сначала тупенько поделить/умножить на 2 и посмотреть что получится. Надо только установить wrap'ы чтобы текстура не тайлилась

3) наверное есть лучший способ/сервис - но я его пока не нашел

Спасибо. Второй совет наиболее подходящий. Только я не могу этого сделать=)
Я не могу поменять отдельно текстурные координаты в созданном объекте
Код:
QGeometryData prim;

//наполняю вертексами, нормалями и текстурными координатами.
prim.appendVertex(...);
prim.appendNormal(...);
prim.appendTexCoord(...);

//добавляю в QGLBuilder объект
builder.addQuadStrip(prim);

//получаю свой объект QGLSceneNode
return builder.finalizedSceneNode();
, так как QGeometryData помещается в builder "builder.addQuadStrip" и я не могу достать и изменить эти координаты из уже готового объекта.

В общем мне нужно собрать текстуру сферы - Планеты из 8 или 16 кусков, но заранее неизвестно какие это куски и сколько их=) и при этом при определённом действии они могут сменить друг друга. Вот такая проблема=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 02, 2012, 14:38 »

Я не могу поменять отдельно текстурные координаты в созданном объекте
Чего это? Вот я вижу методы get/set

QGeometryData QGLSceneNode::geometry () const
QGeometryData QGLSceneNode::setGeometry ()
Записан
spirits25
Гость
« Ответ #10 : Ноябрь 02, 2012, 15:44 »

Я не могу поменять отдельно текстурные координаты в созданном объекте
Чего это? Вот я вижу методы get/set

QGeometryData QGLSceneNode::geometry () const
QGeometryData QGLSceneNode::setGeometry ()


пробовал, первоначально заданные текстурные координаты таким способом не изменяются.. не знаю почему, но получаю через geometry (), создаю новую переменную, присваиваю из старой вертексы и нормали, а текстурные координаты новые задаю.. устанавливаю новую через setGeometry, но ничего не меняется=(
Записан
spirits25
Гость
« Ответ #11 : Ноябрь 07, 2012, 11:58 »

В общем придумал, как сделать. но вот возник другой вопрос. Текстурные координаты для наложения одной прямоугольной текстуры на всю сферу у меня есть. А вот как вычислить текстурные координаты для наложения квадратной текстуры? может есть у кого эти вычисления, например, для http://tile.openstreetmap.org/0/0/0.png ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Ноябрь 07, 2012, 14:46 »

Обычно меняют картинку, всей сфере нужен имедж 2:1, можно просто растянуть (QGLTexture2D::setSize). 

 
Записан
spirits25
Гость
« Ответ #13 : Ноябрь 07, 2012, 15:47 »

Обычно меняют картинку, всей сфере нужен имедж 2:1, можно просто растянуть (QGLTexture2D::setSize). 

стандартный размер, установка
tex->setSize(QSize(256, 512));
и установка
tex->setSize(QSize(512, 256));
вообще ничем не отличаются. всё как то странно вытянуто, антарктида раз в 20 по площади больше, чем австралия. Африка по ширине больше, чем по высоте..
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Ноябрь 07, 2012, 17:56 »

стандартный размер, установка
tex->setSize(QSize(256, 512));
и установка
tex->setSize(QSize(512, 256));
вообще ничем не отличаются.
Значит делаете когда текстура уже загружена в OpenGL. Можно сразу сделать QImage::scaled,
Перед вызовом glTexImage2D размер установленный setSize сравнивается с размером исходного. Если не равны - QImage::scaled и OpenGL получит смасштабленный имедж

всё как то странно вытянуто, антарктида раз в 20 по площади больше, чем австралия. Африка по ширине больше, чем по высоте..
Так работает сферическая карта, с квадратной картинкой это нормально
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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