我有太阳的方位角,仰角和方向矢量。我想在太阳光线方向上放置一个距离的视点。任何人都可以描述或提供资源链接,以帮助我理解和实施所需的步骤吗?
我用笛卡尔坐标系从方位角和仰角找到方向向量,然后用于查找 viewport origin.image for this question
x = distance
y = distance* tan azimuth
z = distance * tan elevation.
我想找到距离值...怎么样?
答案 0 :(得分:0)
方位角坐标系参考NEH(几何东北高(上))参考框架!!!
在您的图片链接中,它引用了-Y
轴,这是不正确的,除非你没有渲染世界,而是做一些非线性图形投影,这是哪一个?
顺便说一下ECEF/WGS84 and NEH您可以了解如何计算 WGS84 的 NEH
正如我可以看到你在坐标之间计算不好所以只是为了清楚这是它的样子:
左侧的
是全局地球视图,其位置(其原点)计算一个 NEH 。中间是表面对齐的侧视图,右侧是表面对齐的俯视图。蓝色洋红色绿色是输入方位坐标,布朗是x,y,z
笛卡尔投影(坐标位于其轴上)所以:
Dist'= Dist *cos(Elev );
z = Dist *sin(Elev );
x = Dist'*cos(Azimut);
y =-Dist'*sin(Azimut);
如果使用不同的参考系或轴方向,则相应地更改它......
我怀疑你使用4x4同质变换矩阵
用于表示坐标系,也用于保存视口,所以请看:
构建视口
您需要X,Y,Z
轴向量和O
原点位置。 O
你已经拥有(至少你认为)和Z
轴是射线方向所以你也应该拥有它。现在只计算X,Y
作为对齐的东西(否则视图将围绕光线旋转)我使用NEH这样:
view.Z=Ray.Dir // ray direction
view.Y=NEH.Z // NEH up vector
view.X=view.Y x view.Z // cross product make view.X axis perpendicular to Y ansd Z
view.Y=view.Z x view.X // just to make all three axises perpendicular to each other
view.O=ground position - (distance*Ray.Dir);
要使其成为有效的view_port,您必须:
view = inverse(view)*projection_matrix;
如果您想要整件事
然后你还要在这种情况下添加太阳/地球位置计算:
距离
现在很明显你背后的东西只需要设置距离如果你想把它设置为太阳那么它将是distance=1.0 AU;
(天文单位),但这是一个很大的距离,如果你有透视你的地球将非常小而不是使用更近的距离来匹配您的视图大小: