ThreatSourceLibaray/docs/project/dll_integration_guide.md

46 KiB
Raw Blame History

威胁源仿真库DLL对接指南

文档概述

本文档详细说明了如何将威胁源仿真库作为DLL库集成到外部仿真系统如Unity、UE4、自定义仿真平台等中。

版本: 1.0
创建日期: 2024年12月
最后更新: 2024年12月


1. 架构概览

1.1 整体架构

外部仿真系统 (Unity/UE4/自定义)
    ↕ (P/Invoke 或 COM)
威胁源仿真库 DLL (ThreatSource.dll)
    ↕ (内部调用)
C++/CLI 包装层 (ThreatSourceNative.dll)
    ↕ (托管/非托管互操作)
.NET 核心库 (ThreatSource.dll)
    ↕ (依赖)
大气传输库 (AirTransmission.dll)

1.2 接口层次

  1. C API层提供标准C接口支持所有外部系统
  2. C# Wrapper层:提供.NET友好的接口
  3. Unity Package层专门为Unity优化的包装
  4. 通用适配器层:支持自定义仿真系统

2. C API接口设计

2.1 核心API结构

// ============================================================================
// 威胁源仿真库 C API 接口
// ============================================================================

#ifndef THREATSOURCE_API_H
#define THREATSOURCE_API_H

#ifdef _WIN32
    #ifdef THREATSOURCE_EXPORTS
        #define THREATSOURCE_API __declspec(dllexport)
    #else
        #define THREATSOURCE_API __declspec(dllimport)
    #endif
#else
    #define THREATSOURCE_API
#endif

#ifdef __cplusplus
extern "C" {
#endif

// ============================================================================
// 1. 基础类型定义
// ============================================================================

typedef struct {
    double x, y, z;
} TS_Vector3D;

typedef struct {
    double yaw, pitch, roll;  // 弧度
} TS_Orientation;

typedef struct {
    TS_Vector3D position;
    TS_Vector3D velocity;
    TS_Orientation orientation;
} TS_KinematicState;

typedef struct {
    int type;           // 0=晴朗, 1=雨天, 2=雪天, 3=雾天, 4=沙尘
    double temperature; // 摄氏度
    double humidity;    // 相对湿度 (0-1)
    double visibility;  // 能见度 (km)
    double precipitation; // 降水量 (mm/h)
    double windSpeed;   // 风速 (m/s)
    double windDirection; // 风向 (度)
} TS_Weather;

typedef struct {
    char senderId[64];
    char targetId[64];
    double timestamp;
    int eventType;      // 事件类型枚举
    char data[256];     // 事件数据JSON字符串
} TS_Event;

// 错误码定义
#define TS_SUCCESS                    0
#define TS_ERROR_INVALID_PARAM       -1
#define TS_ERROR_INIT_FAILED         -2
#define TS_ERROR_SIMULATION_FAILED   -3
#define TS_ERROR_ENTITY_NOT_FOUND    -4
#define TS_ERROR_BUFFER_TOO_SMALL    -5

// ============================================================================
// 2. 仿真管理接口
// ============================================================================

/// <summary>
/// 初始化威胁源仿真系统
/// </summary>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_Initialize();

/// <summary>
/// 销毁威胁源仿真系统
/// </summary>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_Shutdown();

/// <summary>
/// 创建仿真场景
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_CreateScenario(const char* scenarioId);

/// <summary>
/// 销毁仿真场景
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_DestroyScenario(const char* scenarioId);

/// <summary>
/// 开始仿真
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="timeStep">时间步长(秒)</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_StartSimulation(const char* scenarioId, double timeStep);

/// <summary>
/// 暂停仿真
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_PauseSimulation(const char* scenarioId);

/// <summary>
/// 恢复仿真
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_ResumeSimulation(const char* scenarioId);

/// <summary>
/// 停止仿真
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_StopSimulation(const char* scenarioId);

/// <summary>
/// 更新仿真
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="deltaTime">时间增量(秒)</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_UpdateSimulation(const char* scenarioId, double deltaTime);

/// <summary>
/// 获取仿真状态
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="state">输出状态 (0=停止, 1=运行, 2=暂停)</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetSimulationState(const char* scenarioId, int* state);

/// <summary>
/// 获取仿真时间
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="time">输出仿真时间</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetSimulationTime(const char* scenarioId, double* time);

// ============================================================================
// 3. 实体管理接口
// ============================================================================

/// <summary>
/// 创建导弹
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="configPath">配置文件路径</param>
/// <param name="initialState">初始状态</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_CreateMissile(const char* scenarioId, const char* missileId, 
                                      const char* configPath, const TS_KinematicState* initialState);

/// <summary>
/// 创建目标
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="targetId">目标ID</param>
/// <param name="targetType">目标类型 (0=坦克, 1=装甲车, 2=建筑物)</param>
/// <param name="initialState">初始状态</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_CreateTarget(const char* scenarioId, const char* targetId, 
                                     int targetType, const TS_KinematicState* initialState);

