-
zCVob_trafoObjToWorld ändern
Ich möchte an der Position des Helden ein Vob platzieren, wobei die Position etwas vor dem Helden sein sollte und da Vobs auch nicht in der Luft hängen sollen, müsste auch die Höhenposition veränderbar sein.
Wie kann man mit Ikarus möglichst einfach die Position ändern?
Code:
var oCNpc her;
var zCVob mein_vob;
var int heldposx;
var int heldposy;
var int heldposz;
MEM_InitGlobalInst();
her = Hlp_GetNpc (PC_Hero);
mein_vob = MEM_PtrToInst(MEM_SearchVobByName("MEINVOB"));
heldposx = her._zCVob_trafoObjToWorld[3];
heldposy = her._zCVob_trafoObjToWorld[7];
heldposz = her._zCVob_trafoObjToWorld[11];
mein_vob.trafoObjToWorld[zCVob_trafoObjToWorld_X] = heldposx;
mein_vob.trafoObjToWorld[zCVob_trafoObjToWorld_Y] = heldposy;
mein_vob.trafoObjToWorld[zCVob_trafoObjToWorld_Z] = heldposz;
Das Vob erscheint nun direkt im Held und sollte eben versetzt werden. Vom Ansatz her den Vector mit einem float multiplizieren und updaten? (mulf?)
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
-
 Zitat von Zaphod Beeblebrox
Ich möchte an der Position des Helden ein Vob platzieren, wobei die Position etwas vor dem Helden sein sollte und da Vobs auch nicht in der Luft hängen sollen, müsste auch die Höhenposition veränderbar sein.
Damit das VOB nicht in der Luft schwebt, kann du mit "TraceRay" arbeiten. (Siehe Sektenspinners Irrwichtel - Source)
Damit kannst du die genau am Boden ausrichten.
Das Vob erscheint nun direkt im Held und sollte eben versetzt werden. Vom Ansatz her den Vector mit einem float multiplizieren und updaten? (mulf?)
Ja z.b so:
Code:
meinVob.trafoObjToWorld[7] = addf(heldposy, mkf(100));
Bzw. musst/solltest du nach dem verschieben die Position des VOBs updaten, da es sonst flakert, und fokusname evt. an der falschen Position ist.
Dazu gibt es die Funktion
Code:
VobPositionUpdated();
DIe soltest du im Ikarus Thread finden.
mfg Umfi
-
 Zitat von Umfi
Damit das VOB nicht in der Luft schwebt, kann du mit "TraceRay" arbeiten. (Siehe Sektenspinners Irrwichtel - Source)
Damit kannst du die genau am Boden ausrichten.
Ja z.b so:
Code:
meinVob.trafoObjToWorld[7] = addf(heldposy, mkf(100));
Bzw. musst/solltest du nach dem verschieben die Position des VOBs updaten, da es sonst flakert, und fokusname evt. an der falschen Position ist.
Dazu gibt es die Funktion
Code:
VobPositionUpdated();
DIe soltest du im Ikarus Thread finden.
mfg Umfi
also
Code:
mein_Vob.trafoObjToWorld[3] = addf(heldposx, mkf(200));
verschiebt das Vob schon mal , danke dafür 
Code:
VobPositionUpdated(MEM_InstToPtr(mein_Vob));
damit wird auch alles korrekt neu positioniert, incl Fokus und ohne flirren usw.
Was muss ich aber verändern, das das Vob seine z Pos verändert?
EDIT
 Zitat von Umfi
