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 

的使用结果不同   

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ArcGIS Maps SDK for Unity是一款由Esri开发的用于Unity游戏引擎的地图开发工具。该工具使游戏开发者可以在Unity中集成ArcGIS地图功能,从而为游戏增添地理信息系统 (GIS) 功能和可视化效果。 ArcGIS Maps SDK for Unity教程提供了详细的指导,帮助开发者了解如何在Unity中使用该工具。教程中的内容包括但不限于以下几个方面: 1. 安装和设置:教程会详细介绍安装ArcGIS Maps SDK for Unity的步骤,并向开发者展示如何进行必要的设置,以便开始使用地图功能。 2. 地图加载和显示:教程会演示如何在Unity中加载并显示地图数据。开发者将学会如何根据需求选择并加载不同的地图服务,以及如何设置地图的显示样式和缩放级别。 3. 空间查询与分析:教程会介绍如何利用ArcGIS Maps SDK中的功能进行空间查询和分析。开发者可以学习如何在地图上执行点选、范围查询等操作,并了解如何获取查询结果并进行进一步的处理。 4. 地图编辑功能:教程还会介绍如何使用ArcGIS Maps SDK中提供的地图编辑功能。开发者可以学习如何添加、删除和编辑地图要素,以及如何保存修改并与地图服务同步。 5. 地理位置感知和路线规划:教程中还会涵盖地理位置感知和路线规划的内容。开发者可以学习如何在游戏中利用ArcGIS地图数据进行位置感知和路径规划,从而实现更加真实和有趣的游戏体验。 通过学习ArcGIS Maps SDK for Unity教程,开发者可以掌握如何将GIS和地图功能融入到Unity游戏中,从而创造出更加丰富多样的游戏世界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屋檐上的大修勾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值