Entity umfärben nicht (einfach so) möglich?
Entity umfärben nicht (einfach so) möglich?
Hi Leute,
ich habe vor für einen 3D-Editor das markierte Mesh/Entity rot einzufärben. In den ganzen anderen Engines die ich schon durch habe, habe ich sowas mittels ColorEntity() oder ähnlichem realisieren können, in PB-Ogre scheint so etwas elementares und simples nicht möglich zu sein.
Ich hatte mir nach Studium der 3D-Klamotten im Handbuch gedacht, ich könnte so etwas erreichen indem ich mir mittels GetEntityMaterial() das Material auslese und es mit SetMaterialColor() umfärbe. Allerdings liefert GetEntityMaterial() eine MaterialID zurück, welche natürlich für SetMaterialColor() nicht verwendet werden kann. Ausserdem brächte dieser Weg das Problem mit sich, das zwei Entities, die sich ein Material teilen, beide umgefärbt würden. Das gleiche Problem würde auch auftreten, wenn ich beispielsweise einen zusätzlichen MaterialLayer mit einer roten Textur hinzufügen würde.
Wie würdet ihr so etwas in PB-Ogre umsetzen? Hat einer eine Idee?
Danke im voraus.
Marcus
ich habe vor für einen 3D-Editor das markierte Mesh/Entity rot einzufärben. In den ganzen anderen Engines die ich schon durch habe, habe ich sowas mittels ColorEntity() oder ähnlichem realisieren können, in PB-Ogre scheint so etwas elementares und simples nicht möglich zu sein.
Ich hatte mir nach Studium der 3D-Klamotten im Handbuch gedacht, ich könnte so etwas erreichen indem ich mir mittels GetEntityMaterial() das Material auslese und es mit SetMaterialColor() umfärbe. Allerdings liefert GetEntityMaterial() eine MaterialID zurück, welche natürlich für SetMaterialColor() nicht verwendet werden kann. Ausserdem brächte dieser Weg das Problem mit sich, das zwei Entities, die sich ein Material teilen, beide umgefärbt würden. Das gleiche Problem würde auch auftreten, wenn ich beispielsweise einen zusätzlichen MaterialLayer mit einer roten Textur hinzufügen würde.
Wie würdet ihr so etwas in PB-Ogre umsetzen? Hat einer eine Idee?
Danke im voraus.
Marcus
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Re: Entity umfärben nicht (einfach so) möglich?
Oh ja, da bin ich auch schon lange auf der Suche.
Ich würde mich der Frage gerne anschließen:
Toll wäre auch, wenn man den einzelnen Entitys einen Transparentwert (Alpha) zuordnen könnte, für einen Ausblendeffekt, ohne dass das Material der anderen Entitys verändert wird.
Ich würde mich der Frage gerne anschließen:
Toll wäre auch, wenn man den einzelnen Entitys einen Transparentwert (Alpha) zuordnen könnte, für einen Ausblendeffekt, ohne dass das Material der anderen Entitys verändert wird.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- Chimorin
- Beiträge: 451
- Registriert: 30.01.2013 16:11
- Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit
Re: Entity umfärben nicht (einfach so) möglich?
Ich habe da nicht viel weitergeforscht, aber ich werde es jetzt dann wieder brauchen (In mein Testspiel eingebaut, funktioniert einigermaßen).
Zuallererst erstellt ihr ein Material, welches sich Color.Material nennt (Einfach ne Textdatei umbenennen). Da kommt das rein:
Wenn jemand von euch genaueres über diesen Code weiß, ok, dann bitte teilen. Ich verstehe nur die Zeilen ambient, diffuse und specular, aber deth_write off macht die Sache durchsichtig 
Ins Programm kommt das dann so:
Und benutzt wird es so:
Was allerdings klar sein dürfte. Wie wäre es, wenn wir eine Erfahrungsteilung machen... Ich werde das demnächst weiterverwenden, ich wüsste aber gerne, ob man das Material einfach wieder auf non_material ändern kann 
Zuallererst erstellt ihr ein Material, welches sich Color.Material nennt (Einfach ne Textdatei umbenennen). Da kommt das rein:
Code: Alles auswählen
material Color/Red
{
technique
{
pass
{
ambient 0.05 0.05 0.05
diffuse 0.9 0.1 0.1
specular 1 1 1 20
depth_write off
shading phong
}
}
}

