Всем привет! создал SceneNode через addSphereSceneNode() , а как ему назначить цвет найти ни как не могу.
Привет. Советую внимательно изучить стандартные примеры идущие в комплекте, тем более их можно найти на русском в интернет.
Что касается вопроса: не знаю как насчет задать цвет самому "ноду", но на него можно натянуть текстуру определенного цвета
Делается это так:
1. Создаешь картинку размером 128х128 например в любом графическом редакторе(Paint и др.)
2. В своей программе пишешь:
ISceneNode* node = addSphereSceneNode();
node->setMaterialTexture(0, driver->getTexture("../../media/red.jpg")); // файл созданной текстуры, например красного цвета
Текстуру тоже можно создать динамически:
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
Чтобы задать цвет самому ноду нужно поменять цвет материала, который по умолчанию белый. Материал можно задать создав объект типа SMaterial, задать цвет через его поля, а потом применить этот материал к ноду.
Всем большое спасибо, буду пробовать.
>Материал можно задать создав объект типа SMaterial, задать цвет через его поля, а потом применить этот материал к ноду.
пример кода есть?
Теоретически должно работать это:
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 цвет материала тоже не меняется. Хотя в свойствах цвет можно менять.
да мне тоже первой пришла что и твоя мысль, но по факту оказалось...
фишка вся в том, что возвращает метод getMaterial()
а он возвращает копию материала SMaterial & а не ссылку на него SMaterial *
и метода setMaterial чтобы запихнуть материал обратно - нет
потому и попросил пример кода
>Теоретически должно работать это:
>node->getMaterial(0).DiffuseColor.set(255,255,0,0); //красный
должно, если не учитывать особенность которую я упомянул сейчас
Я нашёл такой способ, вроде работает:
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);
Причём в этой строке ITexture *color=driver->addTexture("color",image); я написал слово "color", хотя там может быть написано любое слово (но не пустая строка).
Тема в архиве.