unigine geopivot 经纬度 空间座标 三维平铺座标

unigine中的geopivot 作用是进行 经纬度与空间座标系之间的换算 以及 经纬度到三维平铺座标之间的换算

(先理解区分下 经纬度 三维空间座标 三维平铺座标 这三个的概念:首先在unigine中如果没有geopivot节点,那么就只有一个三维空间座标的概念。如果加入geopivot节点并且将其他节点放置到这个geopivot节点下,(如果其他的物体比较大,比如使用一个globalwater,在很远的地方看会发现,将globalwater节点从非geopivot子节点变成geopivot子节点globalwater会变弯曲。原理是变换成子节点的时候在globalwater的vertexshader中传入了一个矩阵和一个GEO相关的宏。让顶点位置有所变换。)那么那些节点就会有三个座标。一个是未成为geopivot子节点的时的空间座标,这个座标我称作三维平铺座标,对应api中的flat(可以理解为这个是一个虚拟的座标,只是在某些特殊情况下会用到这个座标,比如从地形上获取对应点所在的地形块数);一个是经纬度座标,对应api中的geodetic;一个是当前真实三维空间座标,对应api中的Ellipsolid。)

 

将一个节点放到geopivot下,其座标会被修改,即从flat变换到geodetic 座标和反过来的转换。其对应的函数如下。

virtual Math::dmat4 mapMeshFlatToEllipsoid(Ptr<Mesh> &mesh, const Math::dmat4 &flat_transform) = 0;
    virtual Math::mat4 mapMeshFlatToEllipsoid(Ptr<Mesh> &mesh, const Math::mat4 &flat_transform) = 0;
    virtual Math::dmat4 mapMeshEllipsoidToFlat(Ptr<Mesh> &mesh, const Math::dmat4 &ellipsoid_transform) = 0;
    virtual Math::mat4 mapMeshEllipsoidToFlat(Ptr<Mesh> &mesh, const Math::mat4 &ellipsoid_transform) = 0;
    virtual Math::dvec3 mapFlatToGeodetic(const Math::dvec3 &flat_point) = 0;
    virtual Math::dvec3 mapFlatToGeodetic(const Math::vec3 &flat_point) = 0;
    virtual void mapFlatsToGeodetic(const double * src_x, const double * src_y, int size, double * ret_lat, double * ret_lon) const = 0;
    virtual Math::dvec3 mapGeodeticToFlat(const Math::dvec3 &geodetic_coords) = 0;
    virtual void mapGeodeticsToFlat(const double * lat, const double * lon, int size, double * ret_x, double * ret_y) const = 0;
    virtual void mapFlatToEllipsoid(const Math::dvec3 &flat_point, Math::dvec3 &ret_ellipsoid_point, Math::dvec3 &ret_ellipsoid_normal) = 0;
    virtual void mapFlatToEllipsoid(const Math::vec3 &flat_point, Math::vec3 &ret_ellipsoid_point, Math::vec3 &ret_ellipsoid_normal) = 0;
    virtual void mapEllipsoidToFlat(const Math::dvec3 &ellipsoid_point, Math::dvec3 &ret_flat_point, Math::dvec3 &ret_ellipsoid_normal) = 0;
    virtual void mapEllipsoidToFlat(const Math::vec3 &ellipsoid_point, Math::vec3 &ret_flat_point, Math::vec3 &ret_ellipsoid_normal) = 0;
    virtual Math::dmat4 mapFlatToEllipsoid(const Math::dmat4 &flat_transform) = 0;
    virtual Math::mat4 mapFlatToEllipsoid(const Math::mat4 &flat_transform) = 0;
    virtual Math::dmat4 mapEllipsoidToFlat(const Math::dmat4 &ellipsoid_transform) = 0;
    virtual Math::mat4 mapEllipsoidToFlat(const Math::mat4 &ellipsoid_transform) = 0;

 

另外一种是。当节点在geopivot下时,节点其实是有两个左边一个是新的空间座标(经geopivot纠正后的座标),一个是geodetic座标。(其实还有一个是flat座标(geopivot纠正之前的空间座标))
通过如下函数来进行操作:
virtual Math::dvec3 toGeodetic(const Math::dmat4 &world_transform) = 0;
    virtual Math::dvec3 toGeodetic(const Math::mat4 &world_transform) = 0;
    virtual Math::dmat4 toWorld(const Math::dvec3 &geodetic_coords) = 0;
    virtual Math::dmat4 toWorldPreserveRotation(const Math::dmat4 &world_transform, const Math::dvec3 &geodetic_coords) = 0;
    virtual Math::mat4 toWorldPreserveRotation(const Math::mat4 &world_transform, const Math::dvec3 &geodetic_coords) = 0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章