PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » RGB цвет для 3D объекта


RGB цвет для 3D объекта

Сообщений 1 страница 3 из 3

1

Возможно ли при создании 3D объекта задать ему произвольный RGB цвет, не используя при этом реальную текстуру, а в дальнейшем ещё и управлять цветом объекта программно?
На данном этапе я располагаю только специальным скриптом для OGRE движка, который позволяет окрашивать объекты в четыре цвета: Blue, Green, Red, Yellow.
Приведу тестовый код создания четырёх сфер раскрашенных этими цветами.
Для работы программки, рядом с файлом кода должна быть папка Data\Script\... со скриптами, файл Color.material отвечает именно за Blue, Green, Red, Yellow.
Все файлы я прилагаю к этому примеру.

Код:
If  InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse()
  
  If (Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem))=0
    MessageRequester("Error","Путь 3D-ресурсов не найден")
  EndIf
  
  Parse3DScripts()
  
Else
  MessageRequester("Error","Инициализация 3D-среды неудалась")
  End
EndIf

OpenScreen(1920, 1080, 32, ""); поставите своё разрешение экрана

;---Camera-------
Cam_0=CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(Cam_0,100,100,100,#PB_Absolute)
CameraLookAt(Cam_0, 0, 0, 0)

;-Light
LightMain=CreateLight(#PB_Any, RGB(255, 255, 255), 560, 900, 500)

;- ScriptMaterials
Blue=GetScriptMaterial(#PB_Any, "Color/Blue")
Green=GetScriptMaterial(#PB_Any, "Color/Green")
Red=GetScriptMaterial(#PB_Any, "Color/Red")
Yellow=GetScriptMaterial(#PB_Any, "Color/Yellow")

;- Meshes
SphereR=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Red), 0, 0, 0)
SphereG=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Green), 0, 40, 0)
SphereB=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Blue), 40, 0, 0)
SphereY=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Yellow), 0, 0, 40)

Repeat 
  RenderWorld()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)   ; press Esc to quit
    End
  EndIf
  FlipBuffers() 
ForEver

Возможно, кому это покажется интересным, сможет понять как самому задавать свой произвольный цвет.
Скрипты

0

2

Это непосредственно то, что находится в файле Color.material, к которому обращается мой пример.

Код:
material Color/Blue
{
    technique
    {
        pass
        {
            ambient 0.1 0.1 0.1
            diffuse 0.1 0.1 0.9
            specular 0.7 0.7 0.7 64
            shading phong
        }
    }
}

material Color/Red
{
    technique
    {
        pass
        {
            ambient 0.05 0.05 0.05
            diffuse 0.9 0.1 0.1
            specular 1 1 1 20         
            shading phong
        }             
    }
}

material Color/Yellow
{
    technique
    {
        pass
        {
            ambient 0.05 0.05 0.05
            diffuse 1.0 1.0 0.0
            specular 1 1 1 20         
            shading phong
        }             
    }
}

material Color/Green
{
    technique
    {
        pass
        {
            ambient 0.05 0.05 0.05
            diffuse 0.1 0.9 0.1
            specular 1 1 1 20         
            shading phong
        }             
    }
}

Могу предположить, что если добавить свою секцию вида

material Color/XXX
{
    technique
    {
        pass
        {
            ambient 0.05 0.05 0.05
            diffuse r g b
            specular 1 1 1 20         
            shading phong
        }             
    }
}

где Color/XXX название цвета который я хочу использовать на объекте,
diffuse r g b - это значение произвольного цвета, где значение каждого из трёх цветов RGB выражается в диапазоне от 0 до 1
Сейчас возьму это и проверю...

0

3

В итоге всё так и работает, теперь я смогу устанавливать любой цвет 3D объекта с помощью добавления блоков нужных мне цветов.
Например вот как покрасить сферу в розовый цвет

Добавляю в файл блок кода для розового цвета:

material Color/Pink
{
    technique
    {
        pass
        {
            ambient 0.05 0.05 0.05
            diffuse  0.9 0.1 0.9
            specular 1 1 1 20         
            shading phong
        }             
    }
}

а в программе добавляю строки:

Код:
If  InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse()
  
  If (Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem))=0
    MessageRequester("Error","Путь 3D-ресурсов не найден")
  EndIf
  
  Parse3DScripts()
  
Else
  MessageRequester("Error","Инициализация 3D-среды неудалась")
  End
EndIf

OpenScreen(1920, 1080, 32, "")

;---Camera-------
Cam_0=CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(Cam_0,100,100,100,#PB_Absolute)
CameraLookAt(Cam_0, 0, 0, 0)

;-Light
LightMain=CreateLight(#PB_Any, RGB(255, 255, 255), 560, 900, 500)

;- ScriptMaterials
Blue=GetScriptMaterial(#PB_Any, "Color/Blue")
Green=GetScriptMaterial(#PB_Any, "Color/Green")
Red=GetScriptMaterial(#PB_Any, "Color/Red")
Yellow=GetScriptMaterial(#PB_Any, "Color/Yellow")
Pink=GetScriptMaterial(#PB_Any, "Color/Pink");            беру значение розового цвета из скрипта

;- Meshes
SphereR=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Red), 0, 0, 0)
SphereG=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Green), 0, 40, 0)
SphereB=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Blue), 40, 0, 0)
SphereY=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Yellow), 0, 0, 40)
SphereP=CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any,10)), MaterialID(Pink), 0, 0, 15);      создаю объект розового цвета

Repeat 
  RenderWorld()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)   ; press Esc to quit
    End
  EndIf
  FlipBuffers() 
ForEver

И последнее, можно же и программно устроить так, что бы менять значения в файле скрипта.
Ну а если нужно в реальном времени изменять плавно цвет объекта, то операции перезаписи файла будут тормозить рендер. Нужно выяснить где и как эти переменные находятся в памяти, и как их достать, чтоб непосредственно менять их значения. Но для начала я и этому рад!

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » RGB цвет для 3D объекта