Coffee: Winkel mischen

rown

Mitglied
Hallo nochmal alle zusammen,

kennt jemand die Lösung in Coffee die Winkel zweier Objekte wie in einem Constraint-Tag zu mischen? Bei der Position ist es mit pos_neu=(pos_1*0,5)+(pos_2*0,5); verhältnismäßig einfach. Aber bei Winkeln fällt mir keine Lösung ein. Wie im Beispiel zu sehen reicht es ja nicht die einzelnen Gradzahlen im pos-Stil zu bearbeiten. Ansonsten habe ich versucht die V3-Werte und die V2-Werte im pos-Stil zu vermengen und daraus, wie zu sehen, einen neuen Winkel zu machen. Das kommt der Sache schon näher, ist aber es aber auch nicht.

Wenn es jemand weiß... hier ist jemand, der sich freuen würde es auch zu wissen.

vielen Dank schonmal
Rown
 

Anhänge

  • Winkel_mischen.jpg
    Winkel_mischen.jpg
    288,3 KB · Aufrufe: 16
Was ist denn der unterschied zwischen Position und Rotation in diesem Fall ? Beides sind Vektoren und du kannst dads arithmetische Mittel, wie oben von dir gezeigt, errechnen.

Bsp:
Code:
var rot1 = op->GetRotation();
var rot2 = op->GetNext()->GetRotation();
var rot3 = rot1 * 0.5 + rot2 + 0.5;
op->SetRotation(rot3);

Auch wenn die Winkel in Cinema in Radians gespeichert werden ändert das nichts an den Gesetzen der Mathematik. ;)

PS: Dein Anhang sagt mir jetzt nicht so viel ^^
 
Zuletzt bearbeitet:
Hola nux,

ja das hatte ich auch, allerdings wöllte ich das Ganze gerne global und nicht lokal haben. Das Problem ist bei globalen Rotaionen aber, dass der Radians von 0 bis 2pi geht und dann wieder bei 0 beginnt. Wenn ich also einen Winkel 0grad habe und einen bei sagen wir -0.1grad, dann liegt der neue Winkel nach der Formel bei um die 180grad.

PS: Der Anhang tut mir Leid... war eine fixe Idee und dann wollte mein Hirn nicht mehr. Ansonsten geht es dabei um eine Lösung über Aim-Vector, Up-Vector und Kreuzprodukt. Ich hoffe aber, dass der Ansatz viel viel viel zu kompliziert ist.

Grüße
Rown
 
So...
Code:
GetGlobalRot(obj)
	{
	var gl_x,gl_y,gl_z,k_x,k_y,k_z;
	var mg, hpb, rot;

	mg=obj->GetMg();
	hpb=mg->GetHPB();
	rot=obj->GetRotation();
	k_x=int(abs(rot.x/(2*pi)));
	k_y=int(abs(rot.y/(2*pi)));
	k_z=int(abs(rot.z/(2*pi)));

	if (rot.x<0){gl_x=(-1)*(((k_x+1)*(2*pi))-hpb.x);}else{gl_x=hpb.x+(k_x*(2*pi));}
	if (rot.y<0){gl_y=(-1)*(((k_y+1)*(2*pi))-hpb.y);}else{gl_y=hpb.y+(k_y*(2*pi));}
	if (rot.z<0){gl_z=(-1)*(((k_z+1)*(2*pi))-hpb.z);}else{gl_z=hpb.z+(k_z*(2*pi));}

	return vector(gl_x,gl_y,gl_z);
	}

GetMixHPB(obj_a,prz_a,obj_b,prz_b)
	{
	return (GetGlobalRot(obj_a)*(prz_a/(prz_a+prz_b)))+(GetGlobalRot(obj_b)*(prz_b/(prz_a+prz_b)));
	}