Damit das VOB nicht in der Luft schwebt, kann du mit "TraceRay" arbeiten. (Siehe Sektenspinners Irrwichtel - Source)
Damit kannst du die genau am Boden ausrichten.
Damit also das Vob zum Boden ausrichten, das werde ich mal versuchen.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Geändert von Zaphod Beeblebrox (10.06.2012 um 18:18 Uhr)
-
Also mit dem TraceRay komme ich nicht klar, das übersteigt meine Kenntnisse.
Eine direkte Vectorveränderung würde in dem Fall ausreichen, auch wenn das Vob im Boden steckt...
heldposx,heldposy,heldposz ist ja genau die Mitte des Helden, der ist 180 cm groß.
Es würde mir auch schon reichen, wenn ich das Vob irgendwie in der Höhe verändern könnte da es wie gesagt egal ist wenn es im Boden steckt. Es sollte auch noch um 360 Grad gedreht werden da imo die Rückseite angezeigt wird.
EDIT
man sollte sich eben auch die float.d mal ansehen bevor man solche dummen Fragen stellt 
Code:
mein_Vob.trafoObjToWorld[7] = subf(heldposy, mkf(100));
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Geändert von Zaphod Beeblebrox (10.06.2012 um 19:01 Uhr)
-
Also dass um 360° drehen kannst du dir sparen, das ist redundant Um 180° drehen hingegen macht mehr Sinn bei deiner Beschreibung, ist aber auch komplizierter...
Ich habe mal dieses Script aus den Weiten meiner Festplatte hervorgekramt (von Gottfried):
Code:
/******************************************
Trafo Hilfsfunktionen
\******************************************
Vorraussetzungen:
- Ikarus-Skriptpaket von Sektenspinner
- Floatpaket von Sektenspinner
Folgende Funktionen werden zur Verf�gung gestellt:
== "Set"-Funktionen ==
void TRF_Move(zCVob obj, (f)int dx, (f)int dy, (f)int dz)
Verschiebt das Objekt um dx, dy, dz
void TRF_MoveTo(zCVob obj, (f)int x, (f)int y, (f)int z)
Verschiebt das Objekt zum Punkt x, y, z
void TRF_SetRot(zCVob obj, int x, int y, int z)
Dreht das Objekt nach x, y, z � nach dem Winkelma�
NOTIZ: Alle diese Funktionen besitzen jeweils noch ein Abbild f�r X, Y und Z einzelnd. Die Entsprechende Achse muss nur an den Funktionsnamen geh�ngt werden. (TRF_MoveToX zB.)
WARNUNG: Bei der Rotation um eine Spezifische Achse werden die beiden Anderen zur�ckgesetzt!
== "Get"-Funktionen ==
(f)int TRF_Deg2Rad(int angle)
Umwandlung vom Winkelma� zum Bogenma�.
int TRF_Rad2Deg(int angle)
Umwandlung vom Bogenma� zum Winkelma�.
(f)int TRF_Sin(int angle)
Sinus des Winkels "angle". (Gradma�)
(f)int TRF_Cos(int angle)
Cosinus des Winkels "angle". (Gradma�)
(f)int TRF_SinR(int angle)
Sinus des Winkels "angle". (Bogenma�)
(f)int TRF_CosR(int angle)
Cosinus des Winkels "angle". (Bogenma�)
int TRF_Arc(int sin, int cos)
Arkus-Sinus und Arkus-Kosinus. Ich empfehle immer beide Werte anzugeben, da zB. sin(89) und sin(91) �bereinstimmen.
Sollte ein Wert fehlen, bitte mit der Konstante TRF_NOANGLE angeben. (Bsp.: TRF_Arc(TRF_Sin(50), TRF_NOANGLE))
R�ckgabewert ist � nach dem Winkelma�
(f)int TRF_ArcSin(int sin)
Im Gegensatz zu der vorherigen Funktion wird hier kein Vergleich benutzt sondern die Taylorreihe.
(Funktioniert noch nicht ordnungsgem��, also lieber obere Funktion benutzen)
R�ckgabewert ist im Bogenma�
(f)int TRF_GetDist(zCVob obj1, zCVob obj2)
Die Distanz zweier Objekte. Hierbei wird im Gegensatz zu Npc_GetDistToNpc die H�he mit einbezogen.
(f)int TRF_GetDistXY((f)int x0, (f)int y0, (f)int x1, (f)int y1)
Die Distanz zweier Punkte.
(f)int TRF_GetDistXYZ((f)int x0, (f)int y0, (f)int z0, (f)int x1, (f)int y1, (f)int z1)
Dis Distanz zweier Punkte.
int TRF_GetAngle(zCVob obj1, zCVob, obj2)
Der Winkel zweier Objekte auf der X und Z-Achse zueinander.
R�ckgabewert ist � nach dem Winkelma�.
int TRF_GetAngleXY((f)int x0, (f)int y0, (f)int x1, (f)int y1)
Der Winkel zweier Punkte zueinander. R�ckgabewert ist � nach dem Winkelma�.
\******************************************/
/* = NICHT BER�HREN! = */
var int TRFInit;
const int TRF_NOANGLE = 1073741824;
/* = = = = = = = = = = */
const int TRF_ArcLoop = 20; //Wie oft die Arc-Reihe Wiederholen?
//------------------------MOVETO---------------------------
func void TRF_MoveTo(var zCVob obj, var int x, var int y, var int z) {
obj.trafoObjToWorld[ 3] = x;
obj.trafoObjToWorld[ 7] = y;
obj.trafoObjToWorld[11] = z;
};
func void TRF_MoveToX(var zCVob obj, var int x) {
obj.trafoObjToWorld[ 3] = x;
};
func void TRF_MoveToY(var zCVob obj, var int y) {
obj.trafoObjToWorld[ 3] = y;
};
func void TRF_MoveToZ(var zCVob obj, var int z) {
obj.trafoObjToWorld[ 3] = z;
};
//-------------------------MOVE----------------------------
func void TRF_Move(var zCVob obj, var int dx, var int dy, var int dz) {
obj.trafoObjToWorld[ 3] = addf(obj.trafoObjToWorld[ 3], dx);
obj.trafoObjToWorld[ 7] = addf(obj.trafoObjToWorld[ 7], dy);
obj.trafoObjToWorld[11] = addf(obj.trafoObjToWorld[11], dz);
};
func void TRF_MoveX(var zCVob obj, var int dx) {
obj.trafoObjToWorld[ 3] = addf(obj.trafoObjToWorld[ 3], dx);
};
func void TRF_MoveY(var zCVob obj, var int dy) {
obj.trafoObjToWorld[ 7] = addf(obj.trafoObjToWorld[ 7], dy);
};
func void TRF_MoveZ(var zCVob obj, var int dz) {
obj.trafoObjToWorld[11] = addf(obj.trafoObjToWorld[11], dz);
};
//--------------------RAD und DEG--------------------------
const int TRFINT_Rad2Deg = 1113927393; //57.29578
func int TRF_Deg2Rad(var int x) {
return divf(mkf(x), TRFINT_Rad2Deg);
};
func int TRF_Rad2Deg(var int x) {
return roundf(mulf(x, TRFINT_Rad2Deg));
};
const int TRFINT_Adr_Sin = 8599080; //0x833628
func int TRFINT_SIN(var int x) {
x = mulf(x, 1148848204); //* 1000.13
x = addf(x, 1162107260); //+ 1000*PI
x = roundf(x);
var int ptr; ptr = MEM_StackPos.position;
if(x<0) {
x+=6284;
MEM_StackPos.position = ptr;
};
x = x%6284;
return MEM_ReadInt(TRFINT_Adr_Sin+(4*x));
};
func int TRF_Sin(var int offs) {
return TRFINT_SIN(TRF_Deg2Rad(offs));
};
func int TRF_Cos(var int offs) {
return TRFINT_SIN(TRF_Deg2Rad(offs+90));
};
func int TRF_SinR(var int offs) {
return TRFINT_SIN(offs);
};
func int TRF_CosR(var int offs) {
return TRFINT_SIN(offs+90);
};
//-----------------------SETROT----------------------------
const int zCVob__RotateWorldX = 6404096; //61B800
const int zCVob__RotateWorldY = 6404144; //61B830
const int zCVob__RotateWorldZ = 6404192; //61B860
const int zCVob__ResetRotationsWorld = 6406144; //61C000
func void TRF_RotateX(var zCVob obj, var int x) {
CALL_FloatParam(x);
CALL__thiscall(MEM_InstToPtr(obj), zCVob__RotateWorldX);
};
func void TRF_RotateY(var zCVob obj, var int x) {
CALL_FloatParam(x);
CALL__thiscall(MEM_InstToPtr(obj), zCVob__RotateWorldY);
};
func void TRF_RotateZ(var zCVob obj, var int x) {
CALL_FloatParam(x);
CALL__thiscall(MEM_InstToPtr(obj), zCVob__RotateWorldZ);
};
func void TRF_Rotate(var zCVob obj, var int x, var int y, var int z) {
TRF_RotateX(obj, x);
TRF_RotateY(obj, y);
TRF_RotateZ(obj, z);
};
func void TRF_ResetRotation(var zCVob obj) {
CALL__thiscall(MEM_InstToPtr(obj), zCVob__ResetRotationsWorld);
};
func void TRF_SetRotX(var zCVob obj, var int x) {
TRF_ResetRotation(obj);
TRF_RotateX(obj, x);
};
func void TRF_SetRotY(var zCVob obj, var int x) {
TRF_ResetRotation(obj);
TRF_RotateY(obj, x);
};
func void TRF_SetRotZ(var zCVob obj, var int x) {
TRF_ResetRotation(obj);
TRF_RotateZ(obj, x);
};
func void TRF_SetRot(var zCVob obj, var int x, var int y, var int z) {
TRF_ResetRotation(obj);
TRF_RotateX(obj, x);
TRF_RotateY(obj, y);
TRF_RotateZ(obj, z);
};
func void TRF_SetRotYXZ(var zCVob obj, var int x, var int y, var int z) {
TRF_ResetRotation(obj);
TRF_RotateY(obj, y);
TRF_RotateX(obj, x);
TRF_RotateZ(obj, z);
};
//-----------------------GETDIST---------------------------
func int TRF_GetDistXY(var int x0, var int y0, var int x1, var int y1) {
var int a; var int b; var int c;
a = subf(x0, x1);
b = subf(y0, y1);
c = addf(mulf(a,a), mulf(b,b));
return sqrtf(c);
};
func int TRF_GetDistXYZ(var int x0, var int y0, var int z0, var int x1, var int y1, var int z1) {
var int c; var int d; var int e;
c = TRF_GetDistXY(x0, y0, x1, y1);
d = subf(z0, z1);
e = addf(mulf(c,c), mulf(d,d));
return sqrtf(e);
};
func int TRF_GetDist(var zCVob obj, var zCVob obj2) {
return TRF_GetDistXYZ(obj.trafoObjToWorld[3], obj.trafoObjToWorld[7], obj.trafoObjToWorld[11],
obj2.trafoObjToWorld[3],obj2.trafoObjToWorld[7],obj2.trafoObjToWorld[11]);
};
//-----------------------ARKUS-----------------------------
const int f1 = floateins;
func int TRF_Arc(var int sin, var int cos) {
var int i; var int imax;
var int j; var int jmax;
var int mem0; var int mem1;
mem0 = 0; mem1 = 0;
var int ptr;
var int lsin; var int csin;
if(sin > 0) {
i = 0;
imax = 90;
j = 90;
jmax = 180;
}
else {
i = 180;
imax = 270;
j = 270;
jmax = 360;
};
if(sin==TRF_NOANGLE) { i = 360; sin = 0; };
if(cos==TRF_NOANGLE) { j = 360; cos = 0; };
// Konstante Werte festhalten
if(gef(cos, f1)) { return 0; };
if(gef(sin, f1)) { return 90; };
if(lef(cos, negf(f1))) { return 180; };
if(lef(sin, negf(f1))) { return 270; };
lsin = 0;
ptr = MEM_StackPos.position;
if(i<imax) {
i += 1;
csin = TRF_Sin(i);
if (i<=90) { //Steigend
if(lf(lsin, sin)) {
if(gef(csin, sin)) {
mem0 = i;
i = imax;
};
};
}
else { //Fallend
if(gf(lsin, sin)) {
if(lef(csin, sin)) {
mem0 = i;
i = imax;
};
};
};
lsin = csin+0;
MEM_StackPos.position = ptr;
};
lsin = 0;
ptr = MEM_StackPos.position;
if(j<jmax) {
j += 1;
csin = TRF_Cos(j);
if(j<=180) {
if(gf(lsin, cos)) {
if(lef(csin, cos)) {
mem1 = j;
j = jmax;
};
};
}
else {
if(lf(lsin, cos)) {
if(gef(csin, cos)) {
mem1 = j;
j = jmax;
};
};
};
lsin = csin+0;
MEM_StackPos.position = ptr;
};
if(!mem1) {
return mem0;
};
return mem1;
};
func int TRF_ArcSin(var int sin) {
var int Esin; Esin = sin;
var int z0; var int res;
var int n0; var int n1;
var int v0; var int v1;
res = sin; Esin = mulf(mulf(sin, sin), sin);
z0 = 1; n0 = 2; n1 = 3;
var int i; i = 0;
var int pos; pos = MEM_StackPos.position;
if(i < TRF_ArcLoop) {
i += 1;
// Ich wei� nicht, ob es schneller geht wenn man mit
// floats rechnet oder mit integern und daf�r immer
// umwandelt.. Ich hab mich f�r letztere Methode
// entschieden.
v0 = divf(mkf(z0), mkf(n0));
v1 = divf(Esin, mkf(n1));
res = addf(res, mulf(v0, v1));
z0 *= z0+2;
n0 *= n0+2;
n1 += 2;
Esin = mulf(mulf(Esin, sin), sin);
pos = MEM_StackPos.position;
};
return res;
};
//----------------------GETANGLE---------------------------
func int TRF_GetAngleXY(var int x0, var int y0, var int x1, var int y1) {
var int a; var int b; var int c;
a = subf(x0, x1);
b = subf(y0, y1);
c = addf(mulf(a,a), mulf(b,b));
c = sqrtf(c);
var int sinA; var int cosA;
sinA = divf(a,c);
cosA = divf(b,c);
return TRF_Arc(sinA, cosA);
};
func int TRF_GetAngle(var zCVob obj, var zCVob obj2) {
return TRF_GetAngleXY(obj.trafoObjToWorld[3], obj.trafoObjToWorld[11], obj2.trafoObjToWorld[3], obj2.trafoObjToWorld[11]);
};
Damit sollte es gehen, es werden gleichzeitig auch schöne Funktionen für das Verschieben angeboten. Du musst VobPositionUpdated() trotzdem danach aufrufen.
-
Also die TRF_Move(var zCVob obj, var int dx, var int dy, var int dz) funktioniert so nicht.
wenn ich sie so ergänze geht es
Code:
//-------------------------MOVE----------------------------
func void TRF_Move(var zCVob obj, var int dx, var int dy, var int dz) {
obj.trafoObjToWorld[ 3] = addf(obj.trafoObjToWorld[ 3], mkf(dx));
obj.trafoObjToWorld[ 7] = addf(obj.trafoObjToWorld[ 7], mkf(dy));
obj.trafoObjToWorld[11] = addf(obj.trafoObjToWorld[11], mkf(dz));
};
was wiederum nichts anderes ist als das
Code:
mein_Vob.trafoObjToWorld[7] = subf(heldposy, mkf(100));
Die vob drehungs func werde ich mal versuchen.
Danke für das Script Paket da sind viele nützliche Scripte vorhanden.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
-
Die originale Funktion erwartet, dass die Parameter bereits Floats sind.
-
 Zitat von Milky-Way
