🔍 권장 확대/축소 비율: 80% ~ 125%
프로필 이미지

👨‍💻 박제영

상명대학교 컴퓨터과학전공 재학 중
컴퓨터 그래픽스 렌더링 분야와 Unity를 활용하여 2D/3D 개발하는 것에 관심이 많습니다.
OpenGL과 Unity 기반으로 다양한 프로젝트를 수행했습니다.

C++ & C# Unity 2D/3D Rest API React

👋 안녕하세요, 박제영입니다!

“평소 생각했던 그래픽을 제가 직접 구현해 현실로 만들고자 합니다.”

OpenGL 기반 렌더링부터 Unity 3D를 활용한 내비게이션 시스템까지 설계 및 제작하는 과정을 통하여,
애니메이션 적용, 사설 경로 탐색 & 향상된 3D 시각화 시스템 생성, 그리고 인터랙션 설계 분야를 경험했습니다.

🏫 학력 및 인적사항

📚 역량

항목내용
💬 개발 언어C++, C#, HLSL, Python
🖥️ 개발 환경Visual Studio 2022, Visual Studio Code
🔧 도구Unity 2D/3D, OpenGL, DirectX
💡 강점빠른 학습력, 코드 흐름 파악 능력, 인터랙션 설계, 원인 분석 및 조치 능력
👥 팀 프로젝트2회 진행

🧩 주요 프로젝트

🪨 'The Rolling Stone' 게임 (2025.04 ~ 2025.06)

C++, OpenGL, Bullet Physics, Skeletal Animation 기반 3D 물리 시뮬레이션 게임

'The Rolling Stone' 게임 미리보기
  • 본 행렬 프레임 최적화로 FPS 성능 향상
  • 물리 디버깅 함수 구현
  • 캐릭터-오브젝트 상호작용에 따른 자연스러운 애니메이션 동기화

코드 스니펫

⚙️ 메인 프레임 렌더링

// ======== 메인 렌더링 루프 ========
while (!glfwWindowShouldClose(window))
{
    // 1) 초당 프레임 계산
    float currentFrame = static_cast(glfwGetTime());
    if (!VSYNC && currentFrame - lastFrame <= frameTime) continue;
    deltaTime = currentFrame - lastFrame;
    lastFrame = currentFrame;

    // 2) 카메라 및 투영행렬 갱신
    glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom),
        (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT, 0.1f, frustum_far);
    glm::mat4 view = camera.GetViewMatrix();

    // 3) 물리 시뮬레이션 진행
    dynamicsWorld->stepSimulation(deltaTime);

    // 4) 플레이어 위치 갱신
    btTransform trans;
    characterBody->getMotionState()->getWorldTransform(trans);
    btVector3 btPos = trans.getOrigin();
    character->position = glm::vec3(
        btPos.getX(),
        btPos.getY() - gTotalColliderHeight * 0.5f + 0.05f,
        btPos.getZ());

    // 5) 사용자 입력 처리
    processInput(window, defaultAnimations, runAnimations);

    // 6) 충돌 상태 확인
    // ... // 지면 충돌, 슬로프 감지, 오브젝트 접촉 여부 등을 계산함

    // 7) 애니메이션 갱신
    glm::mat4 model = glm::mat4(1.0f);
    animator.updateAnimation(deltaTime);
    updateNodeTransformations(root, model);
    auto transforms = animator.getFinalBoneMatrices();

    // 8) 루트 렌더링
    renderNode(root);

    // 9) Line Debug & GUI
    // ... // ImGui 패널

    // 10) 프레임 마무리
    glfwSwapBuffers(window);
    glfwPollEvents();
}              
            

🛠️ 담당 역할: 물리 시스템 설계, 애니메이션 최적화, 로직 개선

🔗 깃허브 링크: 'The Rolling Stone' 게임 저장소

▶️ 시연 영상 보기 (유튜브)

