Hi Vektoria Coder,
in der Klasse CMaterial gibt es verschiedene Methoden, mit denen man die Texturfarben ändern kann, z.B. Scale, Translate, Rotate, TranslateDelta, …
Diejenige, die du brauchst, dürfte folgende sein:
Translate(CColor( “hier die RGB-Werte, jeweils zwischen 0 und 1 hereinschreiben” ));
Damit lässt sich ein Farbwert auf das aktuelle Material addieren, bzw. subtrahieren.
Nehmen wir als Beispiel ein Material m_zm, welches einer grünliche diffuse Blatttextur enthält.
Wenn wir dieses grünliche Blatt im Oktober herbstlich-gelb verfärben wollen, so addieren wir dazu Rot:
m_zm.Translate(CColor(1.0f,0.0f,0.0f));
… und schon ist unser Blatt gelb.
Wir könnten natürlich auch unser Blatt für die Novembertage bräunlich verfärben, dann müssten wir auch etwas Grün subtrahieren, und das addierte Rot etwas niedriger halten, also, circa:
m_zm.Translate(CColor(0.5f,-0.5f,-0.0f));
Alternativ könnten wir auch direkt den Farbwert verändern, mit der Methode RotateHue, dies würde in diesem Falle auch eine realistische Verfärbung ergeben. Um ein Blatt von Grün nach Rot zu verfärben, müssen wir die Farbe im Farbkreis der additiven Farbmischung 60° mathematisch negativ rotieren, also:
m_zm.RotateHue(-TWOPI/6.0f); // Macht Grün zu Gelb
Wir können das grüne Blatt auch zu einem roten Blatt mutieren lassen, indem wir 120° drehen:
m_zm.RotateHue(-TWOPI/3.0f); // Macht Grün zu Rot
… oder zu einem orangenem Blatt durch eine Drehung um -90°
m_zm.RotateHue(-HALFPI); // Macht Grün zu Orange
Falls wir das Blatt braun verfärben wollen, müssten wir dann mit Scale noch Helligkeit herausnehmen. Damit die vorherige Farbrotation nicht gelöscht wird, verwenden wir ScaleDelta:
m_zm.RotateHue(-HALFPI); // Macht Grün zu Orange
m_zm.ScaleDelta(0.5f); // und danach Orange zu Braun
Um eine langsame Verfärbung zu erreichen, brauchen wir einen Parameter fr, dessen Wert über fTime in der Tick-Routine langsam von 0.0f bis 1.0f wandert. Wollen wir z.B. ein Blatt langsam von Grün über Gelb, Orange nach Rot verfärben, so geht das so:
void Tick(float fTime, float fTimeDelta)
{
...
´ float fr = 1.0f;
if(fTime<1000.0f)
fr = fTime/1000.0f; // In den ersten 1000 Sekunden läuft der Wert von fr von 0 nach 1
m_zm.RotateHue(-fr * TWOPI/3.0f); // Das Blatt verfärbt sich langsam von Grün nach Rot
...
}
Hoffe, das hilft erst einmal weiter.
Tobi
in der Klasse CMaterial gibt es verschiedene Methoden, mit denen man die Texturfarben ändern kann, z.B. Scale, Translate, Rotate, TranslateDelta, …
Diejenige, die du brauchst, dürfte folgende sein:
Translate(CColor( “hier die RGB-Werte, jeweils zwischen 0 und 1 hereinschreiben” ));
Damit lässt sich ein Farbwert auf das aktuelle Material addieren, bzw. subtrahieren.
Nehmen wir als Beispiel ein Material m_zm, welches einer grünliche diffuse Blatttextur enthält.
Wenn wir dieses grünliche Blatt im Oktober herbstlich-gelb verfärben wollen, so addieren wir dazu Rot:
m_zm.Translate(CColor(1.0f,0.0f,0.0f));
… und schon ist unser Blatt gelb.
Wir könnten natürlich auch unser Blatt für die Novembertage bräunlich verfärben, dann müssten wir auch etwas Grün subtrahieren, und das addierte Rot etwas niedriger halten, also, circa:
m_zm.Translate(CColor(0.5f,-0.5f,-0.0f));
Alternativ könnten wir auch direkt den Farbwert verändern, mit der Methode RotateHue, dies würde in diesem Falle auch eine realistische Verfärbung ergeben. Um ein Blatt von Grün nach Rot zu verfärben, müssen wir die Farbe im Farbkreis der additiven Farbmischung 60° mathematisch negativ rotieren, also:
m_zm.RotateHue(-TWOPI/6.0f); // Macht Grün zu Gelb
Wir können das grüne Blatt auch zu einem roten Blatt mutieren lassen, indem wir 120° drehen:
m_zm.RotateHue(-TWOPI/3.0f); // Macht Grün zu Rot
… oder zu einem orangenem Blatt durch eine Drehung um -90°
m_zm.RotateHue(-HALFPI); // Macht Grün zu Orange
Falls wir das Blatt braun verfärben wollen, müssten wir dann mit Scale noch Helligkeit herausnehmen. Damit die vorherige Farbrotation nicht gelöscht wird, verwenden wir ScaleDelta:
m_zm.RotateHue(-HALFPI); // Macht Grün zu Orange
m_zm.ScaleDelta(0.5f); // und danach Orange zu Braun
Um eine langsame Verfärbung zu erreichen, brauchen wir einen Parameter fr, dessen Wert über fTime in der Tick-Routine langsam von 0.0f bis 1.0f wandert. Wollen wir z.B. ein Blatt langsam von Grün über Gelb, Orange nach Rot verfärben, so geht das so:
void Tick(float fTime, float fTimeDelta)
{
...
´ float fr = 1.0f;
if(fTime<1000.0f)
fr = fTime/1000.0f; // In den ersten 1000 Sekunden läuft der Wert von fr von 0 nach 1
m_zm.RotateHue(-fr * TWOPI/3.0f); // Das Blatt verfärbt sich langsam von Grün nach Rot
...
}
Hoffe, das hilft erst einmal weiter.
Tobi