IrrlichtФорум

Как SceneNode назначить цвет?

#0
21:47, 16 июля 2010

Всем привет! создал SceneNode через addSphereSceneNode() , а как ему назначить цвет найти ни как не могу.

#1
16:43, 17 июля 2010

Привет. Советую внимательно изучить стандартные примеры идущие в комплекте, тем более их можно найти на русском  в интернет.
Что касается вопроса: не знаю как насчет задать цвет самому "ноду", но на него можно натянуть текстуру определенного цвета
Делается это так:
1. Создаешь картинку размером 128х128 например в любом графическом редакторе(Paint и др.)
2. В своей программе пишешь:

ISceneNode* node = addSphereSceneNode();
node->setMaterialTexture(0, driver->getTexture("../../media/red.jpg")); // файл созданной текстуры, например красного цвета

#2
17:05, 17 июля 2010

Текстуру тоже можно создать динамически:

ITexture* texture_generator(IVideoDriver* driver, video::ECOLOR_FORMAT image_format = ECF_R8G8B8, const dimension2d<u32>& image_size = dimension2d<u32>(2, 2), char* texture_name = "texture_01", u32 alpha_value = 128, u32 red1 = 0, u32 red2 = 255, u32 green1 = 0, u32 green2 = 255, u32 blue1 = 0, u32 blue2 = 255)
{
  int row, column;
  IImage* image = driver->createImage(image_format, image_size);
  int alpha = 0;
  bool blend = false;
  video::ECOLOR_FORMAT color_format = image->getColorFormat();
  if (color_format == ECF_A1R5G5B5 || color_format == ECF_A8R8G8B8 || color_format == ECF_A16B16G16R16F || color_format == ECF_A32B32G32R32F)
  {
    alpha = alpha_value;
    blend = true;
  }
  for (row = 0; row++; image_size.Height)
  {
    for (column = 0; column++; image_size.Width)
      image->setPixel(row, column, SColor(alpha, randrange(red1, red2), randrange(green1, green2), randrange(blue1, blue2)), blend);
  }
  return driver->addTexture(texture_name, image);
}

Полный исходник смотри здесь http://vosolok2008.narod.ru/pyirrlicht.zip

#3
18:44, 17 июля 2010

Чтобы задать цвет самому ноду нужно поменять цвет материала, который по умолчанию белый. Материал можно задать создав объект типа SMaterial, задать цвет через его поля, а потом применить этот материал к ноду.

#4
12:37, 18 июля 2010

Всем большое спасибо, буду пробовать.

#5
11:19, 19 июля 2010

>Материал можно задать создав объект типа SMaterial, задать цвет через его поля, а потом применить этот материал к ноду.
пример кода есть?

#6
5:22, 20 июля 2010

Теоретически должно работать это:

node->getMaterial(0).DiffuseColor.set(255,255,0,0); //красный

В описании getMaterial() есть строки: ...but can also be used to directly modify the material of a scene node.

То есть: ...но может также использоваться, чтобы непосредственно изменить материал узла сцены.

Не знаю почему практически ничего не получается...
Кстати и в IrrEdit цвет материала тоже не меняется. Хотя в свойствах цвет можно менять.

#7
8:47, 20 июля 2010

да мне тоже первой пришла что и твоя мысль, но по факту оказалось...

фишка вся в том, что возвращает метод getMaterial()
а он возвращает копию материала SMaterial & а не ссылку на него SMaterial *
и метода setMaterial чтобы запихнуть материал обратно - нет

потому и попросил пример кода

>Теоретически должно работать это:
>node->getMaterial(0).DiffuseColor.set(255,255,0,0); //красный
должно, если не учитывать особенность которую я упомянул сейчас

Прошло более 2 лет
#8
2:28, 29 июня 2013

Я нашёл такой способ, вроде работает:

dimension2d<u32> image_size = dimension2d<u32>(2, 2);
    IImage* image = driver->createImage(ECF_R8G8B8,image_size);
    ECOLOR_FORMAT color_format = image->getColorFormat();
    for (int j=0;j<image_size.Height;j++)
      for (int i=0;i<image_size.Width;i++)
      {
        image->setPixel(j,i,SColor(255,red,green,blue),false);
      }

      ITexture *color=driver->addTexture("color",image);
    node->setMaterialTexture(0,color);

#9
2:31, 29 июня 2013

Причём в этой строке  ITexture *color=driver->addTexture("color",image); я написал слово "color", хотя там может быть написано любое слово (но не пустая строка).

IrrlichtФорум

Тема в архиве.