Ins Programm kommt das dann so:
Code: Alles auswählen
GetScriptMaterial(#rot_mat, "Color/Red")
Code: Alles auswählen
tempEnt = CreateEntity(#PB_Any, MeshID(Gebaeude()\meshNummer), MaterialID(#rot_mat))

Re: Entity umfärben nicht (einfach so) möglich?
Ich habe die Klamotte auf jeden Fall gerade nochmal im englischen Forum gepostet und dabei auch die Sache mit der Transparenzt mit erwähnt. Vielleicht hat Comtois oder jemand anderes ja eine Idee zur vernünftigen Umsetzung von sowas.
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
- Chimorin
- Beiträge: 451
- Registriert: 30.01.2013 16:11
- Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit
Re: Entity umfärben nicht (einfach so) möglich?
Auf jeden Fall wäre es nett, wenn du das Ergebnis dann hier reinstellen würdest.
Ich bin mir aber sicher, dass es die einfachste Lösung sein wird, das Ganze über die Materialien zu machen.
Ich bin mir aber sicher, dass es die einfachste Lösung sein wird, das Ganze über die Materialien zu machen.
Re: Entity umfärben nicht (einfach so) möglich?
Ich habe gerade noch mal das Ogre-Forum gewälzt und es ist in der Tat in Ogre technisch nicht möglich ein Entity umzufärben. Man geht dort auch den Weg über das Material. Das mehrere Entities das selbe Material verwenden muss also definitiv vermieden werden, es müssen also von diesem Material für alle Entities die es benutzen Klone erstellt werden. Die RAM-Belastung dadurch soll sich wohl eher in Grenzen halten. Bleibt also nur noch das Problem, daß der Rückgabewert von GetEntityMaterial() wertlos für eine Bearbeitung eines Materials ist. Vielleicht das das PB-Team daran in einer zukünftigen Version ja was drehen.
Hier ein Posting aus dem Ogre-Forum in dem über die Vorgehensweise gesprochen wird: http://www.ogre3d.org/forums/viewtopic.php?f=5&t=52641
Hier ein Posting aus dem Ogre-Forum in dem über die Vorgehensweise gesprochen wird: http://www.ogre3d.org/forums/viewtopic.php?f=5&t=52641
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: Entity umfärben nicht (einfach so) möglich?
Für dein geschildertes Problem legt man für gewöhnlich 2 Materials an, einen für den selektierten Zustand und einen für den nicht selektierten Zustand. Das ist auch richtig so, denn die Oberflächenbeschaffenheit sollte in einer gut strukturierten Umgebung von der Geometrie strikt getrennt sein!
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- Chimorin
- Beiträge: 451
- Registriert: 30.01.2013 16:11
- Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit
Re: Entity umfärben nicht (einfach so) möglich?
@Mightymac:
Ich verstehe dein Problem nicht. Du hast 2 Materialien, einmal deine Textur und das 2. ist das von mir oben beschriebene.
Mit GetEntityMaterial(#Entity) bekommst du dann raus, welches von beiden gerade drauf ist (Vorsicht: Rückgabewert ist die MaterialID!).
Bei deinem Editor muss man doch etwas auswählen, bevor es "rot" wird. Du überprüfst also, auf was gedrückt wurde und setzt dann bei diesem Entity mittels
das Material. Wird es deselected, was du doch auch zu überprüfen hast, bekommt das Entity mit genau dem selben Befehl seine ursprüngliche Farbe, wenn es ein anderes Material ist, dann mittels: #PB_Material_None als MaterialID.
Meine ehemalige Frage habe ich somit auch selber beantwortet. Und nein, man braucht nicht mehrere Entities auf einem Punkt um dies zu realisieren.
Gruß,
Banane
Ich verstehe dein Problem nicht. Du hast 2 Materialien, einmal deine Textur und das 2. ist das von mir oben beschriebene.
Mit GetEntityMaterial(#Entity) bekommst du dann raus, welches von beiden gerade drauf ist (Vorsicht: Rückgabewert ist die MaterialID!).
Bei deinem Editor muss man doch etwas auswählen, bevor es "rot" wird. Du überprüfst also, auf was gedrückt wurde und setzt dann bei diesem Entity mittels
Code: Alles auswählen
SetEntityMaterial(#Entity, MaterialID)
das Material. Wird es deselected, was du doch auch zu überprüfen hast, bekommt das Entity mit genau dem selben Befehl seine ursprüngliche Farbe, wenn es ein anderes Material ist, dann mittels: #PB_Material_None als MaterialID.
Meine ehemalige Frage habe ich somit auch selber beantwortet. Und nein, man braucht nicht mehrere Entities auf einem Punkt um dies zu realisieren.
Gruß,
Banane
Re: Entity umfärben nicht (einfach so) möglich?
Ich will es mal so sagen: Mein eigentliches Problem besteht in der Trennung zwischen Material und MaterialID in PureBasic. Wenn alle Materialbefehle (wie z.B. CopyMaterial() oder SetMaterialColor()) mit MaterialIDs arbeiten würden anstatt mit der Materialnummer könnte ich ganz einfach hingehen und das Material eines Entities auslesen, kopieren (um nicht andere Entities mit dem gleichen Material zu beeinflussen) und einfärben und dann anschließend auf das selektierte Entity draufzulegen. Das würde im übrigen in Ogre unter anderen Sprachen funktionieren, nur halt in PB nicht. Im Regelfall werde ich (oder die stäteren Benutzer des Programms) die Materialien der Szene in Materialscripts haben und auf diese Materialien hat man mit sämtlichen Materialbearbeitungsbefehlen keinen Zugriff, da diese ja keine Materialnummer haben, sondern man nur an die MaterialID kommt.
Es bringt mir nur begrenzt was, das Material des selektierten Entities durch eine rote Textur zu ersetzen. Ich hätte gern auch auf dem selektierten Entity noch die eigentliche Textur, da man manchmal die Position des Entities nach der Textur anpassen muss. Ein Beispiel: Ich habe ein Haus mit einer Ziegelsteintextur welches ich auf einer Plane platzieren möchte. Jedoch möchte ich nicht, das eine halbe Reihe der Ziegel im Boden verschwindet, soll heißen: ich würde gerne die horizontal verlaufende Fuge zwischen den Ziegeln auf der Plane platzieren. Das kann ich natürlich nicht machen wenn ich die Ziegelsteintextur des Hauses nicht mehr sehen kann, wenn anstatt dessen nur noch eine rote Textur draufliegt.
Ich denke mal ich werde jetzt für's erste die Boundingbox-Koordinaten des entsprechenden Entities auslesen und eine rote, transparente Box an diese Koordinaten setzen um das selektierte Entity zu kennzeichnen.
Es bringt mir nur begrenzt was, das Material des selektierten Entities durch eine rote Textur zu ersetzen. Ich hätte gern auch auf dem selektierten Entity noch die eigentliche Textur, da man manchmal die Position des Entities nach der Textur anpassen muss. Ein Beispiel: Ich habe ein Haus mit einer Ziegelsteintextur welches ich auf einer Plane platzieren möchte. Jedoch möchte ich nicht, das eine halbe Reihe der Ziegel im Boden verschwindet, soll heißen: ich würde gerne die horizontal verlaufende Fuge zwischen den Ziegeln auf der Plane platzieren. Das kann ich natürlich nicht machen wenn ich die Ziegelsteintextur des Hauses nicht mehr sehen kann, wenn anstatt dessen nur noch eine rote Textur draufliegt.
Ich denke mal ich werde jetzt für's erste die Boundingbox-Koordinaten des entsprechenden Entities auslesen und eine rote, transparente Box an diese Koordinaten setzen um das selektierte Entity zu kennzeichnen.
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Re: Entity umfärben nicht (einfach so) möglich?
Das Problem bei PB ist wohl der Drang, unbedingt bei allen Befehlen
das eigene Objektsystem zu nutzen. Sei's drum, was aber in deinem
Fall das Problem sein soll versteh ich nicht. Das Mapping der MaterialID
zu #PB-Material kannst du doch auch genau so gut selber machen.
Ob nun PB intern ne Mapping-Tabelle hat und so anstelle der MaterialID
tatsächlich die PB-Nummer zurück gibt, oder ob du das zusätzlich machen
musst ... sieht im Code bei dir natürlich nicht ganz so toll aus, aber
das Ergebnis sollte das gleiche sein.
Wenn du nicht weist was ich mit der Mapping-Tabelle meine, ist ganz
einfach. Jedes mal wenn ein Material erstellt wird, schreibst in eine
PB-Map die ID des Materials als Key und die Material-PB-Nummer als
Value rein. Da PB nur Strings als Keys akzeptiert muss notgedrunken
natürlich Str() benutzt werden. Wenn du nun mit ner GET-Funktion
ne MaterialID bekommen hast, kannst die Map nutzen um die
zugehörige Material-PB-Nummer zu bekommen.
MFG PMV
das eigene Objektsystem zu nutzen. Sei's drum, was aber in deinem
Fall das Problem sein soll versteh ich nicht. Das Mapping der MaterialID
zu #PB-Material kannst du doch auch genau so gut selber machen.

Ob nun PB intern ne Mapping-Tabelle hat und so anstelle der MaterialID
tatsächlich die PB-Nummer zurück gibt, oder ob du das zusätzlich machen
musst ... sieht im Code bei dir natürlich nicht ganz so toll aus, aber
das Ergebnis sollte das gleiche sein.

Wenn du nicht weist was ich mit der Mapping-Tabelle meine, ist ganz
einfach. Jedes mal wenn ein Material erstellt wird, schreibst in eine
PB-Map die ID des Materials als Key und die Material-PB-Nummer als
Value rein. Da PB nur Strings als Keys akzeptiert muss notgedrunken
natürlich Str() benutzt werden. Wenn du nun mit ner GET-Funktion
ne MaterialID bekommen hast, kannst die Map nutzen um die
zugehörige Material-PB-Nummer zu bekommen.
MFG PMV