Unduck 게임의 패스스루환경과 사물 인식은 완료해서 MR 환경을 맞추었다.

그래서 이를 이용한 MR 게임을 만드려 보려고 했다.

 

이럴수가.. Depth API를 활용한 모습을 보고 당연하게 MR 스테이지에 있는 종이학을 쉐이더를 넣으면 적용 될 줄 알았다.

Meta Quest2가 구 하드웨어라 이용할 수 없었다.............

 

그래도 포기 할 수 없어서 여러 방법을 찾아보았다.

비슷하게나마 구현 할 수 있도록 나는 생각했다. 결국에 얼추 비슷한 기능을 만들 수 밖에...

 

1. 가구 뒤에 오브젝트가 안보이면 된다.

2. 가구에 뭔가 설정을 해줘야 한다.

3. 종이학의 렌더러를 껐다 켜야한다.

 

이런 식으로 진행하려고 한다.

먼저 Quest2가 바라보는 화면은 카메라 시점이기 때문에 종이학(단서)가 가구 뒤에 있으면 안보이게 해야 했기때문에

카메라에 방향에 맞는 레이캐스트를 활용해줬다. 이때 레이캐스트는 "Wall" 이라는 태그를 가진 collider와 충돌하게 되면 그 종이학의 렌더러를 꺼주면 되는것이다.

그나저나 왜 Wall이냐.. 원래 벽만 설정하면 되는줄 알았지만 Wall로 가구들의 태그를 퉁쳐버리자... 그랬더니 확실하게 앞에 가구가 있으면 오브젝트는 보이지 않게 된다.. Depth API처럼 손가락 사이사이로 안보이게 하고 싶었지만 아직은 능력부족이다. 얼추 비슷하게나마 이 문제를 해결하여 몰입감을 더 느끼게 할 수 있었다..
만든 소스 코드는 아래와 같다.

using UnityEngine;

public class ObjectVisibilityController : MonoBehaviour
{
    public GameObject danseo;
    private Transform cameraTransform;

    void Start()
    {
        cameraTransform = GameObject.Find("OVRCameraRig/TrackingSpace/CenterEyeAnchor").transform;
    }

    void Update()
    {
        RaycastHit hit;
        Vector3 directionToObject = (danseo.transform.position - cameraTransform.position).normalized;

        if (Physics.Raycast(cameraTransform.position, directionToObject, out hit))
        {
            if (hit.collider.CompareTag("Wall"))
            {
                MeshRenderer renderer = danseo.GetComponentInChildren<MeshRenderer>();
                if (renderer != null)
                {
                    renderer.enabled = false;
                }
            }
            else
            {
                MeshRenderer renderer = danseo.GetComponentInChildren<MeshRenderer>();
                if (renderer != null)
                {
                    renderer.enabled = true;
                }
            }
        }
    }
}

 

'게임개발 > Unduck' 카테고리의 다른 글

Unity 와 Oculus Quest2 개발 환경 만들기  (1) 2024.05.07

1916: 최소비용 구하기 문제설명

 

1. A, B, C(버스 비용) 이라고 했을 때 최소 비용 구하기.

2. 마지막 줄에는 출발 노드가 정해짐.

3. 보통 이와 비슷한 도시와 도시를 이동하면서 출발과 도착노드가 케이스마다 다르므로 모든 정점의 거리를 구해야 함.

4. 이와 관련해서 다익스트라 알고리즘을 사용하여 최단 경로를 탐색해보기로 했음.

 

먼저 다익스트라 알고리즘에서 dist 벡터를 선언해주는데 보통 9억 이상의 수를 이용하여 INF를 나타낸다.

그래서 나는 #define INF 999999999 로 설정하여 dist 벡터를 채워주기로 하였다.

int N, M;

cin >> N >> M;
vector<vector<pair<int, int>>> city(N+1);
vector<int> dist(N + 1, INF);

N은 노드 개수, M은 엣지 개수라고 생각하자.

city는 우리가 계산하기 쉽게 N+1까지 설정했다. 여기서 나는 노드의 비용과 자식 노드를 넣고싶어서 pair를 사용하여 두개의 데이터를 넣을 수 있게하였다.