/// <summary>
/// 创建指示器
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="indicatorId">指示器ID</param>
/// <param name="indicatorType">指示器类型 (0=激光指示器, 1=激光驾束仪, 2=红外测角仪)</param>
/// <param name="configPath">配置文件路径</param>
/// <param name="initialState">初始状态</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_CreateIndicator(const char* scenarioId, const char* indicatorId, 
                                        int indicatorType, const char* configPath, 
                                        const TS_KinematicState* initialState);

/// <summary>
/// 创建干扰器
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="jammerId">干扰器ID</param>
/// <param name="jammerType">干扰器类型 (0=激光干扰器, 1=红外干扰器, 2=毫米波干扰器)</param>
/// <param name="configPath">配置文件路径</param>
/// <param name="initialState">初始状态</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_CreateJammer(const char* scenarioId, const char* jammerId, 
                                     int jammerType, const char* configPath, 
                                     const TS_KinematicState* initialState);

/// <summary>
/// 销毁实体
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityId">实体ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_DestroyEntity(const char* scenarioId, const char* entityId);

/// <summary>
/// 激活实体
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityId">实体ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_ActivateEntity(const char* scenarioId, const char* entityId);

/// <summary>
/// 停用实体
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityId">实体ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_DeactivateEntity(const char* scenarioId, const char* entityId);

// ============================================================================
// 4. 实体控制接口
// ============================================================================

/// <summary>
/// 发射导弹
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="targetId">目标ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_FireMissile(const char* scenarioId, const char* missileId, const char* targetId);

/// <summary>
/// 设置指示器目标
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="indicatorId">指示器ID</param>
/// <param name="targetId">目标ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetIndicatorTarget(const char* scenarioId, const char* indicatorId, const char* targetId);

/// <summary>
/// 启动干扰器
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="jammerId">干扰器ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_StartJammer(const char* scenarioId, const char* jammerId);

/// <summary>
/// 停止干扰器
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="jammerId">干扰器ID</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_StopJammer(const char* scenarioId, const char* jammerId);

// ============================================================================
// 5. 状态查询接口
// ============================================================================

/// <summary>
/// 获取实体状态
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityId">实体ID</param>
/// <param name="state">输出状态</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetEntityState(const char* scenarioId, const char* entityId, TS_KinematicState* state);

/// <summary>
/// 获取实体是否激活
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityId">实体ID</param>
/// <param name="isActive">输出是否激活</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_IsEntityActive(const char* scenarioId, const char* entityId, int* isActive);

/// <summary>
/// 获取导弹制导状态
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="isGuided">输出是否制导</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetMissileGuidanceState(const char* scenarioId, const char* missileId, int* isGuided);

/// <summary>
/// 获取导弹飞行阶段
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="stage">输出飞行阶段 (0=发射, 1=巡航, 2=制导, 3=终端)</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetMissileFlightStage(const char* scenarioId, const char* missileId, int* stage);

/// <summary>
/// 获取目标生命值
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="targetId">目标ID</param>
/// <param name="health">输出生命值</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetTargetHealth(const char* scenarioId, const char* targetId, double* health);

// ============================================================================
// 6. 环境控制接口
// ============================================================================

/// <summary>
/// 设置天气条件
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="weather">天气条件</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetWeather(const char* scenarioId, const TS_Weather* weather);

/// <summary>
/// 获取天气条件
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="weather">输出天气条件</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetWeather(const char* scenarioId, TS_Weather* weather);

// ============================================================================
// 7. 事件系统接口
// ============================================================================

/// <summary>
/// 注册事件回调函数
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="eventType">事件类型</param>
/// <param name="callback">回调函数指针</param>
/// <returns>错误码</returns>
typedef void (*TS_EventCallback)(const TS_Event* event);
THREATSOURCE_API int TS_RegisterEventCallback(const char* scenarioId, int eventType, TS_EventCallback callback);

/// <summary>
/// 注销事件回调函数
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="eventType">事件类型</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_UnregisterEventCallback(const char* scenarioId, int eventType);

/// <summary>
/// 轮询事件队列
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="events">输出事件数组</param>
/// <param name="maxEvents">最大事件数量</param>
/// <param name="actualEvents">实际事件数量</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_PollEvents(const char* scenarioId, TS_Event* events, int maxEvents, int* actualEvents);

/// <summary>
/// 发送外部事件
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="event">事件</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SendExternalEvent(const char* scenarioId, const TS_Event* event);

// ============================================================================
// 8. 工具函数接口
// ============================================================================

/// <summary>
/// 获取最后的错误信息
/// </summary>
/// <param name="buffer">输出缓冲区</param>
/// <param name="bufferSize">缓冲区大小</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetLastError(char* buffer, int bufferSize);

/// <summary>
/// 获取版本信息
/// </summary>
/// <param name="buffer">输出缓冲区</param>
/// <param name="bufferSize">缓冲区大小</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetVersion(char* buffer, int bufferSize);

