Ynt: 3D Projection - LocalToWorldMatrix

Başlatan barisertekin, 07 Ekim 2014, 19:28:37

barisertekin

Merhaba,



Translate : -3,75   0      0
Rotate     :  279    0      45
Scale       :  1.4     0.3   0.3

değerleri ile resimde sağda siyah kutu içindeki matrix elde ediliyor. Ben bu değerleri kullanarak yandaki matrix'i elde edemiyorum. Farklı sonuçlar çıkıyor. Yakın ama farklı. Bir yerde yanlış yapıyorum.

Unity üzerinde test yaptım. Aşağıda consola log yazdırdım. İlk matrix unity'nin kendi cube2.LocalToWorldMatrix'i. İkinci ise benim hesapladığım hatalı olan.


Yaptığım Hesaplamalar. Temelde;
Matrix4x4 m4_Result = m4_Translate * (m4_Rotation_X * m4_Rotation_Y * m4_Rotation_Z) * m4_Scaling;

GameObject Cube2 = GameObject.Find("Cube2");

		Matrix4x4 m4_Translate = new Matrix4x4 ();

		m4_Translate.SetRow (0,new Vector4(){x = 1 , y = 0, z = 0, w = Cube2.transform.localPosition.x});
		m4_Translate.SetRow (1,new Vector4(){x = 0 , y = 1, z = 0, w = Cube2.transform.localPosition.y});
		m4_Translate.SetRow (2,new Vector4(){x = 0 , y = 0, z = 1, w = Cube2.transform.localPosition.z});
		m4_Translate.SetRow (3,new Vector4(){x = 0 , y = 0, z = 0, w = 1});

		Matrix4x4 m4_Rotation_X = new Matrix4x4 ();
		Matrix4x4 m4_Rotation_Y = new Matrix4x4 ();
		Matrix4x4 m4_Rotation_Z = new Matrix4x4 ();

		m4_Rotation_X.SetRow (0,new Vector4(){x = 1 , y = 0, z = 0, w = 0});
		m4_Rotation_X.SetRow (1,new Vector4(){x = 0 , y = Mathf.Cos(Cube2.transform.localRotation.x), z = -Mathf.Sin(Cube2.transform.localRotation.x), w = 0});
		m4_Rotation_X.SetRow (2,new Vector4(){x = 0 , y = Mathf.Sin(Cube2.transform.localRotation.x), z = Mathf.Cos(Cube2.transform.localRotation.x), w = 0});
		m4_Rotation_X.SetRow (3,new Vector4(){x = 0 , y = 0, z = 0, w = 1});

		m4_Rotation_Y.SetRow (0,new Vector4(){x = Mathf.Cos(Cube2.transform.localRotation.y) , y = 0, z = Mathf.Sin(Cube2.transform.localRotation.y), w = 0});
		m4_Rotation_Y.SetRow (1,new Vector4(){x = 0 , y = 1, z = 0, w = 0});
		m4_Rotation_Y.SetRow (2,new Vector4(){x = -Mathf.Sin(Cube2.transform.localRotation.y) , y = 0, z = Mathf.Cos(Cube2.transform.localRotation.y), w = 0});
		m4_Rotation_Y.SetRow (3,new Vector4(){x = 0 , y = 0, z = 0, w = 1});

		m4_Rotation_Z.SetRow (0,new Vector4(){x = Mathf.Cos(Cube2.transform.localRotation.z) , y = -Mathf.Sin(Cube2.transform.localRotation.z), z = 0, w = 0});
		m4_Rotation_Z.SetRow (1,new Vector4(){x = Mathf.Sin(Cube2.transform.localRotation.z) , y = Mathf.Cos(Cube2.transform.localRotation.z), z = 0, w = 0});
		m4_Rotation_Z.SetRow (2,new Vector4(){x = 0 , y = 0, z = 1, w = 0});
		m4_Rotation_Z.SetRow (3,new Vector4(){x = 0 , y = 0, z = 0, w = 1});

		Matrix4x4 m4_Scaling = new Matrix4x4 ();

		m4_Scaling.SetRow (0,new Vector4(){x = Cube2.transform.localScale.x, y = 0, z = 0, w = 0});
		m4_Scaling.SetRow (1,new Vector4(){x = 0, y = Cube2.transform.localScale.y, z = 0, w = 0});
		m4_Scaling.SetRow (2,new Vector4(){x = 0, y = 0, z = Cube2.transform.localScale.z, w = 0});
		m4_Scaling.SetRow (3,new Vector4(){x = 0, y = 0, z = 0, w = 1});

		Matrix4x4 m4_Result = ((m4_Translate * (m4_Rotation_X * m4_Rotation_Y * m4_Rotation_Z)) * m4_Scaling);

		Debug.Log ("Unity localToWorldMatrix : \n" + Cube2.transform.localToWorldMatrix + "\n\nMy localToWorldMatrix : \n" + m4_Result);


Teşekkürler.

mesaj birleştirme:: 07 Ekim 2014, 21:06:36

Vay arkadaş, bir şeye odaklanınca en basit şeyi göremez hale geliyoruz. Çıkıp bir hava almak gerekiyormuş. Çözdüm.

"Cube2.transform.localRotation.x" özelliklerde belirttiğim gibi 249 vermiyormuş.
"Cube2.transform.eulerAngles.x" şekline kullanmak gerekiyormuş.

Birde cos fonksiyonu derece değil radyan istiyormuş. 279 değil (279 * pi / 180)

Yine takılırsam gelirim :)