Die originale Funktion erwartet, dass die Parameter bereits Floats sind.
So siehts aus.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
-
Also irgendwie passiert bei mir garnichts bei den Rotationsfunktionen. Ruf ich die falsch auf?
TRF_SetRotX(Haus, 180); oder TRF_SetRotX (Haus, mkf (180));
Bei beiden Versionen verändert sich ncihts. (Ja, VobPositionUpdated() wird danach aufgerufen.)
-
Wie initialisierst du 'Haus'? Im Prinzip wäre mkf(180) korrekt und so habe ich es früher auch benutzt - mit Erfolg.
MfG Gottfried
-
 Zitat von Gottfried
Wie initialisierst du 'Haus'? Im Prinzip wäre mkf(180) korrekt und so habe ich es früher auch benutzt - mit Erfolg.
MfG Gottfried
Hier mal der Codeteil:
Code:
if (...) {
var int vobPtr; vobPtr = MEM_SearchVobByName("SURVIVAL_HOUSE_00");
var zCVob Haus; Haus = MEM_PtrToInst (vobPtr);
VobSetVisual(vobPtr, "shelter.3DS");
TRF_SetRotX (Haus, mkf (180));
VobPositionUpdated(vobPtr);
SURVIVAL_HOUSE_00_BUILD = TRUE;
};
EDIT:
Code:
func void VobSetVisual(var int vobPtr, var string str) {
const int zCVob__SetVisual = 6301312; //602680
CALL_zStringPtrParam(str);
CALL__thiscall(vobPtr, zCVob__SetVisual);
};
Geändert von Umfi (12.05.2016 um 15:39 Uhr)
Grund: VobSetVisual ergänzt
-
Wie genau hast du SURVIVAL_HOUSE_00 im Spacer gesetzt? Funktionieren denn die anderen Funktionen wie zB. Move?
MfG Gottfried
-
 Zitat von Gottfried
Wie genau hast du SURVIVAL_HOUSE_00 im Spacer gesetzt? Funktionieren denn die anderen Funktionen wie zB. Move?
MfG Gottfried
Ja die Funktion wie MoveTo() usw. funktionieren.
Das Vob hab ich nicht im Spacer gesetzt sondern durch Skripte.
Code:
if (...) {
var int housePtr; housePtr = MEM_InsertVob("shelter_cs.3DS", "BUILD_HOUSE_HERE");
var zCVob Haus; Haus = MEM_PtrToInst (housePtr);
MEM_RenameVob (housePtr, "SURVIVAL_HOUSE_00");
...
};
-
Vielleicht liegt es daran. Hast du auch mal probiert ein im Spacer gesetztes Vob zu rotieren?
(Tut mir leid dass ich hier selbst nichts testen kann, habe gerade kein Gothic zur Hand..)
MfG Gottfried
-
 Zitat von Gottfried
Vielleicht liegt es daran. Hast du auch mal probiert ein im Spacer gesetztes Vob zu rotieren?
(Tut mir leid dass ich hier selbst nichts testen kann, habe gerade kein Gothic zur Hand..)
MfG Gottfried
Okay, hab es jetzt im Spacer auch probiert (Kollision ein). Hat nicht funktioniert.
Dann hab ich es nochmal ohne Kollision versucht, dann hat es funktionier.
Wird dann wohl an der Kollision gelegen haben, ich werds gleich mal aus den Skripten heraus testen.
EDIT: Jap, lag an der Kollison. Hier mal die Änderung, sollte es jemanden interessieren...
Code:
if (...) {
var int vobPtr; vobPtr = MEM_SearchVobByName("SURVIVAL_HOUSE_00");
var zCVob vob; vob = MEM_PtrToInst (vobPtr);
vob.bitfield[0] = vob.bitfield[0] & ~ zCVob_bitfield0_collDetectionDynamic;
vob.bitfield[0] = vob.bitfield[0] & ~ zCVob_bitfield0_collDetectionStatic;
VobSetVisual(vobPtr, "shelter.3DS");
TRF_SetRotY (vob, mkf (180));
VobPositionUpdated(vobPtr);
vob.bitfield[0] = vob.bitfield[0] | zCVob_bitfield0_collDetectionDynamic;
vob.bitfield[0] = vob.bitfield[0] | zCVob_bitfield0_collDetectionStatic;
SURVIVAL_HOUSE_00_BUILD = TRUE;
};
Geändert von Umfi (15.06.2012 um 21:19 Uhr)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|