/// <summary>
/// 获取支持的导弹类型列表
/// </summary>
/// <param name="types">输出类型数组</param>
/// <param name="maxTypes">最大类型数量</param>
/// <param name="actualTypes">实际类型数量</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetSupportedMissileTypes(char types[][64], int maxTypes, int* actualTypes);

#ifdef __cplusplus
}
#endif

#endif // THREATSOURCE_API_H

3. Unity集成方案

3.1 Unity Package结构

ThreatSourceUnity/
├── Runtime/
│   ├── Scripts/
│   │   ├── Core/
│   │   │   ├── ThreatSourceManager.cs
│   │   │   ├── SimulationScenario.cs
│   │   │   └── EntityManager.cs
│   │   ├── Entities/
│   │   │   ├── MissileController.cs
│   │   │   ├── TargetController.cs
│   │   │   ├── IndicatorController.cs
│   │   │   └── JammerController.cs
│   │   ├── Events/
│   │   │   ├── EventManager.cs
│   │   │   └── EventTypes.cs
│   │   └── Utils/
│   │       ├── NativeInterop.cs
│   │       └── ConfigLoader.cs
│   ├── Plugins/
│   │   ├── x86_64/
│   │   │   ├── ThreatSource.dll
│   │   │   ├── ThreatSourceNative.dll
│   │   │   └── AirTransmission.dll
│   │   └── x86/
│   │       └── (32位版本)
│   └── Prefabs/
│       ├── Missile.prefab
│       ├── Target.prefab
│       ├── Indicator.prefab
│       └── Jammer.prefab
├── Editor/
│   ├── ThreatSourceEditor.cs
│   └── ScenarioBuilder.cs
└── Documentation~/
    ├── manual.md
    └── api.md

3.2 Unity核心脚本

// ThreatSourceManager.cs - Unity主管理器
using UnityEngine;
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;

namespace ThreatSource.Unity
{
    /// <summary>
    /// 威胁源仿真系统Unity管理器
    /// </summary>
    public class ThreatSourceManager : MonoBehaviour
    {
        [Header("仿真设置")]
        public string scenarioId = "DefaultScenario";
        public double timeStep = 0.02; // 50Hz
        public bool autoStart = true;
        
        [Header("天气设置")]
        public WeatherSettings weather = new WeatherSettings();
        
        private bool isInitialized = false;
        private Dictionary<string, GameObject> entityObjects = new Dictionary<string, GameObject>();
        
        // 事件回调
        public event Action<string, string> OnMissileHit;
        public event Action<string> OnTargetDestroyed;
        public event Action<string, int> OnMissileStageChanged;
        
        void Start()
        {
            InitializeSimulation();
            if (autoStart)
            {
                StartSimulation();
            }
        }
        
        void Update()
        {
            if (isInitialized)
            {
                // 更新仿真
                int result = NativeInterop.TS_UpdateSimulation(scenarioId, Time.deltaTime);
                if (result != 0)
                {
                    Debug.LogError($"仿真更新失败: {NativeInterop.GetLastError()}");
                }
                
                // 轮询事件
                PollEvents();
                
                // 同步实体状态
                SynchronizeEntityStates();
            }
        }
        
        void OnDestroy()
        {
            ShutdownSimulation();
        }
        
        private void InitializeSimulation()
        {
            // 初始化威胁源系统
            int result = NativeInterop.TS_Initialize();
            if (result != 0)
            {
                Debug.LogError($"威胁源系统初始化失败: {NativeInterop.GetLastError()}");
                return;
            }
            
            // 创建场景
            result = NativeInterop.TS_CreateScenario(scenarioId);
            if (result != 0)
            {
                Debug.LogError($"场景创建失败: {NativeInterop.GetLastError()}");
                return;
            }
            
            // 设置天气
            SetWeather(weather);
            
            isInitialized = true;
            Debug.Log("威胁源仿真系统初始化成功");
        }
        
        public void StartSimulation()
        {
            if (!isInitialized) return;
            
            int result = NativeInterop.TS_StartSimulation(scenarioId, timeStep);
            if (result != 0)
            {
                Debug.LogError($"仿真启动失败: {NativeInterop.GetLastError()}");
            }
            else
            {
                Debug.Log("仿真已启动");
            }
        }
        
        public void StopSimulation()
        {
            if (!isInitialized) return;
            
            int result = NativeInterop.TS_StopSimulation(scenarioId);
            if (result != 0)
            {
                Debug.LogError($"仿真停止失败: {NativeInterop.GetLastError()}");
            }
            else
            {
                Debug.Log("仿真已停止");
            }
        }
        
        private void ShutdownSimulation()
        {
            if (isInitialized)
            {
                NativeInterop.TS_DestroyScenario(scenarioId);
                NativeInterop.TS_Shutdown();
                isInitialized = false;
            }
        }
        
