2 registered members (AndrewAMD, alibaba),
1,184
guests, and 3
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Spiegeln von Entities
#407712
09/18/12 11:59
09/18/12 11:59
|
Joined: Jan 2012
Posts: 18 Hessen, Germany
tiefland
OP
Newbie
|
OP
Newbie
Joined: Jan 2012
Posts: 18
Hessen, Germany
|
Hallo Leute!
Um auf einfache Wiese etwas mehr Vielfalt ins Spiel zu bringen, wollte ich einige meiner Figuren spiegeln. Ich habe scale_x=-1 versucht, aber da werden die Entities einfach nur flach (vermutlich wird der Wert auf den kleinstmöglichen festgelegt). Gibt es eine Möglichkeit?
Gamestudio Version: Extra 8.10
|
|
|
Re: Spiegeln von Entities
[Re: tiefland]
#409072
10/11/12 09:31
10/11/12 09:31
|
Joined: Jan 2012
Posts: 18 Hessen, Germany
tiefland
OP
Newbie
|
OP
Newbie
Joined: Jan 2012
Posts: 18
Hessen, Germany
|
Da offenbar keiner etwas weiß: gibt es eine Möglichkeit, so eine Frage an einen Entwickler weiterzuleiten?
Gamestudio Version: Extra 8.10
|
|
|
Re: Spiegeln von Entities
[Re: tiefland]
#409075
10/11/12 10:04
10/11/12 10:04
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Hi, wenn Du Deine Spielumgebung mit der A8 Extra spiegeln willst, musst du gewaltig Aufwand betreiben, da du keine Portale und Shader verwenden kannst. Auf welcher Fläche willst du denn spiegeln? Auf dem Boden oder an einer Wand?
Also normalerweise solltest Du mit scale_z = -1 um die XY Ebene spiegeln können und wenn Du auf eine Wand guckst, musst Du mit scale_y = -1 spiegeln. Es kann aber sein, dass das nicht 100%ig funktioniert, weil eventuell die Normalen der Polygone falsch rum sind. Dann müsstest Du die Entity mit ent_clone klonen und die Normalen aller Vertices mit ent_setvertex umdrehen. Das kann aber einen leichten overhead erzeugen, wenn viele Entities geklont wurden, die Du anzeigst.
Deshalb hat man früher, sofern ich mich recht erinnere, dafür dann eigene Modelle vorgehalten, die bereits "vorgespiegelt" sind und die Normalen umgedreht sind (kannst Du im MED einfach machen). Die musst Du dann nur noch gespiegelt mitbewegen und mitanimieren. Den Boden, bzw. die Wand musst Du dann halbtransparent machen.
Last edited by HeelX; 10/11/12 10:04.
|
|
|
Re: Spiegeln von Entities
[Re: MasterQ32]
#409079
10/11/12 10:25
10/11/12 10:25
|
Joined: Jan 2012
Posts: 18 Hessen, Germany
tiefland
OP
Newbie
|
OP
Newbie
Joined: Jan 2012
Posts: 18
Hessen, Germany
|
Genau, ich möchte nicht die Welt an sich spiegeln, sondern z.B. in der Figurenauswahl die Möglichkeit geben, neben einer Skalierung die Figuren auch spiegelverkehrt zu nutzen (wenn etwa ein Spieler lieber einen Linkshänder nehmen will). Ich weiß, dass ich das Modell im MED so bearbeiten kann, aber ich will eigentlich vermeiden, zwei Modelle zu haben, wo möglicherweise eins genügt.
Gamestudio Version: Extra 8.10
|
|
|
Re: Spiegeln von Entities
[Re: HeelX]
#409298
10/15/12 09:42
10/15/12 09:42
|
Joined: Jan 2012
Posts: 18 Hessen, Germany
tiefland
OP
Newbie
|
OP
Newbie
Joined: Jan 2012
Posts: 18
Hessen, Germany
|
Das funktioniert auch nicht, scale_y und scale_z machen die Figur wie scale_x nur flach. Ich werde wohl nicht um das doppelte Anfertigen meiner Modelle herumkommen. Trotzdem danke für die Antworten.
Gamestudio Version: Extra 8.10
|
|
|
Re: Spiegeln von Entities
[Re: Espér]
#409781
10/22/12 10:01
10/22/12 10:01
|
Joined: Jan 2012
Posts: 18 Hessen, Germany
tiefland
OP
Newbie
|
OP
Newbie
Joined: Jan 2012
Posts: 18
Hessen, Germany
|
Ich komme nicht mit ent_getvertex bzw. ent_setvertex klar. Wie genau funktioniert das CONTACT-Struct?
Gamestudio Version: Extra 8.10
|
|
|
Re: Spiegeln von Entities
[Re: tiefland]
#409784
10/22/12 10:39
10/22/12 10:39
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Also, erst rufst du für einen Vertex ent_getvertex auf, ist ja klar, also wie im Beispiel z.B. mit
CONTACT* contact = ent_getvertex(my, NULL, 123);
für den Vertex mit der Nummer 123 aus dem my-Modell. Das struct ist in atypes.h aufgeführt, wird aber auch in Teilen in der Manual abgedruckt. Hier das ganze Struct:
typedef struct CONTACT {
D3DVERTEX *v; // contact position in entity coordinates
var x,y,z; // contact point in world coordinates
var nx,ny,nz; // contact normal in world coordinates
var u1,v1; // hit position on lightmap
var u2,v2;
var vertex; // closest vertex number
var triangle; // triangle number
var chunk; // mesh number
void* model; // internal mesh info
var light;
var alpha;
var blue,green,red; // lightmap values at hit position
long flags; // hit flags
ENTITY* entity; // hit entity, or NULL for level geometry
BMAP *skin1,*skin2,*skin3,*skin4; // hit textures
char* texname; // hit texture name
var subset; // mesh group
} CONTACT;
Die Kommentare geben ja schon sehr viel Auskunft darüber, was da drin gespeichert ist. Interessant für dich ist jetzt das v-Feld. Im v-Feld ist ein D3DVERTEX*-Pointer gespeichert, indem die relativen Daten (Position, Normale, usw.) vom ausgewählten Vertex drin stehen. Wenn du in dem Feld die Werte veränderst und das dann wieder mit ent_setvertex benutzt, aktualisierst du das Mesh! D3DVERTEX ist auch ein struct und ebenfalls in der atypes.h wie folgt definiert:
typedef struct {
float x,y,z; // position in DirectX coordinates
float nx,ny,nz; // normal
float u1,v1; // first coordinate set, for textures
float u2,v2; // second coordinate set, for shadow maps
float x3,y3,z3,w3; // third coordinate set, for tangent vector and handedness
float tu4,tv4; // 4th coordinate set, for additional data
} D3DVERTEX;
Du musst jetzt also theoretisch den z-Wert kippen. Da aber in DirectX die Y/Z-Achsen vertauscht sind, musst du das mit der Y-Koordinate machen, also z.B. so: Wenn du das mit allen Vertices machst, spiegelst du das Mesh gegen die (Acknex) XY-Ebene. Dann sind aber alle Normalen falsch rum, deshalb musst du die umdrehen. Die Normale eines Vertex steht in n = (nx, ny, nz) des D3DVERTEX structs. Du kannst einfach den Vector mit -1 skalieren, dann ist die Normale umgedreht. Das geht dann z.B. so:
VECTOR n;
vec_set(&n, vector(contact->v->nx, contact->v->ny, contact->v->nz));
vec_scale(&n, -1);
contact->v->nx = n.x;
contact->v->ny = n.y;
contact->v->nz = n.z;
Dann musst du nur noch mit ent_setvertex das (modifizierte) Contact-Struct in den Vertex des Meshes übertragen. Wenn du z.B. ein Modell namens "enemy.mdl" hast und das für eine Entity machst, dann wirst du merken, dass jetzt -alle- Entities, die von der Datei "enemy.mdl" geladen sind, gespiegelt sind. Das liegt daran, dass Gamestudio ressourcensparend ist und das Mesh für die Datei nur EINMAL lädt und nicht für jede Entity separat. Wenn du jetzt also im Spiel eine gespiegelte Entity haben willst, musst du die Meshdaten vorher kopieren, das geht mit ent_clone. Wenn du nur wenige Entities hast, würde ich dann einfach mit clone und der oben beschriebenen Prozedur arbeiten. Wenn du allerdings unbeschränkt viele Entities so benutzt, dann wäre es am schlausten dir irgendwo einen Zeiger auf eine gespiegelte Entity zu merken und dann das mesh für neue Entities wieder zu benutzen. Allerdings habe ich das noch nicht gemacht und weiß nicht genau ob das so geht, aber ich denke, dass du dir dann mit ent_buffers das gespiegelte Mesh holen kannst und für die neue Entity setzen kannst. Dann hast du immer zwei Meshes im Speicher, einmal das "normale" und einmal das "gespiegelte". Das wäre dann am ressourcensparendsten.
Last edited by HeelX; 10/22/12 10:41.
|
|
|
|