c# - 围绕另一个点旋转 3D 对象 C#

标签 c# math matrix 3d augmented-reality

首先为粗略的绘图表示歉意,我绝不精通 3D 操作,对矩阵只有非常基本的了解,所以请尽可能清楚地解释所有内容,不要假设我的水平知识。

我目前正在收集经度和纬度数据,并使用以下函数将其转换为笛卡尔 X、Y 和 Z:

public CartesianXYZ LonLat2Cartesian(double lon, double lat)
{
    CartesianXYZ XYZ = new CartesianXYZ();
    var R = 6371000;
    XYZ.X = Convert.ToInt32(R * Math.Cos(lat) * Math.Cos(lon));
    XYZ.Y = Convert.ToInt32(R * Math.Sin(lat) * Math.Cos(lon));
    XYZ.Z = Convert.ToInt32(R * Math.Sin(lat));
    return XYZ;
}

在图表上绘制这些时,我发现 Y 轴变化非常大,即使这些点彼此非常接近,我认为这是因为我们坐在一个球体上,除非我是在北极,它会被认为是倾斜的,我离赤道越近。 (如果不是这种情况,请告诉我)

请看下面三个点绘制的 3D 散点图

enter image description here

A 点将被视为用户所在的“中心”点

B 点是用户正南的一个点

C 点是用户正北的一个点

我希望实现的是围绕点 A 旋转点 B 和 C,以便它们的 Y 值相同,我可以将图形视为点的二维表示,我发现只需将 Y 更改为相同我最终得到了一个相当扭曲的观点。

最终目标是使用用户的航向并找出是否有任何点在他们的视野内(用于增强现实)

我们将不胜感激任何帮助、有用的评论或指向有用文章的链接。

最佳答案

你得到了错误的等式(之前也没有发现它:))它应该是:

public CartesianXYZ LonLat2Cartesian(double lon, double lat)
    {
    CartesianXYZ XYZ = new CartesianXYZ();
    var R = 6371000;
    XYZ.X = Convert.ToInt32(R * Math.Cos(lat) * Math.Cos(lon));
    XYZ.Y = Convert.ToInt32(R * Math.Cos(lat) * Math.Sin(lon));
    XYZ.Z = Convert.ToInt32(R * Math.Sin(lat));
    return XYZ;
    }

顺便说一句,如果您需要更精确的结果,请使用 WGS84:

关于c# - 围绕另一个点旋转 3D 对象 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46118793/

相关文章:

c# - Xamarin 表格 : ScrollView with KeyBoard

c# - 按降序(按日期)排序列表的一部分,按升序(按字母顺序)排序另一部分?

algorithm - 如何以编程方式找到可以逼近另一个黑盒函数的函数?

php - 获取一个条目的多个日期之间的平均时间

python - 给定大小为 n 的矩阵,计算距中心的距离矩阵

c# - 在调用方法之前等待后台工作人员完成

c# - 如何从表中逐 block 获取数据?

c++ - 仅优化球线检查?

python - 使用 numpy 生成带状矩阵

在不使用 array.map() 的情况下添加任意数量的数组值的 Javascript 矩阵