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
的使用结果不同