        // 创建实体的公共方法
        public GameObject CreateMissile(string missileId, string configPath, Vector3 position, Vector3 rotation)
        {
            // 转换Unity坐标到仿真坐标
            var state = UnityToSimulationState(position, rotation);
            
            // 在仿真中创建导弹
            int result = NativeInterop.TS_CreateMissile(scenarioId, missileId, configPath, ref state);
            if (result != 0)
            {
                Debug.LogError($"导弹创建失败: {NativeInterop.GetLastError()}");
                return null;
            }
            
            // 在Unity中创建GameObject
            GameObject missileObj = Instantiate(missilePrefab, position, Quaternion.Euler(rotation));
            missileObj.name = missileId;
            
            // 添加控制器组件
            var controller = missileObj.GetComponent<MissileController>();
            if (controller == null)
                controller = missileObj.AddComponent<MissileController>();
            controller.Initialize(missileId, this);
            
            entityObjects[missileId] = missileObj;
            return missileObj;
        }
        
        // 其他实体创建方法...
        
        private void PollEvents()
        {
            const int maxEvents = 32;
            var events = new NativeInterop.TS_Event[maxEvents];
            int actualEvents;
            
            int result = NativeInterop.TS_PollEvents(scenarioId, events, maxEvents, out actualEvents);
            if (result == 0)
            {
                for (int i = 0; i < actualEvents; i++)
                {
                    ProcessEvent(events[i]);
                }
            }
        }
        
        private void ProcessEvent(NativeInterop.TS_Event evt)
        {
            switch (evt.eventType)
            {
                case (int)EventType.MissileHit:
                    OnMissileHit?.Invoke(evt.senderId, evt.targetId);
                    break;
                case (int)EventType.TargetDestroyed:
                    OnTargetDestroyed?.Invoke(evt.targetId);
                    break;
                case (int)EventType.MissileStageChanged:
                    // 解析事件数据获取新阶段
                    var stageData = JsonUtility.FromJson<StageChangeData>(evt.data);
                    OnMissileStageChanged?.Invoke(evt.senderId, stageData.newStage);
                    break;
            }
        }
        
        private void SynchronizeEntityStates()
        {
            foreach (var kvp in entityObjects)
            {
                string entityId = kvp.Key;
                GameObject obj = kvp.Value;
                
                // 获取仿真状态
                NativeInterop.TS_KinematicState state;
                int result = NativeInterop.TS_GetEntityState(scenarioId, entityId, out state);
                if (result == 0)
                {
                    // 同步到Unity对象
                    obj.transform.position = SimulationToUnityPosition(state.position);
                    obj.transform.rotation = SimulationToUnityRotation(state.orientation);
                    
                    // 通知控制器组件
                    var controller = obj.GetComponent<EntityController>();
                    controller?.OnStateUpdated(state);
                }
            }
        }
        
        // 坐标系转换方法
        private NativeInterop.TS_KinematicState UnityToSimulationState(Vector3 position, Vector3 rotation)
        {
            return new NativeInterop.TS_KinematicState
            {
                position = new NativeInterop.TS_Vector3D { x = position.x, y = position.y, z = position.z },
                velocity = new NativeInterop.TS_Vector3D { x = 0, y = 0, z = 0 },
                orientation = new NativeInterop.TS_Orientation 
                { 
                    yaw = rotation.y * Mathf.Deg2Rad, 
                    pitch = rotation.x * Mathf.Deg2Rad, 
                    roll = rotation.z * Mathf.Deg2Rad 
                }
            };
        }
        
        private Vector3 SimulationToUnityPosition(NativeInterop.TS_Vector3D pos)
        {
            return new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
        }
        
        private Quaternion SimulationToUnityRotation(NativeInterop.TS_Orientation orient)
        {
            return Quaternion.Euler(
                (float)(orient.pitch * Mathf.Rad2Deg),
                (float)(orient.yaw * Mathf.Rad2Deg),
                (float)(orient.roll * Mathf.Rad2Deg)
            );
        }
    }
    
    [Serializable]
    public class WeatherSettings
    {
        public WeatherType type = WeatherType.Clear;
        public float temperature = 20f;
        public float humidity = 0.5f;
        public float visibility = 10f;
        public float precipitation = 0f;
        public float windSpeed = 5f;
        public float windDirection = 0f;
    }
    
    public enum WeatherType
    {
        Clear = 0,
        Rain = 1,
        Snow = 2,
        Fog = 3,
        Dust = 4
    }
    
    public enum EventType
    {
        MissileHit = 1,
        TargetDestroyed = 2,
        MissileStageChanged = 3,
        // 其他事件类型...
    }
    
    [Serializable]
    public class StageChangeData
    {
        public int oldStage;
        public int newStage;
    }
}

4. 使用流程

4.1 初始化流程

// 1. 初始化威胁源系统
int result = TS_Initialize();

// 2. 创建仿真场景
result = TS_CreateScenario("MyScenario");

// 3. 设置环境条件
TS_Weather weather = {
    .type = 0,           // 晴朗
    .temperature = 25.0, // 25°C
    .humidity = 0.6,     // 60%湿度
    .visibility = 15.0,  // 15km能见度
    .precipitation = 0.0,
    .windSpeed = 3.0,
    .windDirection = 45.0
};
result = TS_SetWeather("MyScenario", &weather);

