JK강재신 / Unity · XR
← 프로젝트 목록

쓰리디아이 / 2016

항공기 미사일 센서 영상 SW

센서 데이터 녹화·재생과 3D 화면 연동

GISTCPCSV 리플레이
프로젝트 연도 / 기록 당시 상태2016
개발팀 · 리소스 인력 제외1인
사용 기술Winform · Unity3D · C#

PROJECT IN ACTION

실행 화면과 시연

항공기 미사일 센서 영상 SW 프로젝트 화면

OVERVIEW

프로젝트와 나의 역할

GIS 지형 좌표 연동, 외부 모듈 TCP 통신, CSV 녹화·재생, WinForms 내 Unity 화면 구성을 담당했습니다.

  • GIS 데이터를 활용한 3D 실지형 맵핑
  • 네트워크를 통한 외부 모듈 간 데이터 통신
  • CSV 파일을 이용한 데이터 저장 및 리플레이 기능 개발
  • Winform내 Unity 화면 구성

ENGINEERING NOTES

기능별 구현과 문제 해결

담당 기능의 배경부터 구현 방식과 선택한 범위까지 정리했습니다.

01

GIS 지형과 외부 좌표 데이터 연결

배경과 과제

외부 모듈의 지리 좌표를 Unity 지형에 연결하면서 지구 곡률과 고도 차이를 고려해야 했습니다.

내가 구현한 방식

GIS 지형과 Unity 좌표계를 연동하고, 외부 모듈 입력과 지형 표시 사이의 좌표·고도 보정을 담당했습니다.

선택의 이유와 범위

지리 좌표와 화면 좌표를 연결하는 작업 범위입니다. 아래 예제는 기준점과의 차이를 계산하는 원리만 다루며, 실제 지구 곡률·고도 보정의 정확도를 검증한 코드는 아닙니다.

2026 / RECONSTRUCTED EXAMPLE

큰 좌표를 지역 좌표로 변환하기

double 좌표에서 공통 원점을 뺀 뒤 Unity의 float 좌표로 변환합니다.

  1. 큰 직교좌표
  2. 공통 원점 빼기
  3. 로컬 float 좌표
  4. 표시 / 역변환

설명용 개념도 · 실제 제품 화면이나 전체 시스템 설계도가 아닙니다.

사용 방법과 적용 범위

이미 같은 직교좌표계·단위로 변환된 WorldPoint와 origin을 사용합니다.

위경도 투영, ECEF 변환, 지구 곡률 계산을 대신하지 않습니다.

예제 코드 펼치기포트폴리오용 재구성 코드 · 실제 업무 소스 아님
// 2026 portfolio reconstruction. Not original production source; not a geodetic projection library.
using System;
using UnityEngine;
namespace PortfolioExamples
{
    public readonly struct WorldPoint
    {
        public readonly double X, Y, Z;
        public WorldPoint(double x, double y, double z) { X=x; Y=y; Z=z; }
    }
    public static class SharedOrigin
    {
        // Inputs must already use one Cartesian coordinate system and unit.
        public static Vector3 ToLocal(WorldPoint point, WorldPoint origin)
            => new Vector3((float)(point.X-origin.X),(float)(point.Y-origin.Y),(float)(point.Z-origin.Z));
        public static WorldPoint ToWorld(Vector3 local, WorldPoint origin)
            => new WorldPoint(origin.X+local.x,origin.Y+local.y,origin.Z+local.z);
    }
}
02

TCP 통신과 지연 데이터 재생

배경과 과제

외부 모듈과 실시간 데이터를 주고받고, 테스트를 위해 특정 프레임 또는 시간만큼 지연된 데이터가 필요했습니다.

내가 구현한 방식

TCP 통신을 연결하고 CSV 녹화·재생을 구현했습니다. 요청된 지연 길이만큼 데이터를 보관한 뒤 Queue 방식으로 순서대로 처리했습니다.

선택의 이유와 범위

실시간 수신과 테스트용 지연 재생을 구분한 구조입니다. 정량적인 통신 성능 수치는 별도로 측정하지 않았습니다.

2026 / RECONSTRUCTED EXAMPLE

프레임 단위로 지연시키는 데이터 버퍼

정해진 개수의 샘플을 보관한 뒤 입력 순서대로 출력합니다.

  1. 샘플 입력
  2. Queue 보관
  3. 지연 길이 확인
  4. 순서대로 출력

설명용 개념도 · 실제 제품 화면이나 전체 시스템 설계도가 아닙니다.

사용 방법과 적용 범위

new FrameDelayBuffer<T>(delayFrames)를 만들고 샘플마다 Push를 호출합니다.

프레임 수 기준 지연입니다. 가변 네트워크 지연 보정이나 TCP 전송 계층은 포함하지 않습니다.

예제 코드 펼치기포트폴리오용 재구성 코드 · 실제 업무 소스 아님
// 2026 portfolio reconstruction. Not original production source.
using System;
using System.Collections.Generic;
namespace PortfolioExamples
{
    // Fixed sample-count delay, not a network jitter buffer or a wall-clock guarantee.
    public sealed class FrameDelayBuffer<T>
    {
        readonly int delay;
        readonly Queue<T> queue = new Queue<T>();
        public FrameDelayBuffer(int delayFrames)
        { if (delayFrames < 0) throw new ArgumentOutOfRangeException(nameof(delayFrames)); delay = delayFrames; }
        public bool Push(T value, out T output)
        {
            queue.Enqueue(value);
            if (queue.Count <= delay) { output = default(T); return false; }
            output = queue.Dequeue(); return true;
        }
        public void Reset() => queue.Clear();
        public int BufferedCount => queue.Count;
    }
}
03

WinForms 안에 Unity 화면 구성

배경과 과제

사용자가 하나의 소프트웨어에서 제어 화면과 Unity 화면을 함께 볼 수 있어야 했습니다.

내가 구현한 방식

윈도우 핸들(HWND)을 이용해 Unity 화면을 WinForms Panel 안에 표시하는 구성을 담당했습니다.

선택의 이유와 범위

운영 화면과 Unity 시각화를 한 창에 구성하는 역할을 맡았습니다. 적용 방식은 HWND를 통한 창 연결이며, Unity 버전별 호환성 검증은 별도 범위입니다.

MORE SCREENS

추가 실행 화면

CODE & VALIDATION

코드와 검증 범위

기존 코드 발췌와 2026년 포트폴리오용 재구성 코드를 구분해 제공합니다. 재구성 코드는 실제 제품 소스가 아니며, 일반 원리를 설명하기 위해 새로 작성했습니다.

Unity 6000.0.23f1 컴파일 및 Editor 검증 56개 통과. 실제 장비 연동과 제품 통합은 검증 범위에 포함하지 않습니다.

예제별 사용법과 검증 내용 ↗
다른 프로젝트 살펴보기 ↗