위에서 말했듯 dist의 값을INF로 채워주도록 했다.

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>>>  heap;

나는 MST나 다익스트라와 같은 알고리즘에서 최소 힙을 사용해서 푸는것이 편하기 때문에 우선순위큐를 오름차순으로 정렬하여 최소 힙을 만들어주었다.

 

그래서 데이터들을 각각 받아주고 아래와 같이 다익스트라를 실행시켜준다.

heap.push({ 0,st });

heap은 앞에 데이터를 가지고 정렬하기 때문에 비용을 first에 넣어주고 시작점을 먼저 힙에 넣어준다.

while (!heap.empty())
{
	auto node = heap.top();
	heap.pop();
	if (dist[node.second] < node.first) continue;

	for (auto a : city[node.second])
	{
		if (dist[a.second] > node.first + a.first)
		{
			dist[a.second] = node.first + a.first;
			heap.push({ dist[a.second],a.second });
		}
	}
}

1. 진행은 이와 같다. 힙이 다 없어질때까지 while문을 반복하면된다.

2. node에 힙에서 먼저 넣어준 노드를 가져오고 pop을 해준다.

3. 이미 저장되어있는 노드 까지의 비용보다 지금 까지의 노드 비용이 더크다면 그냥 무시한다.

4. 아니면 for문을 시작한다. 아까 힙에서 꺼내온 노드와 연결된 노드들을 모두 가져와서 그동안 지나왔던 비용과 연결된 노드의 비용을 더한 값이 기존에 있던 비용보다 낮다면 비용을 고쳐주고 그 노드를 heap에다가 push 한다.

5. 이렇게 모두 더해주게 되면 각 노드의 비용은 최소 값으로 들어가 있게된다.

 

전체 코드 내용은 아래와 같다.

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

#define INF 999999999

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	
	int N, M;
	
	cin >> N >> M;
	vector<vector<pair<int, int>>> city(N+1);
	vector<int> dist(N + 1, INF);
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>>>  heap;
	
	for (int i = 0; i < M; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		city[a].push_back({ c,b });
	}

	int st, ed;
	cin >> st >> ed;
	heap.push({ 0,st });

	while (!heap.empty())
	{
		auto node = heap.top();
		heap.pop();
		if (dist[node.second] < node.first) continue;

		for (auto a : city[node.second])
		{
			if (dist[a.second] > node.first + a.first)
			{
				dist[a.second] = node.first + a.first;
				heap.push({ dist[a.second],a.second });
			}
		}

	}
	cout << dist[ed];

	
	return 0;
}

공공데이터 포탈 오픈 API란?

 

 공공데이터란 공공기관이 만들어내는 모든 자료나 정보, 국민 모두의 소통과 협력을 이끌어내는 공적인 정보를 말합니다. 각 공공기관이 보유한 공공데이터 목록과 국민에게 개방할 수 있는 공공데이터를 포털에 등록하면 모두가 공유할 수 있는 양질의 공공데이터로 재탄생하게 됩니다.

 포털(공공데이터포털)이란 각 공공기관이 보유하고 있는 공공데이터를 하나로 통합 관리하는 창구 역할을 합니다. 국민에게 개방할 공공데이터가 모두 모여 있는 공간으로 누구나 공공데이터포털을 이용할 수 있습니다.

 

공공데이터 목록

공공데이터를 활용해 창업을 고민하고 있다면 공공데이터 목록에서 개방 가능한 공공데이터를 손쉽게 찾아볼 수 있습니다. 종류별, 내용별로 창업 비즈니스 모델에 활용할 수 있는 공공데이터 검색이 가능합니다.

 

공공데이터포털 사이트 주소

공공데이터 포털

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

오픈API 신청

 

공공데이터 포털 사이트 에서 오픈 API 항목을 살펴봅니다.

 

 

예를 들어 기상청 데이터의 API를 사용하고 싶을 때 아래와 같이 기상청을 검색후 오픈 API 탭을 클릭합니다.

기상청 검색 후 나오는 화면

 

 

 

