[Android,OpenGL,Java] Quaternion to Euler




광고 한번만 클릭 부탁드립니다^^
위에 냐옹이 말구~ 위에 배너요~^_^/ 


포스팅을 보시는 분들을 위해 노력 하는 블로거를 위하여! 부탁드립니다. 재미 삼아 포스팅을 정리하지만, 광고를 달아보았습니다. 얼마나 열심히 할 수 있을지...의문이지만요^^ 

Subject [Android,OpenGL,Java] Quaternion to Euler

최종수정일 : 2012.04.16

안녕하세요~^^

  Quaternion 을 Euler 로 변환하는 코드 입니다. 

by 퓨림노

글을 작성하겠습니다.

Reference URL 

http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm


위의 주소를 참조하시면 됩니다만!

코드를 수정할 때 Quaternion 이 normalized 되어 있다면, 위에 방식으로, 아니면 아래 방식으로 사용함.


01. normalized

public vector3f Quat2Angle(float x, float y, float z, float w) {

		double pitch, roll, yaw;

		double test = x * y + z * w;
		if (test > 0.499) { // singularity at north pole
			yaw = 2 * Math.atan2(x, w);
			pitch = Math.PI / 2;
			roll = 0;

			vector3f euler = new vector3f((float) pitch, (float) roll,
					(float) yaw);
			return euler;
		}
		if (test < -0.499) { // singularity at south pole
			yaw = -2 * Math.atan2(x, w);
			pitch = -Math.PI / 2;
			roll = 0;
			vector3f euler = new vector3f((float) pitch, (float) roll,
					(float) yaw);
			return euler;
		}
		double sqx = x * x;
		double sqy = y * y;
		double sqz = z * z;
		yaw = Math.atan2(2 * y * w - 2 * x * z, 1 - 2 * sqy - 2 * sqz);
		pitch = Math.asin(2 * test);
		roll = Math.atan2(2 * x * w - 2 * y * z, 1 - 2 * sqx - 2 * sqz);

		vector3f euler = new vector3f((float) pitch, (float) roll, (float) yaw);
		return euler;

	}

gg

01. non-normalized

	public vector3f Quat2Angle(float x, float y, float z, float w) {

		double pitch, roll, yaw;
		double sqw = w * w;
		double sqx = x * x;
		double sqy = y * y;
		double sqz = z * z;
		double unit = (sqx * sqy) + (sqz * sqw);
		double test = (x * y) + (z * w);

		// singularity at north pole
		if (test > 0.499 * unit) {
			pitch = 0.0;
			roll = 2.0 * Math.atan2(x, w);
			yaw = Math.PI / 2;
			vector3f euler = new vector3f((float) pitch, (float) roll, (float) yaw);
			return euler;
		}

		// singularity at south pole
		if (test < -0.499 * unit) {

			pitch = 0.0;
			roll = -2.0 * Math.atan2(x, w);
			yaw = Math.PI / 2;

			vector3f euler = new vector3f((float) pitch, (float) roll,(float) yaw);
			return euler;
		}

		// attitude = pitch (X Axis of OSG)
		// heading = roll (Y Axis of OSG)
		// bank = yaw (Z Axis of OSG)
		pitch = Math.atan2((2.0 * x * w) - (2.0 * y * z), -sqx + sqy - sqz + sqw);
		roll = Math.atan2((2.0 * y * w) - (2.0 * x * z), sqx - sqy - sqz + sqw);
		yaw = Math.asin(2.0 * test / unit);

		vector3f euler = new vector3f((float) pitch, (float) roll, (float) yaw);
		return euler;
	}*/


코드를 따라서 작성해보고, 위의 URL 에서 계산해서 검증할 수 있다. 

확인을 꼭 해보도록 하자. 

그리고 인터넷 소스는 항상 신뢰하지 말자. (수식을 보고 확인을 하고 넘어가도록 하자. )



다 읽었으면 배너 클릭! (뭐 못보면 할 수 없고...)


댓글

Designed by JB FACTORY