Gamestudio Links
Zorro Links
Newest Posts
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (AndrewAMD, alibaba), 1,184 guests, and 3 spiders.
Key: Admin, Global Mod, Mod
Newest Members
Hanky27, firatv, wandaluciaia, Mega_Rod, EternallyCurious
19051 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
Spiegeln von Entities #407712
09/18/12 11:59
09/18/12 11:59
Joined: Jan 2012
Posts: 18
Hessen, Germany
tiefland Offline OP
Newbie
tiefland  Offline 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 Offline OP
Newbie
tiefland  Offline 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
H
HeelX Offline
Senior Expert
HeelX  Offline
Senior Expert
H

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: HeelX] #409076
10/11/12 10:08
10/11/12 10:08
Joined: Nov 2007
Posts: 2,568
Germany, BW, Stuttgart
MasterQ32 Offline
Expert
MasterQ32  Offline
Expert

Joined: Nov 2007
Posts: 2,568
Germany, BW, Stuttgart
ich glaube es geht hier eher darum, das modell an sich zu spiegel, so dass man nicht immer das gleiche modell sieht. es geht hier gar nicht um einen spiegeleffekt

aber ich weiß da auch keinen rat (außer ein shader, aber das wäre ja wieder com+)


Visit my site: www.masterq32.de
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 Offline OP
Newbie
tiefland  Offline 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: tiefland] #409081
10/11/12 10:44
10/11/12 10:44
Joined: Jul 2001
Posts: 6,904
H
HeelX Offline
Senior Expert
HeelX  Offline
Senior Expert
H

Joined: Jul 2001
Posts: 6,904
Achso, ja dann verwende wie gesagt die scale-Parameter und klone bei Bedarf die Entity.

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 Offline OP
Newbie
tiefland  Offline 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: tiefland] #409301
10/15/12 10:01
10/15/12 10:01
Joined: Mar 2008
Posts: 2,247
Baden Württemberg, Germany
Espér Offline
Expert
Espér  Offline
Expert

Joined: Mar 2008
Posts: 2,247
Baden Württemberg, Germany
hmm.. wäre es ned en weg alle vertexe eines Models einfach relativ zum Model zu spiegeln, und dann die normalen umzudrehen?


Selling my Acknex Engine Editions (A7 Com & A8 Pro):
>> click here if you are interested <<
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 Offline OP
Newbie
tiefland  Offline 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
H
HeelX Offline
Senior Expert
HeelX  Offline
Senior Expert
H

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

Code:
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:

Code:
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:

Code:
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:

Code:
contact->v->y *= -1;



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:

Code:
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.
Page 1 of 2 1 2

Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1