🧭 톡앤고(Talk & Go): 3차원 상명대학교 캠퍼스 가이드 시스템 (2025.03 ~ 2025.09)

Unity 3D, Firebase, OpenAI API를 활용한 3차원 캠퍼스 내비게이션 시스템

캠퍼스 맵
Main Screen

📸 데모 하이라이트

회원가입

(1) 회원가입

로그인

(2) 로그인

경로 탐색 기능

(3) 길찾기(Go)

경로 시각화 기능

(3-1) 경로 시각화(Go)

챗봇 질의응답

(4) 챗봇 질의응답(Talk)


📁 시스템 개발 개요

시스템 다이어그램

🔧 기술 세부 사항

  • Path Finder: 산악 지형 기반의 경로 탐색 시스템(두 개의 NavMesh & 사설 Dijkstra 알고리즘)
  • Path Visualizer: 사설 클래스 "LineDebugger" 를 활용한 경로 시각화 시스템
  • 첫 NavMesh 탐색 후: 다음 NavMesh에서 특정 코너 오브젝트 간 통과 여부 판별 및 가상 벽 생성, 우회 경로 도출
  • ChatGPT 기반 대화형 질의응답 시스템 설계
  • Firebase를 활용한 회원가입 및 로그인 기능 구현, 챗봇 질의응답 로그 저장 및 불러오기 기능 구현


코드 스니펫

두 개의 NavMesh

Dijkstra

// ================= PATH3 (Dijkstra)=================
public List<Vector3> Dijkstra(string startNode, string endNode)
{
    Dictionary<string, float> distances = new();
    Dictionary<string, string> previous = new();
    List<string> unvisited = new(nodes.Keys);

    foreach (var node in nodes.Keys)
        distances[node] = float.MaxValue;
    distances[startNode] = 0;

    while (unvisited.Count > 0)
    {
        // 1. 현재까지 거리 중 최소 노드 선택
        string current = unvisited.OrderBy(n => distances[n]).First();
        unvisited.Remove(current);

        // 2. 목적지 도달 시 종료
        if (current == endNode)
            break;

        // 3. 인접 노드 탐색
        foreach (var neighbor in nodes[current].neighbors)
        {
            float alt = distances[current] + Vector3.Distance(
                nodes[current].position, nodes[neighbor].position);

            if (alt < distances[neighbor])
            {
                distances[neighbor] = alt;
                previous[neighbor] = current;
            }
        }
    }

    // 4. 최단 경로 역추적
    List<Vector3> path = new();
    string nodeTrace = endNode;
    while (previous.ContainsKey(nodeTrace))
    {
        path.Insert(0, nodes[nodeTrace].position);
        nodeTrace = previous[nodeTrace];
    }
    path.Insert(0, nodes[startNode].position);

    // 5. 시각화
    pathLineDrawer3.DrawPath(path);
    UIDebugTextAnimator.Instance.debugTextMsg.text = "Dijkstra Path Complete";
    UIDebugTextAnimator.Instance.AnimateAll();

    return path;
}
            

🛠️ 담당 역할

  • Unity: 사용자 인터페이스 개발, 로직 담당
  • Firebase: 회원가입 및 로그인 기능 구현, 챗봇 질의응답 로그 저장 및 불러오기
  • Full-stack Web: Django와 Firebase 간 연동, Django와 Unity 간 연동 진행

✨ 특이사항

  • Unity WebGL: Firebase SDK를 지원받지 못 해 연동을 위해 Django를 중간 매개체로 하여 Rest API를 통해 Firebase ↔ Unity 연동 진행

🔗 깃허브 링크: 대학교 캠퍼스 맵 3차원 내비게이션 시스템 저장소

🧠 AI 프로젝트 / 컴퓨터 비전

📷 NPU(신경 처리 장치) 내장형 에지 카메라 기반의 실시간 사람 탐지 (2024.07 ~ 2024.09)