main()
{
	var yel_mg=yellow->GetMg();
	yel_mg->SetRotHPB(GetMixHPB(red,0.1,green,0.9));    //red und green sind Objekte
	yellow->SetMg(yel_mg);
}
...das klappt soweit. Habe eingebaut, dass er in beide Richtungen weiterzählt. Problem macht nun noch das Achsenspringen manchmal, zum Beispiel von 0,0,0 auf 360,0,0 usw. Muss ich mir nochmal anschauen. Vieleicht weiß ja jemand was...

Grüße
Rown

edit: habs gerade nochmal in verdrehten Nullobjekten getestet...klappt doch nicht. :[
 
Zuletzt bearbeitet:
So hier meine bislang sauberste Lösung...
Code:
aim_mg (V0, aim, up)
	{
	var new_mg=new(Matrix);	
	new_mg->SetV0(V0);
	new_mg->SetV1(vnorm(vcross(aim-V0,V0-up)));
	new_mg->SetV2(vnorm(vcross(aim-V0,vcross(aim-V0,V0-up))));
	new_mg->SetV3(vnorm(aim-V0));
	return new_mg;
	}

GetV0(value)
	{
	var V0;
	if (instanceof(value,BaseObject)){V0=value->GetMg()->GetV0();}
	if (instanceof(value,Matrix)){V0=value->GetV0();}
	if (instanceof(value,BaseObject)==False&&instanceof(value,Matrix)==False){V0=value;}
	if (value==Null){V0=vector(0,0,0);}
	return V0;
	}

GetV1(value)
	{
	var V1;
	if (instanceof(value,BaseObject)){V1=value->GetMg()->GetV1();}
	if (instanceof(value,Matrix)){V1=value->GetV1();}
	if (instanceof(value,BaseObject)==False&&instanceof(value,Matrix)==False){V1=value;}
	if (value==Null){V1=vector(0,0,0);}
	return V1;
	}

GetV2(value)
	{
	var V2;
	if (instanceof(value,BaseObject)){V2=value->GetMg()->GetV2();}
	if (instanceof(value,Matrix)){V2=value->GetV2();}
	if (instanceof(value,BaseObject)==False&&instanceof(value,Matrix)==False){V2=value;}
	if (value==Null){V2=vector(0,0,0);}
	return V2;
	}

GetV3(value)
	{
	var V3;
	if (instanceof(value,BaseObject)){V3=value->GetMg()->GetV3();}
	if (instanceof(value,Matrix)){V3=value->GetV3();}
	if (instanceof(value,BaseObject)==False&&instanceof(value,Matrix)==False){V3=value;}
	if (value==Null){V3=vector(0,0,0);}
	return V3;
	}
	
constraint(P_a,a,P_b,b,P_c,c,A_d,d,A_e,e,A_f,f)
	{
	var kp=a+b+c;
	var ka=d+e+f;
	var V0=(GetV0(P_a)*a/kp)+(GetV0(P_b)*b/kp)+(GetV0(P_c)*c/kp);
	var aim=((GetV3(A_d)*d/ka)+(GetV3(A_e)*e/ka)+(GetV3(A_f)*f/ka))+V0;
	var up=((GetV2(A_d)*d/ka)+(GetV2(A_e)*e/ka)+(GetV2(A_f)*f/ka))+V0;
	return aim_mg(V0,aim,up);
	}

main(doc,op)
{
var red=doc->FindObject("red");
var green=doc->FindObject("green");
op->SetMg(constraint(red,5,green,5,null,null,red,0,green,5,null,null));
}
P_a, P_b, P_c --> Objekte, Matrizen oder Vectoren, die die Position global Beeinflussen;
a, b, c --> Positions-Wichtungen;
A_d, A_e, A_f --> Objekte oder Matrizen, die die Rotation global Beeinflussen;
d, e, f --> Rotations-Wichtungen;
Man kann nun die Objekt in unterschiedliche Objekte unterordnen und es ****t. Bei Winkel um 180Grad gibts Flips, das ist aber nach meiner Beobachtung beim Constraint-Tag auch so.

Also dann...
Rown

Siehe auch http://www.tutorials.de/cinema-4d/376921-coffee-achse-auf-ziel-ausrichten.html
 
Zuletzt bearbeitet:
Zurück