오픈API글을 하나 누르게 되면 아래와 같은 화면이 나옵니다. 빨간색 동그라미가 쳐진 활용신청을 누르게 되면 신청서가 나오게 됩니다.

 

 

활용신청 버튼을 누르게 되면 활용목적을 적는 칸이 나오는데 상황에 맞는 목적에 체크를 하고 목적내용을 적어줍니다.

필요 시에는 첨부파일도 함께 첨부합니다.

 

 

필요한 데이터를 상세하게 체크해줍니다.

상세기능정보 선택 창

 

 

활용신청을 하게되면 자동승인 혹은 기관승인을 통해 개인API키와 승인완료된 주소를 확인 할 수 있게됩니다.

Unity Version: 2022.3.22f1
Oculus Quest2 Version: -----

 

Unity 와 Oculus Quest2의 초기 개발 환경을 맞추기 위해 아래와 같은 순으로 진행했다.

 

1. 유니티 다운로드

● Unity

 

다운로드

지금 Unity를 다운로드하고 전 세계적으로 가장 큰 인기를 누리는 2D/3D 멀티플랫폼 경험 및 게임 제작용 개발 플랫폼을 사용하세요.

unity.com

 

2. 유니티의 프로젝트 생성

New Project를 눌러 Project를 생성
VR 프로젝트 설정이 있지만 현재는 3D 프로젝트를 만들어서 개발한다.

3. 유니티 Assets 추가

● Oculus Integration Assets

 

Oculus Integration (Deprecated) | 기능 통합 | Unity Asset Store

Use the Oculus Integration (Deprecated) from Oculus on your next project. Find this integration tool & more on the Unity Asset Store.

assetstore.unity.com

유니티 안에서 오큘러스 퀘스트의 기능을 사용하기 위해 Oculus Integration Assets를 추가한다.

또한 유니티안 패키지에서 XR Interacton Toolkit도 다운 받는다.

Oculus Integration Assets을 다운받고 Project 창을 보게 되면 

Oculus 폴더가 생긴 것을 볼 수 있고 이 안에 Oculus - VR - Prefabs 순으로 들어가다보면 VR PlayerController, OVRCameraRig등 VR 컨트롤을 할 수 있는 Prefabs가 있는것을 알 수 있다.

 

4. 오큘러스 퀘스트 빌드 만들기

(1)유니티 좌측 상단에 있는 File - Build Settings에서 빌드 세팅을  Android로 바꾼다.

(2) Build Settings 에서 좌측 하단에 있는 Player Settings...를 클릭후 Player의 Other Settings를 클릭후 변경사항을 확인한다.

(3)  Graphics APIs 에서 Vulkan을 - 버튼을 눌러 삭제한다. (*Vulkan 드라이버는 모바일에서만 실행*)

(4) Minimum API Level을 Android 6.0 'Marshmallow' (API level 23)으로 변경한다.

(5) Edit - Project Settings - XR Plug-in Management 에서 Oculus를 체크 한다.

 

5. 빌드한 APK 파일 Oculus Quest2에 실행하기

 

(1) 개발자 등록하기

● 개발자 등록 사이트

 

Device Setup | Oculus Developers

 

developer.oculus.com

(2) Oculus Quest 개발자 모드 키기

Oculus Quest 2와 핸드폰 Ouclus 앱을 통해 Oculus Quest2의 개발자 옵션을 킨다.

(3) Meta Quest Developer Hub 다운로드

● Meta Quest Developer Hub Download Site

 

Oculus Developer Center | Downloads

 

developer.oculus.com

 

Github: https://github.com/rapidswap

 

rapidswap - Overview

rapidswap has 9 repositories available. Follow their code on GitHub.

github.com

 

 

공부 중인 언어: C, C++, C#

 

완성 프로젝트:
- Unduck_XR

- 중소기업 해외 진출 지원 사업을 통한 공공데이터 분석, 교육 빛 지원사업 개선 방안 제안 사이트

(관세청 공공데이터 활용・분석 장려상 수상)

 

현재 진행중인 프로젝트: IOCP 채팅, 온라인 게임 서버(C++ or C#)

+ Recent posts