NPU(Neural Processing Unit) 칩이 탑재된 에지 카메라YOLOv5s 모델 경량화 및 포팅 수행

NEF 파일 변환 로그
실시간 추론 결과
  • 경량화 과정: PyTorch(.pt) → ONNX(.onnx) → Kneron Toolchain WebGUI를 통한 경량화 → 이진 파일로서 NEF(.nef) 최종 변환
  • 경량화된 YOLOv5s 모델을 카메라 보드에 포팅하여 실시간 사람 감지 구현
  • 제한된 연산 환경에서 비전 모델의 효율적 동작 검증

코드 스니펫

PyTorch → ONNX 변환 및 최적화

🛠️ 담당 역할: 모델 경량화, 포팅, 실시간 인퍼런스 검증

🌐 개발 환경: PyTorch 1.7.1+cu110 · TorchVision 0.8.2 · ONNX 1.13.0 · Docker Desktop 4.30.0 · Kneron Toolchain WebGUI · KL630 NPU · PuTTY 0.83 · VLC 3.0.20

✨ 특이사항: 회사 내부 매뉴얼을 기반으로 진행된 프로젝트로, 보안상의 이유로 아이디 및 인물 정보를 모두 모자이크 처리

🎮 작은 프로젝트

⚽ #1 3D 공 굴리기 수집 게임 (2025.02.02 ~ 2025.02.12)

Unity 3D 기반 GoldMetal 튜토리얼을 바탕으로 제작한 3D 미니게임

3D 공 굴리기 게임 미리보기
  • 아이템 트리거 기반 3차원 점프 로직 및 물리 시스템 적용
  • 2차원 스프라이트를 활용한 사용자 인터페이스 구현
  • 총 3개의 서로 다른 씬 구조를 활용한 단계별 게임 구성

🎮 게임 요약

  • 조작키와 함께 공을 굴리며 아슬아슬한 발판 위를 이동하여 모든 아이템을 수집하는 게임 (조작키: W, A, S, D)
  • 파란 아이템은 일반 수집용이며, 노란 아이템은 일회성 2단 점프 기능을 제공
  • 모든 아이템을 수집하지 못 하면 최종 지점에 도달하더라도 게임 재시작

🛠️ 담당 역할: 단독 개발

🔗 깃허브 링크: 3D 공 굴리기 수집 게임 저장소 (깃허브)

📝 노션 링크: 3D 공 굴리기 수집 게임 노트 (노션)

🎯 #2 2D 코인 먹기 게임 (2025.02.16 ~ 2025.03.15)

Unity 2D 기반 GoldMetal 튜토리얼을 바탕으로 제작한 소규모 2D 게임

2D 코인 먹기 게임 미리보기
  • 아이템 트리거 기반 2D 점프 로직과 물리적 콜라이더 적용
  • 2차원 스프라이트를 활용하여 사용자 인터페이스 구현
  • 총 3개의 서로 다른 장면 구조를 활용하여 단계별 게임 구성

🎮 게임 요약

  • 방향키 조작과 함께 적을 피해 서로 다른 종류의 코인을 수집하는 게임
  • 포션은 총 4종류로 구성되며, 각각 다음과 같은 효과 제공
    - 빨간 포션: 체력 1칸 회복
    - 초록 포션: 일회성 2단 점프
    - 파란 포션: 일정 시간 점프력 증가
    - 노란 포션: 일정 시간 투명 효과
  • 포탈은 총 2종류로 구성되며, 각각 다음과 같은 효과 제공
    - 빨간 포탈: 연결된 다른 포탈의 위치로 순간이동
    - 검은 포탈: 다음 스테이지로 이동
  • 주어진 시간 내에 넓은 스테이지를 탈출하세요!

🛠️ 담당 역할: 단독 개발

🔗 깃허브 링크: 2차원 코인 먹기 게임 저장소 (깃허브)

📝 노션 링크: 2차원 코인 먹기 게임 노트 (노션)