为了方便TacView数据导出,避免一个项目写一份,写了个方便的库以便调用。

具体实现代码存在自建gitea上

注意:tacview官方坐标系为正北为0,顺时针旋转增加,0~360度。

本项目自带坐标转换。如果坐标系与它不一样,需要使用TacviewRender::config()(C++)或tacview_render_config()(C语言)来配置坐标系,详细使用见下文

TacviewRender

用于渲染Tacview文件或日志log(两用)的库项目。

C与C++代码均可使用

用法

下载库文件和头文件,设置引用库文件和头文件。

C++用法:

  1. TacviewRender::init(std::string 路径); 用来创建文件,如果路径不填写则默认创建output.txt.acmi

  2. TacviewRender::config(int beginAngle, RotionalDirection) 配置坐标系,beginAngle为相对于tacview标准坐标系的开始角度(正东为90,正南为180,正西为270),顺时针方向为RotionalDirection::CLOCKWISE,逆时针为RotionalDirection::COUNTER_CLOCKWISE

  3. TacviewRender::createTacview(); 写入tacview格式的相关信息,也可以不加,就单纯当做日志文件使用。

  4. TacviewRender::recordTime(); 记录飞行时间,每次调用记录0.2s,用在每次大循环的开始。

  5. static void recordPlane(std::string id,double lon, double lat, double alt, double roll, double pitch, double yaw,std::string name = "F16", std::string color = "Red");记录一次飞机的位置,id需要为一个字母+多个数字组合,如"A01,A10001",颜色为Red或Blue首字母大写,后续小写.etc.

  6. static void recordMissile(std::string id,double lon, double lat, double alt, double roll, double pitch, double yaw,std::string name = "AM", std::string color = "Red");记录导弹的位置信息,同飞机

示例

#include "TacviewRender.h"
#include <iostream>
#include <pplinterface.h>

int main(int argc, char** argv) {
    TacviewRender::init();
    TacviewRender::createTacview();
    TacviewRender::config(90, RotionalDirection::CLOCKWISE);
    for(int i =0; i< 9 ; ++i) {
        TacviewRender::recordTime();
        
        //TacviewRender::recordPlane();
        TacviewRender::recordPlane("A001", 36, 100, 30, 10, 15, 50.11, "F16", "Red");
        TacviewRender::recordPlane("B001", 35, 101, 30, 10, 15, 50.11, "F16", "Blue");
    }
    return 0;
}

C用法

  1. int tacview_render_init(const char* path);,用来创建文件,如果路径为NULL则默认创建output.txt.acmi

  2. void tacview_render_config(int beginAngle, int rotional_direction); 配置坐标系,beginAngle为相对于tacview标准坐标系的开始角度(正东为90,正南为180,正西为270),顺时针方向为0,逆时针为1

  3. void tacview_render_create(void); 写入tacview格式的相关信息,也可以不加,就单纯当做日志文件使用。

  4. void tacview_render_record_time(void); 记录飞行时间,每次调用记录0.2s,用在每次大循环的开始。

void tacview_render_record_plane(
    const char* id,
    double lon,
    double lat,
    double alt,
    double roll,
    double pitch,
    double yaw,
    const char* name,
    const char* color
);

记录一次飞机的位置,id需要为一个字母+多个数字组合,如"A01,A10001",颜色为Red或Blue首字母大写,后续小写.etc. 6.

void tacview_render_record_missile(
    const char* id,
    double lon,
    double lat,
    double alt,
    double roll,
    double pitch,
    double yaw,
    const char* name,
    const char* color
);

记录导弹的位置信息,同飞机

示例

#include <stdio.h>
#include "TacviewRenderC.h"
int main() {

    printf("hello");
    tacview_render_init(NULL); //初始化文件
    tacview_render_create(); //初始化tacview格式,如果不加这句可以当做普通日志文件

    
    //初始化坐标系,默认坐标系为正北为0,顺时针,0~360度;后面的角度方向0为顺时针,1为逆时针
    //此处为以90度(正东)为新0度,逆时针方向
    tacview_render_config(90, 1); 
    for(int i = 0; i <= 10; ++i){
        //记录当前仿真时间,每个大循环需要带一个
        tacview_render_record_time();
        //记录飞机位置(内部会进行角度坐标系的转换)
        tacview_render_record_plane("A01", 0, 0, 0, 0, 0, 0, NULL, "Blue");
        
    }

    return 0;
}