// 4. 注册事件回调
result = TS_RegisterEventCallback("MyScenario", EVENT_MISSILE_HIT, OnMissileHitCallback);
result = TS_RegisterEventCallback("MyScenario", EVENT_TARGET_DESTROYED, OnTargetDestroyedCallback);

4.2 实体创建流程

// 1. 创建目标
TS_KinematicState targetState = {
    .position = {1000.0, 0.0, 0.0},
    .velocity = {0.0, 0.0, 0.0},
    .orientation = {0.0, 0.0, 0.0}
};
result = TS_CreateTarget("MyScenario", "Tank_01", TARGET_TYPE_TANK, &targetState);

// 2. 创建导弹
TS_KinematicState missileState = {
    .position = {0.0, 0.0, 0.0},
    .velocity = {0.0, 0.0, 0.0},
    .orientation = {0.0, 0.0, 0.0}
};
result = TS_CreateMissile("MyScenario", "Missile_01", "configs/ir_imaging.toml", &missileState);

// 3. 创建指示器(如果需要)
TS_KinematicState indicatorState = {
    .position = {-100.0, 0.0, 10.0},
    .velocity = {0.0, 0.0, 0.0},
    .orientation = {0.0, 0.0, 0.0}
};
result = TS_CreateIndicator("MyScenario", "Laser_01", INDICATOR_TYPE_LASER_DESIGNATOR, 
                           "configs/laser_designator.toml", &indicatorState);

4.3 仿真运行流程

// 1. 激活实体
result = TS_ActivateEntity("MyScenario", "Tank_01");
result = TS_ActivateEntity("MyScenario", "Missile_01");
result = TS_ActivateEntity("MyScenario", "Laser_01");

// 2. 设置指示器目标(如果需要)
result = TS_SetIndicatorTarget("MyScenario", "Laser_01", "Tank_01");

// 3. 开始仿真
result = TS_StartSimulation("MyScenario", 0.02); // 50Hz

// 4. 发射导弹
result = TS_FireMissile("MyScenario", "Missile_01", "Tank_01");

// 5. 仿真循环
while (simulationRunning) {
    // 更新仿真
    result = TS_UpdateSimulation("MyScenario", deltaTime);
    
    // 轮询事件
    TS_Event events[32];
    int eventCount;
    result = TS_PollEvents("MyScenario", events, 32, &eventCount);
    
    for (int i = 0; i < eventCount; i++) {
        ProcessEvent(&events[i]);
    }
    
    // 获取实体状态进行可视化更新
    TS_KinematicState missileState;
    result = TS_GetEntityState("MyScenario", "Missile_01", &missileState);
    UpdateVisualObject("Missile_01", &missileState);
    
    Sleep(20); // 50Hz
}

4.4 清理流程

// 1. 停止仿真
result = TS_StopSimulation("MyScenario");

// 2. 销毁实体
result = TS_DestroyEntity("MyScenario", "Missile_01");
result = TS_DestroyEntity("MyScenario", "Tank_01");
result = TS_DestroyEntity("MyScenario", "Laser_01");

// 3. 销毁场景
result = TS_DestroyScenario("MyScenario");

// 4. 关闭系统
result = TS_Shutdown();

5. 事件系统对接

5.1 事件类型定义

// 事件类型枚举
typedef enum {
    // 导弹事件
    EVENT_MISSILE_FIRED = 1,
    EVENT_MISSILE_HIT = 2,
    EVENT_MISSILE_STAGE_CHANGED = 3,
    EVENT_MISSILE_GUIDANCE_ACQUIRED = 4,
    EVENT_MISSILE_GUIDANCE_LOST = 5,
    
    // 目标事件
    EVENT_TARGET_HIT = 10,
    EVENT_TARGET_DESTROYED = 11,
    EVENT_TARGET_DAMAGED = 12,
    
    // 指示器事件
    EVENT_LASER_ILLUMINATION_START = 20,
    EVENT_LASER_ILLUMINATION_STOP = 21,
    EVENT_INFRARED_GUIDANCE_COMMAND = 22,
    
    // 干扰器事件
    EVENT_JAMMING_START = 30,
    EVENT_JAMMING_STOP = 31,
    
    // 告警器事件
    EVENT_LASER_WARNING = 40,
    EVENT_INFRARED_WARNING = 41,
    EVENT_MILLIMETER_WAVE_WARNING = 42,
    
    // 系统事件
    EVENT_SIMULATION_START = 50,
    EVENT_SIMULATION_STOP = 51,
    EVENT_SIMULATION_PAUSE = 52,
    EVENT_SIMULATION_RESUME = 53
} TS_EventType;

5.2 事件回调示例

