Создание 3д объекта(полотна) с выводом на него изображения
Столкнулся с проблемой вывода изображения на 3д сцену. Имеется 3d модель, у которой есть экран, на котом надо получит изображение. Средствами Qml не смог это осуществить, так как объект загружался через Item3D, пробовал так же через rectangle, но он 2d объект. Думал что решить проблему проще через написание класса на С++ с использованием OpenGl, но столкнулся с проблемой, что он выводит изображение только в чистое окно, а, допустим, в тот же не хочет.
Код объекта, который я загружаю.
Код:
Image {
id: image1
height: 60
anchors.fill: parent
sourceSize.height: 600
sourceSize.width: 1024
source: "fon.jpg"
Rectangle {
id: rectangle1
color: "#b6b6b6"
anchors.rightMargin: 10
anchors.leftMargin: 10
anchors.bottomMargin: 162
anchors.topMargin: 10
anchors.fill: parent
border.width: 2
Viewport {
anchors.fill: parent
.....................................................................
//Загружаем модель
Model{id: model}
.....................................................................
Item3D{id:shield; mesh:model.shield; position:Qt.vector3d(0,-20,98); light: model.light1; transform: model.move_shield}
}
}
id: image1
height: 60
anchors.fill: parent
sourceSize.height: 600
sourceSize.width: 1024
source: "fon.jpg"
Rectangle {
id: rectangle1
color: "#b6b6b6"
anchors.rightMargin: 10
anchors.leftMargin: 10
anchors.bottomMargin: 162
anchors.topMargin: 10
anchors.fill: parent
border.width: 2
Viewport {
anchors.fill: parent
.....................................................................
//Загружаем модель
Model{id: model}
.....................................................................
Item3D{id:shield; mesh:model.shield; position:Qt.vector3d(0,-20,98); light: model.light1; transform: model.move_shield}
}
}
Код:
void circle1::paint(QPainter *painter)
{
painter->save();
int f=255;
//параметры окна
int x=width();
int y=height();
int z=width()/214;
//устанавливаем цвет контура и заливки
QPen pen = QPen(Qt::NoPen);
QBrush black_brush = QBrush(QColor::fromRgba(qRgba(0,0,0,255)));
QBrush red_brush = QBrush(QColor::fromRgba(qRgba(255,0,0,f)));
painter->setPen(pen);
//вычисляем кол-во зон Фринеля
double m;
m=1/(_distance_to_the_screen*0.01)+(1/((_distance_to_the_screen2-_distance_to_the_screen)*0.01));
m=m*_radius*_radius*0.000001;
m=m/(_wavelength*0.000000001);
//выделяем целую часть числа, рисуем минимумы и максимумы
int k=int(m);
if(k!=0)
{
m=(x/2-2*z)/k;
if(m/k>=0.5)m=int(m)-1;
for(int i=1;i<=k;i++)
{
if(i%2==1)
{
painter->setBrush(red_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
else
{
painter->setBrush(black_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
}
}
else
{
int i=0;
painter->setBrush(red_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
axis(painter);
painter->restore();
}
{
painter->save();
int f=255;
//параметры окна
int x=width();
int y=height();
int z=width()/214;
//устанавливаем цвет контура и заливки
QPen pen = QPen(Qt::NoPen);
QBrush black_brush = QBrush(QColor::fromRgba(qRgba(0,0,0,255)));
QBrush red_brush = QBrush(QColor::fromRgba(qRgba(255,0,0,f)));
painter->setPen(pen);
//вычисляем кол-во зон Фринеля
double m;
m=1/(_distance_to_the_screen*0.01)+(1/((_distance_to_the_screen2-_distance_to_the_screen)*0.01));
m=m*_radius*_radius*0.000001;
m=m/(_wavelength*0.000000001);
//выделяем целую часть числа, рисуем минимумы и максимумы
int k=int(m);
if(k!=0)
{
m=(x/2-2*z)/k;
if(m/k>=0.5)m=int(m)-1;
for(int i=1;i<=k;i++)
{
if(i%2==1)
{
painter->setBrush(red_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
else
{
painter->setBrush(black_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
}
}
else
{
int i=0;
painter->setBrush(red_brush);
painter->drawEllipse(2+m*(i-1),2+m*(i-1),x-4-m*(i-1)*2,y-4-m*(i-1)*2);
}
axis(painter);
painter->restore();
}
Как выглядит все это по отдельности:
Само изображение - красный круг, а полотно, где его надо получить - это на модели слева.
Может ли кто подсказать, как все же получить нужное мне изображение, заранее благодарю!
Ничего не понял в вашей задумке. Но, помнится, что когда нечто 2D натягивают на 3D это называется текстурирование. Может вам просто текстура в виде круга на 3d объекте нужна? Берите плоскую грань (или создайте невидимый кубик под нужным полем зрения) и текстурируйте. Как-то так...
Пробовал rectangle привязать по верх щита, но там слишком сложно, так как нету угла поворота самой модели, да и крутится он(rectangle) как то совсем не так, как надо.