ArcGIS Maps SDK for Unity 1.0版本(二)坐标转换等

1 unity 坐标 转HPTransform(直角坐标系) 
  HPTransform坐标        反转               ARCGIS 矩阵                齐次变换                  unity坐标
var worldPosition = math.inverse(arcGISMapComponent.WorldMatrix).HomogeneousTransformPoint(hit.point.ToDouble3());

经纬度转unity 坐标

ArcGISMapComponent arcGISMapComponent =GetComponentInParent<ArcGISMapComponent>();

  public Vector3 ArcgisToposition(double Vx, double Vy)
    {
        var cc= arcGISMapComponent.View.GeographicToWorld(new ArcGISPoint(Vx, Vy, 850));
        var worldPosition =(arcGISMapComponent.WorldMatrix).HomogeneousTransformPoint(cc);
        return  new Vector3((float)worldPosition.x, (float)worldPosition.y, (float)worldPosition.z);
    }

2 经纬度   HPTransform(直角坐标系)
ArcGISPoint与double3转换
        经纬度                                                    HPTransform
var geoPosition = arcGISMapComponent.View.WorldToGeographic(worldPosition);
        HPTransform                                             经纬度
var             = arcGISMapComponent.View.GeographicToWorld

3 HPTransform(直角坐标系)得到double3
hpTransform.UniversePosition

4 经纬度获取高程 https://open-elevation.com/ 先用着

---------------------------------------------------------------------------------------------------

1矩阵与Quaternion 互转

Matrix4x4.Rotate(Quaternion) 得到矩阵   插件中没找到Quaterniond转double4x4 

double4x4 .ToQuaterniond()  

2相机朝向某方向   (感觉还有问题)

p1 目标点   p2 相机点

 public Quaternion Camera_LookPosition(ArcGISPoint p1, ArcGISPoint p2)
    {
        ArcGISPoint p3 = new ArcGISPoint(p1.X, p1.Y, p1.Z);
        double3 difference = arcGISMapComponent.View.GeographicToWorld(p3) - arcGISMapComponent.View.GeographicToWorld(p2);
        Vector3 dirB = new Vector3((float)difference.x, (float)difference.y, (float)difference.z);

         //float3 HPTransformUp = -hpTransform.Forward;

        return Quaternion.LookRotation(dirB, HPTransformUp);//HPTransformUp向上的方向向量

        //注 unity 坐标 HP坐标 AcrGISLocation 坐标 各不相同 各个轴也不是一一对应 

        //float angle = Vector3.Angle(dirA, dirB) * (Vector3.Dot(dirA, dirB) < 0 ? -1 : 1);
        //Vector3 CrossV3 = Vector3.Cross(dirA, dirB);
        //return Quaternion.AngleAxis(angle, CrossV3) * Rotation;//算不出来
    }

------------------------------------------------------------------------------------------

旋转解析

 //相机绕点旋转  ------------高度问题
        void MyRotateAround(ref double3 cartesianPosition, ref quaternion cartesianRotation, double3 center, double3 axis, double angle, int a)
        {
            //Quaternion rot = Quaternion.AngleAxis(angle, axis);
            double3 dir = cartesianPosition - center; //计算从圆心指向摄像头的朝向向量
            if (a == 0)
            {
                //dir= TRS(new double3(0,0,0),)
                // dir向量 绕axis轴 旋转 angle角度   
                dir = My_Rotate(axis, -angle).HomogeneousTransformPoint(dir);
                cartesianPosition = center + dir;
                cartesianRotation = My_Rotate(axis, -angle).ToQuaterniond().ToQuaternion() * cartesianRotation;//区别 前后位置乘的原因                
            }
            else
            {
                dir = My_Rotate(axis, angle).HomogeneousTransformPoint(dir);
                cartesianPosition = center + dir;
                //为保证相机的x轴与地面平行 或 ArcgisRotion 的roll为0  
                var right = Matrix4x4.Rotate(cartesianRotation).GetColumn(0);
                //问题:Matrix4x4.Rotate(hpTransform.UniverseRotation).GetColumn(0);与hpTransform.Right 的使用结果不同

                //Vector3 ceshilinshi = new Vector3((float)axis.x, (float)axis.y, (float)axis.z );
                //1  var rotationX = Quaternion.AngleAxis(-(float)angle, ceshilinshi); //失败  原因:axis的来源不准  由float3 来的本身就不准 多次后偏差拉大

                var rotationX = Quaternion.AngleAxis(-(float)angle, right);            
                cartesianRotation = rotationX * cartesianRotation;

                //var right = Matrix4x4.Rotate(cartesianRotation).GetColumn(0);
                //double3 linshiuge = new double3(right.x, right.y, right.z);
                //var linshi = My_Rotate(linshiuge, angle).ToQuaterniond().ToQuaternion();              
                //cartesianRotation = linshi * cartesianRotation;//两者都一样
            }
        }

0 1 分别是绕旋转点up轴旋转 绕自身right轴旋转

感觉没必要分 但实际结果 绕自身right轴旋转会逐渐产生偏差 根源是传入的right轴不准确

结果:
Matrix4x4.Rotate(hpTransform.UniverseRotation).GetColumn(0);

与hpTransform.Right 

的使用结果不同   

猜你喜欢

转载自blog.csdn.net/WantFK/article/details/127507763