// 导弹命中事件回调
void OnMissileHitCallback(const TS_Event* event) {
    printf("导弹 %s 命中目标 %s\n", event->senderId, event->targetId);
    
    // 解析事件数据
    // event->data 包含JSON格式的详细信息
    // 例如: {"hitPosition": {"x": 1000, "y": 0, "z": 0}, "damage": 100}
    
    // 通知外部系统
    NotifyExternalSystem(EVENT_MISSILE_HIT, event);
}

// 目标被摧毁事件回调
void OnTargetDestroyedCallback(const TS_Event* event) {
    printf("目标 %s 被摧毁\n", event->targetId);
    
    // 在外部系统中移除目标的可视化表示
    RemoveVisualObject(event->targetId);
}

6. 配置文件管理

6.1 配置文件结构

configs/
├── missiles/
│   ├── ir_imaging/
│   │   └── itg_001.toml
│   ├── ir_command/
│   │   └── irc_001.toml
│   ├── laser_beam_rider/
│   │   └── lbr_001.toml
│   └── laser_semi_active/
│       └── lsg_001.toml
├── indicators/
│   ├── laser_designators/
│   │   └── ld_001.toml
│   ├── laser_beam_riders/
│   │   └── lbr_001.toml
│   └── ir_trackers/
│       └── it_001.toml
├── jammers/
│   ├── laser_jammers/
│   │   └── lj_001.toml
│   ├── ir_jammers/
│   │   └── ij_001.toml
│   └── mmw_jammers/
│       └── mj_001.toml
└── scenarios/
    ├── basic_test.toml
    └── complex_scenario.toml

6.2 配置加载API

/// <summary>
/// 加载配置文件
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <param name="configData">输出配置数据JSON字符串</param>
/// <param name="bufferSize">缓冲区大小</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_LoadConfig(const char* configPath, char* configData, int bufferSize);

/// <summary>
/// 验证配置文件
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <param name="isValid">输出是否有效</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_ValidateConfig(const char* configPath, int* isValid);

/// <summary>
/// 获取默认配置
/// </summary>
/// <param name="entityType">实体类型</param>
/// <param name="configData">输出默认配置JSON字符串</param>
/// <param name="bufferSize">缓冲区大小</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetDefaultConfig(int entityType, char* configData, int bufferSize);

7. 性能优化建议

7.1 内存管理

  1. 对象池模式:为频繁创建/销毁的对象使用对象池
  2. 批量操作:批量更新多个实体状态
  3. 延迟加载:按需加载配置文件和资源

7.2 多线程支持

/// <summary>
/// 设置仿真线程数
/// </summary>
/// <param name="threadCount">线程数量</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetThreadCount(int threadCount);

/// <summary>
/// 启用异步更新模式
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="enabled">是否启用</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetAsyncMode(const char* scenarioId, int enabled);

7.3 批量操作API

/// <summary>
/// 批量获取实体状态
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityIds">实体ID数组</param>
/// <param name="entityCount">实体数量</param>
/// <param name="states">输出状态数组</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_GetEntityStatesBatch(const char* scenarioId, const char** entityIds, 
                                             int entityCount, TS_KinematicState* states);

/// <summary>
/// 批量更新实体状态
/// </summary>
/// <param name="scenarioId">场景ID</param>
/// <param name="entityIds">实体ID数组</param>
/// <param name="states">状态数组</param>
/// <param name="entityCount">实体数量</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetEntityStatesBatch(const char* scenarioId, const char** entityIds, 
                                             const TS_KinematicState* states, int entityCount);

8. 错误处理和调试

8.1 错误码系统

// 详细错误码定义
#define TS_SUCCESS                     0
#define TS_ERROR_INVALID_PARAM        -1
#define TS_ERROR_INIT_FAILED          -2
#define TS_ERROR_SIMULATION_FAILED    -3
#define TS_ERROR_ENTITY_NOT_FOUND     -4
#define TS_ERROR_BUFFER_TOO_SMALL     -5
#define TS_ERROR_CONFIG_INVALID       -6
#define TS_ERROR_SCENARIO_NOT_FOUND   -7
#define TS_ERROR_ENTITY_ALREADY_EXISTS -8
#define TS_ERROR_SIMULATION_NOT_RUNNING -9
#define TS_ERROR_THREAD_FAILED        -10
#define TS_ERROR_MEMORY_ALLOCATION    -11
#define TS_ERROR_FILE_NOT_FOUND       -12
#define TS_ERROR_PERMISSION_DENIED    -13

8.2 日志系统

/// <summary>
/// 设置日志级别
/// </summary>
/// <param name="level">日志级别 (0=关闭, 1=错误, 2=警告, 3=信息, 4=调试)</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetLogLevel(int level);

/// <summary>
/// 设置日志输出文件
/// </summary>
/// <param name="filePath">日志文件路径</param>
/// <returns>错误码</returns>
THREATSOURCE_API int TS_SetLogFile(const char* filePath);

/// <summary>
/// 注册日志回调函数
/// </summary>
/// <param name="callback">日志回调函数</param>
/// <returns>错误码</returns>
typedef void (*TS_LogCallback)(int level, const char* message);
THREATSOURCE_API int TS_RegisterLogCallback(TS_LogCallback callback);

