IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> ArcGIS Maps SDK for Unity 1.0版本(二)坐标转换等 -> 正文阅读

[游戏开发]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 分别是绕旋转点x轴旋转 绕自身right轴旋转

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

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

与hpTransform.Right?

的使用结果不同? ?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:31:34  更:2022-10-31 12:31:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 6:11:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码