最近入手一个项目,需要将在unity内摆放好的3D模型用H5表现出来,过程为:
用户在unity项目内将一个场景拼装好,unity内记录用户所用的3D模型,以及个模型的位置值、缩放值、旋转值,然后由H5端将场景还原,H5端用的是three.js(下面简称three)。
过程及其痛苦,这里就不赘述了,遇到的主要问题就是:
1.在three相机位置与unity相机位置一致的情况下,表现为three中x坐标与unity中x是反的,比如说unity传过来的坐标是(1,1,1),那么在three中将模型位置设置为(1,1,1)的话,模型的表现是与unity中的模型为y轴镜像的,在three中位置必须设置为(-1,1,1)。
2.unity中旋转为四元数旋转,当然在three中也有四元数旋转,但是直接将旋转值赋值为unity中的四元数值的话,旋转就直接转飞了。
解决方案:
1.第一点比较好解决,在设置position值时将x取反就可以了:
object.position.set(unityPosition.x * -1, unityPosition.y * 1, unityPosition.z * 1);
2.第二点就比较复杂了,多方查探发现是坐标系差异导致的,unity为右手坐标系,three则为左手坐标系,要与unity中模型表现一样则需要转坐标系:
//右手坐标系转左手坐标系
let pq = new THREE.Quaternion(unityRotation.x * -1, unityRotation.y * 1, unityRotation.z * 1, unityRotation.w * -1);
let pv = new THREE.Euler();
pv.setFromQuaternion(pq);
pv.y += Math.PI; // Y is 180 degrees off
pv.z *= -1; // flip Z
object.rotation.copy(pv);
以上。