9. 部署和分发

9.1 文件结构

ThreatSourceSDK/
├── bin/
│   ├── x64/
│   │   ├── ThreatSource.dll
│   │   ├── ThreatSourceNative.dll
│   │   ├── AirTransmission.dll
│   │   └── msvcr140.dll (运行时依赖)
│   └── x86/
│       └── (32位版本)
├── include/
│   ├── threat_source.h
│   └── threat_source_types.h
├── lib/
│   ├── x64/
│   │   └── ThreatSourceNative.lib
│   └── x86/
│       └── ThreatSourceNative.lib
├── configs/
│   └── (配置文件)
├── docs/
│   ├── api_reference.html
│   ├── integration_guide.pdf
│   └── examples/
└── samples/
    ├── c_sample/
    ├── cpp_sample/
    ├── csharp_sample/
    └── unity_sample/

9.2 系统要求

  • 操作系统: Windows 10/11 (x64), Linux (x64), macOS (x64)
  • .NET Runtime: .NET 8.0 或更高版本
  • Visual C++ Redistributable: 2019或更高版本
  • 内存: 最少512MB推荐2GB
  • 存储: 最少100MB可用空间

10. 示例代码

10.1 C语言示例

#include "threat_source.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 初始化系统
    int result = TS_Initialize();
    if (result != TS_SUCCESS) {
        printf("初始化失败: %d\n", result);
        return -1;
    }
    
    // 创建场景
    const char* scenarioId = "TestScenario";
    result = TS_CreateScenario(scenarioId);
    if (result != TS_SUCCESS) {
        printf("场景创建失败: %d\n", result);
        TS_Shutdown();
        return -1;
    }
    
    // 创建目标
    TS_KinematicState targetState = {
        .position = {1000.0, 0.0, 0.0},
        .velocity = {0.0, 0.0, 0.0},
        .orientation = {0.0, 0.0, 0.0}
    };
    result = TS_CreateTarget(scenarioId, "Target_01", 0, &targetState);
    
    // 创建导弹
    TS_KinematicState missileState = {
        .position = {0.0, 0.0, 0.0},
        .velocity = {0.0, 0.0, 0.0},
        .orientation = {0.0, 0.0, 0.0}
    };
    result = TS_CreateMissile(scenarioId, "Missile_01", "configs/ir_imaging.toml", &missileState);
    
    // 激活实体
    TS_ActivateEntity(scenarioId, "Target_01");
    TS_ActivateEntity(scenarioId, "Missile_01");
    
    // 开始仿真
    result = TS_StartSimulation(scenarioId, 0.02);
    
    // 发射导弹
    TS_FireMissile(scenarioId, "Missile_01", "Target_01");
    
    // 仿真循环
    for (int i = 0; i < 1000; i++) {
        result = TS_UpdateSimulation(scenarioId, 0.02);
        
        // 检查仿真状态
        int state;
        TS_GetSimulationState(scenarioId, &state);
        if (state == 0) { // 仿真已停止
            break;
        }
        
        // 获取导弹状态
        TS_KinematicState currentState;
        result = TS_GetEntityState(scenarioId, "Missile_01", &currentState);
        if (result == TS_SUCCESS) {
            printf("导弹位置: (%.2f, %.2f, %.2f)\n", 
                   currentState.position.x, 
                   currentState.position.y, 
                   currentState.position.z);
        }
        
        // 模拟20ms延迟
        #ifdef _WIN32
        Sleep(20);
        #else
        usleep(20000);
        #endif
    }
    
    // 清理
    TS_StopSimulation(scenarioId);
    TS_DestroyScenario(scenarioId);
    TS_Shutdown();
    
    return 0;
}

10.2 C#语言示例

using System;
using System.Runtime.InteropServices;
using System.Threading;

class Program
{
    static void Main()
    {
        var simulator = new ThreatSourceSimulator();
        simulator.RunSimulation();
    }
}

public class ThreatSourceSimulator
{
    public void RunSimulation()
    {
        // 初始化系统
        int result = NativeAPI.TS_Initialize();
        if (result != 0)
        {
            Console.WriteLine($"初始化失败: {result}");
            return;
        }
        
        string scenarioId = "TestScenario";
        
        try
        {
            // 创建场景
            result = NativeAPI.TS_CreateScenario(scenarioId);
            CheckResult(result, "场景创建");
            
            // 设置天气
            var weather = new NativeAPI.TS_Weather
            {
                type = 0, // 晴朗
                temperature = 25.0,
                humidity = 0.6,
                visibility = 15.0,
                precipitation = 0.0,
                windSpeed = 3.0,
                windDirection = 45.0
            };
            result = NativeAPI.TS_SetWeather(scenarioId, ref weather);
            CheckResult(result, "天气设置");
            
            // 创建实体
            CreateEntities(scenarioId);
            
            // 开始仿真
            result = NativeAPI.TS_StartSimulation(scenarioId, 0.02);
            CheckResult(result, "仿真启动");
            
            // 发射导弹
            result = NativeAPI.TS_FireMissile(scenarioId, "Missile_01", "Target_01");
            CheckResult(result, "导弹发射");
            
            // 仿真循环
            RunSimulationLoop(scenarioId);
        }
        finally
        {
            // 清理资源
            NativeAPI.TS_StopSimulation(scenarioId);
            NativeAPI.TS_DestroyScenario(scenarioId);
            NativeAPI.TS_Shutdown();
        }
    }
    
