Моя цель — позволить пользователям загружать 3D-модели и размещать их с помощью веб-браузера. Для этого я использую BabylonJS, и он отлично работает. После этого я хочу, чтобы мои пользователи могли просматривать ту же модель в собственном приложении с тем же позиционированием, которое установлено с помощью веб-браузера. Фреймворк, который я использую для нативного приложения, — OpenSceneGraph (OSG). Моя проблема заключается в том, что я не могу заставить правильно работать вращение, чтобы OpenSceneGraph правильно отражал то, что происходит в BabylonJS.
Я использую углы Эйлера в BabylonJS, так как их легко понять пользователям веб-сайта (например, повернуть его на 90 градусов вокруг оси X, на 180 градусов вокруг оси Y и на 0 градусов вокруг Z; например, model.rotation = new BABYLON .Vec3(90,180,0)). Однако OSG использует функцию OpenGL glrotate(), для которой требуется ось вращения и угол поворота. Для этого я использую BabylonJS для создания кватерниона из углов Эйлера; а затем с помощью функции, которую я написал на основе примера Java на этой странице:
http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
function getAxisAngle(){
var q = BABYLON.Quaternion.RotationYawPitchRoll(m.rotation.y, m.rotation.x, m.rotation.z),s,r={};
/*Convert quaternion to axis+angle*/
if(q.w > 1){
q = q.normalise();
}
r.angle = BABYLON.Tools.ToDegrees(2 * Math.acos(q.w));
s = Math.sqrt(1-q.w*q.w);
if(s < 0.001){
r.ax = q.x;
r.ay = q.y;
r.az = q.z;
}else{
r.ax = q.x / s;
r.ay = q.y / s;
r.az = q.z / s;
}
return r;
}
Я понимаю, что фундаментальное различие между BJS и OSG заключается в том, что BJS — левосторонняя система координат; а OSG правша; поэтому я сделал OSG левосторонним, установив лицевую обмотку по часовой стрелке; и масштабирование оси z моих моделей на -1.
Он работает на базовом уровне, если я изолирую 1 ось за раз; например если я только вращаюсь вокруг оси Y; и не вращайте вокруг какой-либо другой оси - это выглядит нормально. Однако, если я попытаюсь объединить два или три угла Эйлера одновременно; Я не могу заставить его выглядеть так же в OSG.
Я читал, что углы Эйлера не рекомендуются; отчасти потому, что порядок, в котором вращение применяется к каждой оси, имеет значение. Это возможная причина?