    private void CreateEntities(string scenarioId)
    {
        // 创建目标
        var targetState = new NativeAPI.TS_KinematicState
        {
            position = new NativeAPI.TS_Vector3D { x = 1000.0, y = 0.0, z = 0.0 },
            velocity = new NativeAPI.TS_Vector3D { x = 0.0, y = 0.0, z = 0.0 },
            orientation = new NativeAPI.TS_Orientation { yaw = 0.0, pitch = 0.0, roll = 0.0 }
        };
        int result = NativeAPI.TS_CreateTarget(scenarioId, "Target_01", 0, ref targetState);
        CheckResult(result, "目标创建");
        
        // 创建导弹
        var missileState = new NativeAPI.TS_KinematicState
        {
            position = new NativeAPI.TS_Vector3D { x = 0.0, y = 0.0, z = 0.0 },
            velocity = new NativeAPI.TS_Vector3D { x = 0.0, y = 0.0, z = 0.0 },
            orientation = new NativeAPI.TS_Orientation { yaw = 0.0, pitch = 0.0, roll = 0.0 }
        };
        result = NativeAPI.TS_CreateMissile(scenarioId, "Missile_01", "configs/ir_imaging.toml", ref missileState);
        CheckResult(result, "导弹创建");
        
        // 激活实体
        NativeAPI.TS_ActivateEntity(scenarioId, "Target_01");
        NativeAPI.TS_ActivateEntity(scenarioId, "Missile_01");
    }
    
    private void RunSimulationLoop(string scenarioId)
    {
        for (int i = 0; i < 1000; i++)
        {
            // 更新仿真
            int result = NativeAPI.TS_UpdateSimulation(scenarioId, 0.02);
            if (result != 0) break;
            
            // 检查仿真状态
            int state;
            NativeAPI.TS_GetSimulationState(scenarioId, out state);
            if (state == 0) break; // 仿真已停止
            
            // 获取导弹状态
            NativeAPI.TS_KinematicState currentState;
            result = NativeAPI.TS_GetEntityState(scenarioId, "Missile_01", out currentState);
            if (result == 0)
            {
                Console.WriteLine($"导弹位置: ({currentState.position.x:F2}, {currentState.position.y:F2}, {currentState.position.z:F2})");
            }
            
            Thread.Sleep(20); // 20ms延迟
        }
    }
    
    private void CheckResult(int result, string operation)
    {
        if (result != 0)
        {
            string error = NativeAPI.GetLastError();
            throw new Exception($"{operation}失败: {result}, {error}");
        }
    }
}

// P/Invoke声明
public static class NativeAPI
{
    const string DllName = "ThreatSourceNative.dll";
    
    [StructLayout(LayoutKind.Sequential)]
    public struct TS_Vector3D
    {
        public double x, y, z;
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct TS_Orientation
    {
        public double yaw, pitch, roll;
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct TS_KinematicState
    {
        public TS_Vector3D position;
        public TS_Vector3D velocity;
        public TS_Orientation orientation;
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct TS_Weather
    {
        public int type;
        public double temperature;
        public double humidity;
        public double visibility;
        public double precipitation;
        public double windSpeed;
        public double windDirection;
    }
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
    public static extern int TS_Initialize();
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
    public static extern int TS_Shutdown();
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_CreateScenario(string scenarioId);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_DestroyScenario(string scenarioId);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_StartSimulation(string scenarioId, double timeStep);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_StopSimulation(string scenarioId);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_UpdateSimulation(string scenarioId, double deltaTime);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_CreateTarget(string scenarioId, string targetId, int targetType, ref TS_KinematicState initialState);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_CreateMissile(string scenarioId, string missileId, string configPath, ref TS_KinematicState initialState);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_ActivateEntity(string scenarioId, string entityId);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_FireMissile(string scenarioId, string missileId, string targetId);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_GetEntityState(string scenarioId, string entityId, out TS_KinematicState state);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_GetSimulationState(string scenarioId, out int state);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_SetWeather(string scenarioId, ref TS_Weather weather);
    
    [DllImport(DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int TS_GetLastError(StringBuilder buffer, int bufferSize);
    
    public static string GetLastError()
    {
        var buffer = new StringBuilder(256);
        TS_GetLastError(buffer, buffer.Capacity);
        return buffer.ToString();
    }
}

文档结束

此文档提供了威胁源仿真库DLL对接的完整指南包括API设计、集成方案、使用流程和示例代码。