레이블이 가상현실인 게시물을 표시합니다. 모든 게시물 표시
레이블이 가상현실인 게시물을 표시합니다. 모든 게시물 표시

2024년 10월 7일 월요일

Three.js 이용한 web3d 프로그램 개발하기

이 글은 웹 기반 3D 그래픽 라이브러리로 거의 표준적으로 사용되고 있는 three.js를 간략히 소개한다. 아울러, 이를 이용한 web3d 프로그램 개발하는 방법을 간략히 정리한다.
three.js 예제

개요
Three.js는 웹 브라우저에서 3D 그래픽을 쉽게 만들고 렌더링할 수 있도록 도와주는 자바스크립트 라이브러리다. WebGL을 기반으로 작동하며, 복잡한 3D 그래픽 처리를 단순화해준다.

Scene (장면)
장면은 Three.js에서 3D 객체들이 배치되는 공간이다. 카메라, 조명, 메쉬와 같은 객체들이 장면에 추가되며, 이 장면을 렌더링하여 화면에 표시하게 된다.

Camera (카메라)
카메라는 장면을 바라보는 시점을 결정하는 객체다. Three.js에서 일반적으로 많이 사용하는 카메라는 원근법을 적용하는 PerspectiveCamera와 직교 투영을 사용하는 OrthographicCamera가 있다.

Renderer (렌더러)
렌더러는 장면을 렌더링해 브라우저의 캔버스에 표시하는 역할을 한다. Three.js에서는 주로 WebGLRenderer를 사용하여 장면을 화면에 출력한다.

Mesh (메쉬)
메쉬는 3D 장면에서 실제로 보이는 객체를 나타낸다. Geometry(기하학적 형태)와 Material(재질)로 구성되며, Geometry는 객체의 모양을 정의하고, Material은 객체의 표면이 어떻게 보일지를 결정한다.

Light (조명)
조명은 장면 내 객체에 빛을 비추는 역할을 한다. 다양한 유형의 조명이 있으며, 예를 들어 PointLight는 특정 지점에서 모든 방향으로 빛을 발산하고, DirectionalLight는 태양처럼 일정한 방향으로 빛을 비춘다.

Three.js를 사용하면 웹에서 고성능 3D 그래픽과 애니메이션을 구현할 수 있으며, 비교적 간단한 코드로도 복잡한 장면을 만들 수 있다.

상세한 내용은 다음 튜토리얼을 참고한다.

개발 방법
이 예제는 간단한 3D Cube를 웹에 렌더링하는 프로그램이다. 
<html>
   <head>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>3D viewer</title>
   </head>
   <body>
      <div id="model-view" style="width: 350px; height: 350px"></div>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/loaders/OBJLoader.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/loaders/MTLLoader.js"></script>  
      <script>         
         const model_container = document.getElementById('model-view');

         const model_scene = new THREE.Scene();
         const model_camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
         const model_renderer = new THREE.WebGLRenderer();
         model_renderer.setSize(model_container.clientWidth, model_container.clientHeight);
         model_renderer.setClearColor(0xADD8E6);  
         model_container.appendChild(model_renderer.domElement);

         const model_light = new THREE.PointLight(0xffffff, 1, 100);
         model_light.position.set(10, 1, 5);
         model_scene.add(model_light);

         function make_cube() {
            const geometry = new THREE.BoxGeometry();
            const material = new THREE.MeshBasicMaterial({ color: 0x00aa00, wireframe: true });
            const cube = new THREE.Mesh(geometry, material);
            model_scene.add(cube);
            return cube;
         }
         model_cube = make_cube();

         model_camera.position.set(2, 2, 2);
         model_camera.lookAt(0, 0, 0);

         function animate() {
            requestAnimationFrame(animate);

            model_cube.rotation.x += 0.01;
            model_cube.rotation.y += 0.01;
            model_renderer.render(model_scene, model_camera);
         }
         animate();

         window.addEventListener('resize', () => {
            model_camera.aspect = window.innerWidth / window.innerHeight;
            model_camera.updateProjectionMatrix();
            model_renderer.setSize(window.innerWidth, window.innerHeight);
         });         
      </script>
   </body>
</html>

실행하면, 간단한 3D cube 모델이 웹페이지에 렌더링 될 것이다.
마무리
Three.js는 Ricardo Cabello(Mr.doob)라는 개발자가 2010년에 처음 개발했다. Cabello는 원래 그래픽 디자이너이자 개발자로 활동했으며, WebGL을 더 쉽게 사용할 수 있는 라이브러리가 필요하다고 생각해 Three.js를 만들었다. 이후 Three.js는 오픈 소스로 공개되어 많은 개발자들의 기여로 지속적으로 발전해왔다.

레퍼런스

2021년 9월 6일 월요일

메타버스 개발 도구 Mozilla Hubs 사용기

이 글은 메타버스 개발 도구 Mozilla Hubs 사용 방법을 간략히 나눔한다.


이 도구는 편집기를 통해, 3차원 가상세계를 모델링할 수 있다. 아래를 클릭한다.
그럼 다음과 같은 편집기 화면을 통해, 모델 추가, 편집, 동작 등을 만들 수 있다.



2019년 9월 3일 화요일

공간 맵핑용 스테레오 이미지 센서 ZED 사용기

이 글은 간단한 RGBD 이미지 센서 ZED 사용기이다. 이 글에서 ZED를 동작시키기 위해 NVIDIA NANO를 사용하였다. NVIDIA NANO 설정에 대해서는 이 링크를 참고 바란다.

소개
ZED는 비전을 위한 이미지 센서로 듀얼렌즈가 장착된 카메라이다. 고화질 3D 비디오를 캡쳐할 수 있고, 깊이 인식이 가능하다. 이 카메라는 스테레오 비전 기술을 사용한다. 그러므로, 적외선 RGBD 방식에 비해 강한 햇빛에 큰 영향을 받지 않는다. ZED 센서의 특징(스펙)은 다음과 같다.
  • ZED 2는 최대 40m까지 스캔. ZED는 20m 범위에서 깊이 캡쳐 가능함. ULTRA 모드에서는 30m까지 가능함
  • 뎁스맵(depth map) 캡쳐 속도는 100 FPS(Frame per second0
  • 화각은 최대 90도(H) x 60도(V)
  • 센서는 실내외 및 실외에서 작동됨
  • 6DOF 지원
ZED 카메라 센서

ZED는 깊이 및 위치 추적시 ROS(Robot Operating System) 등을 사용한다. ZED의 이미지 처리와 소프트웨어 실행에는 많은 연산이 필요하므로, 보통, GPU가 장착된 임베디드 컴퓨터를 사용하는 것이 일반적이다. 임베디드 컴퓨터로는 NVIDIA의 NANO, TX2 등이 주로 사용된다.
NVIDIA NANO, TX2 성능 비교

ZED 홈페이지는 이 기기의 스펙과 활용 사례를 소개하고 있다. Getting Started 페이지에서는 ZED를 사용하기 위한 전반적인 내용을 요약 설명한다.

SDK 설치
다음 링크를 참고해 JetPack을 설치한다. JatPack은 NVIDIA 장치에 TensorRT, cuDNN, CUDA, VisionWorks, OpenCV를 손쉽게 설치해주는 개발도구 패키지이다. 참고로, 설치는 하루 이상 걸린다.
개발자를 위한 툴킷은 아래 링크에서 다운로드 받을 수 있다. NVIDIA NANO, TX2, TX1은 ZED SDK for Jetpack 버전을 다운로드 받아 설치한다. CUDA버전에 따라 설치해야 하므로, 미리 nvcc --version 명령으로 확인 후에 적당한 버전을 다운로드하도록한다. 참고로 CUDA가 설치되어 있다면, /usr/local/cuda/bin 에 nvcc파일이 있을 것이다.
ZED SDK 가 제대로 설치되었다면, 다음 폴더에서 실행파일을 확인할 수 있다.

이 중에 'ZED Diagnostic'을 실행해 ZED카메라가 정상동작하는 지 확인한다. 이상없으면 다음처럼 보일 것이다.

'ZED Explorer'를 실행하면 카메라 세팅에 따른 스테레오 이미지 확인 가능하다.

Depthmap 예제를 실행하면 스테레오 이미지에서 생성한 깊이맵을 확인할 수 있다.

SVOEditor를 실행하면, 공간맵핑된 메쉬를 확인할 수 있다.

SDK 기반 개발
ZED SDK를 이용한 개발은 ZED에서 제공된 Tutorial, 예제를 활용해 진행한다. 다음 github 에서 공간맵핑 소스코드를 다운로드 받는다.
그리고, 다음과 같이 빌드한다.
mkdir build
cd build
cmake ..
make

생성된 실행파일을 실행하면 다음 결과를 확인할 수 있다.

생성된 obj파일은 메쉬 파일이므로, 이를 보기 위해 다음과 같이 meshlab을 설치한다.
sudo apt-get install meshlab

meshlab을 실행해 생성된 obj파일을 로딩하면 다음과 같이 포인트 클라우드를 확인할 수 있다. 역시 생성된 데이터 결과물은 LiDAR와 같은 거리센서에 의해 얻어진 결과물에 비해 정확도가 낮다.
meshlab

핵심적인 소스코드 설명은 다음과 같다. 

#include <sl/Camera.hpp>
using namespace sl;
Mesh map;

Camera zed; 
SpatialMappingParameters spatial_mapping_parameters;

zed.enableTracking();

mapping = false;
while(scanningFlag)
{
  // GPU 메모리 내 이미지 검색
  zed.retrieveImage(image, VIEW_LEFT, MEM_GPU);

  // 공간 맵핑 비동기 요청 
  if(mapping)
  {
    if(zed.getSpatialMapRequestStatusAsync() == SUCCESS)
      zed.retrieveSpatialMapAsync(map);
  }

  if(mapping == false)
 {
    // 위치 추적 리셋
    Transform init_pose;
    zed.resetTracking(init_pose);
 
    // 공간맵핑 설정   
    parametersspatial_mapping_parameters.resolution_meter = SpatialMappingParameters::get(SpatialMappingParameters::MAPPING_RESOLUTION_MEDIUM);
    spatial_mapping_parameters.use_chunk_only = true;
    spatial_mapping_parameters.save_texture = false;
    spatial_mapping_parameters.map_type = SpatialMappingParameters::SPATIAL_MAP_TYPE_MESH;

    // 공간 맵핑 활성화
    zed.enableSpatialMapping(spatial_mapping_parameters);
    viewer.clearCurrentMesh();
    mapping = true;
  }
  else 
  {
    // 생성된 공간 맵 추출
    zed.extractWholeSpatialMap(map);
    MeshFilterParameters filter_params;
    filter_params.set(MeshFilterParameters::MESH_FILTER_MEDIUM);
                    
    // 메쉬 추출 필터 설정
    map.filter(filter_params, true);
    if(spatial_mapping_parameters.save_texture)  // 텍스처 저장 옵션 설정
      map.applyTexture(MESH_TEXTURE_RGB);

    // obj mesh 파일 저장
    string saveName = getDir() + "mesh_gen.obj";
    bool error_save = map.save(saveName.c_str());
  }
}

ROS 기반 개발
ROS기반에서 실시간 깊이 데이터 취득 및 시각화를 위해서 다음 링크를 참고해 ROS 및 관련 패키지들을 설정 및 빌드한다.
빌드 과정
ZED 파라메터에 대한 설명은 다음 링크를 참고한다. 파라메터는 ROS catkin_ws 폴더의 src/zed-ros-wrapper/zed_wrapper/params/common.yaml 에 저장되어 있다.
빌드 후 다음 명령을 실행하면, Stereo image, Depth map 기능이 수행된다.
roscore
roslaunch zed_wrapper zed.launch frame_rate:=30
Stereo image(rqt_image_view)
Depth map(rqt_image_view)

다음 명령을 실행하면, ZED ROS node들과 ROS Viz 가 수행된다. 만약, 카메라 이미지가 갱신되지 않는다면, RViz의 설정 중 Camera > Unreliable 를 off해 보길 바란다(기타, Point cloud issue 는 여길 참고하길 바란다).
killall -9 roscore
killall -9 rosmaster
roscore
roslaunch zed_display_rviz display_zed.launch
ZED Image(RViz)

이제, 다음 명령으로 포인트 클라우드 토픽을 확인해 보자(참고).
killall -9 roscore
killall -9 rosmaster
roscore
roslaunch zed_wrapper zed.launch
rosrun rviz rviz
Point cloud(RViz)

결과화면과 같이 포인트 클라우드 토픽이 잘 생성되는 것을 확인할 수 있다.

활용 예제
예제를 실행하려면, 2가지 방법이 있다. 설치된 SDK의 Samples 폴더에 각 예제들은 cpp, python 버전이 있다. 
cpp는 cmake, make 명령을 이용해 빌드해 사용한다. cmake 파일이 있는 폴더에서 다음 명령을 이용해 소스코드를 빌드하고 실행한다. 
mkdir build
cd build
cmake ..
make


파이썬의 경우 다음과 같이 도구를 설치하고 실행한다(참고).
sudo pip install --upgrade pip setuptools wheel
sudo pip install opencv-python 
sudo pip install PyOpenGL

예제 실행 결과는 다음과 같다. 
평면 검출
네트워크 영상 스트리밍(sender - receiver)
실시간 카메라 위치 추적
실시간 스캔 및 3차원 공간 모델 구성
스테레오 비전 SVO 포맷 저장 및 변환(SVO recording - repair - export)
뎁스맵 변환
실시간 3차원 포인트 클라우드 생성

ZED는 SVO파일에 스테레오 이미지, 3차원 변환을 위한 정보 및 IMU와 같은 메타데이터까지 저장하고, 이를 통해 다양한 작업을 할 수 있다(참고 - Using the Video API, Compression ModesSensors OverviewHow do I recalibrate my ZED stereo camera?, ZED Calibration). 

마무리
ZED는 스테레오 이미지를 이용해 깊이 맵을 얻는 방식으로, 공간 맵핑과 관련된 다양한 예제를 제공한다. 단, 직접 거리를 측정하는 방식이 아니므로, 정확도 문제가 있다. 키넥트와 같은 적외선 주사방식이 아니기 때문에 야외에서 깊이 맵을 얻을 수 있고, NVIDIA Jetson과 호환성이 좋아, 괜찬은 처리 성능을 보인다. 
좀 더 자세한 사용방법은 다음 예제를 참고하길 바란다.

2019년 7월 20일 토요일

가상현실 2세대 기술 - 오큘러스 퀘스트 설치, 사용 및 개발

드디어 오큘러스 퀘스트가 2019년 5월 국내 출시되었다. 그 동안 불편했던 VR 장비에 비해 얼마나 개선되었는 지, 실제 응용에 사용할 만 한지 확인해 보기 위해 테스트를 해 보았다. 이 글은 오큘러스 퀘스트 설치, 사용 및 가상현실 앱 개발에 관한 내용을 간략히 요약한다.

오큘러스 퀘스트, 더이상 필요없는 전선들(How many VR rooms can you save in Oculus Quest)

장비 특징
오큘러스 퀘스트는 2세대 VR기기로 다음과 같은 제약조건을 없애버려 VR 편의성을 높였다.
  • 무선 VR 데이터 스트리밍 지원. 컴퓨터와 HDMI, USB 로 연결된 매우 번거로운 선들이 없음. 
  • 추적 센서 설치 필요 없음. HMD에 내장된 자이로 센서와 카메라로 주변 공간을 인식.
  • 스마트폰 앱을 통한 VR 설정과 설치. 불편하게 컴퓨터에서 VR 룸 등을 설정할 필요 없음.
  • HMD에 앱이 설치됨. 앱이 설치된 컴퓨터를 들고 다닐 필요가 없음. 
  • VR 방 크기(룸스케일. room scale) 설정이 편하고 제약이 많이 사라짐.
  • 어지러움이 기존 VR 장치에 비해 덜함.
  • HMD가 가벼워 머리를 크게 압막하지 않음.
  • HMD 장비 충전 방식임
  • 스마트폰 앱과 페어링해 화면 미러링을 지원함. HMD가 보는 화면을 앱을 통해 같이 볼 수 있음.
  • HTC VIVE와 같은 고가 VR장비에 비해 가격이 저렴함.
HTC VIVE가 1세대 VR 장치로 훌륭한 개념을 보여줬기 때문에, 많은 사람들이 대안 없이 사용하였으나, 이 장비를 사용해 보면 VIVE가 구식으로 느껴질 만큼 설정이 크게 편해 졌다. 몇년만에 크게 발전했다. 참고로, 다음 링크는 VIVE를 건축이나 BIM에 활용하고자 테스트해 보았던 결과이다.
이외에 다양한 장점이 있다. 현재 출시된 앱이 얼마 되지 않지만, 이 부분은 곧 좋아지리라 생각한다.
소개 영상
장비 구성
장비는 HMD 본체, 두개의 컨트럴 및 아답터로 단순하게 구성되어 있다. 

HMD는 전면 4개 카메라에서 얻은 이미지를 비전기술을 통해 주변 공간을 인식한다. 아울러, HMD 장착 후 룸 스케일 설정 시 카메라 센서를 이용해 증강현실로 주변 상황을 보여준다. 
룸스케일 설정 시 증강현실 기능 

장비 설정 방법
설정은 스마트폰와 자체 HMD에서 진행된다. 스마트폰 앱에서 Oculus를 검색해 설치한 후, 계정을 만들고, 지시대로 따라하면 된다.
설정 방법 영상
설정 순서는 크게 다음과 같다.
  1. 스마트폰에 Oculus 앱 다운로드 설치
  2. Oculus 로그인 및 계정 설정(신용카드 등)
  3. HMD 전원 연결 및 켜기
  4. 스마트폰 앱과 페어링
  5. HMD 업데이트
  6. HMD 룸스케일 설정

룸스케일(방크기 및 경계) 설정 후 보이는 그리드

설정 후 장비 튜토리얼 앱이 실행되며, 자체 앱 스토어를 통해 손쉽게 다양한 앱을 다운로드 받아 실행할 수 있다. 컨트롤러나 HMD 반응 속도는 훌륭하며, 멈춤이나 끊어짐이 전혀 없다. 앱 다운로드 시간은 좀 오래걸리나 다운로드 예약되기 때문에 크게 불편하지는 않다.
실행된 앱

기술적 특징
오큘러스 퀘스트는 주변과 HMD의 위치, 방향을 계산하기 위해 비전 기술을 적극적으로 활용했다. 이런 이유로 VR 장비 중 사용 시 자유도와 룸스케일을 극대화했다. 설정된 룸은 저장되어 공간이 바뀌면 다시 로딩할 수 있다. 이런 기술은 기존 장비에서 할 수 없었던 응용을 가능하게 해준다. 
예를 들어, 어떤 사람은 지하주차장의 넓은 공간을 VR 룸스케일로 사용한 사례를 공개했다. 
지하 주차장 룸스케일
룸스케일 최대 크기 테스트 영상

물론 무선으로 앱을 HMD에 설치하여 장비에서 자체적으로 실행되기 때문에, 선도 필요없어, 유저가 점프를 하거나 뛰어 다닐 수 있다. 

VIVE의 경우 바닥을 설정할 때도 장비를 내려놓거나 하는 등의 동작이 필요했지만, 오클러스는 비전으로 이런 부분을 모두 해결한다. 장비 앞에 부착된 4개의 카메라 센서로 공간을 인식해 공간 스케일이나 장애물 정보를 얻는다. 
비전을 이용한 주변 공간의 포인트 클라우드 획득(Oculus Quest review, poppr.be, 2019.5)

참고로, 장비는 충전식이며, 충전을 하면 최소 몇 시간은 사용할 수 있다. 

개발 방법
오큘러스 퀘스트는 유니티 등 개발 도구를 이용해 손쉽게 앱을 만들 수 있다. 개발 방식은 기존 VR 앱 개발과 유사하다. 이에 대한 상세한 내용은 다음 링크에 잘 설명되어 있다.
다음은 이와 관련된 튜토리얼이다.
VRTK 빌드 및 셋업

마무리
오큘러스 퀘스트를 테스트해 본 결과 모든 부분이 기존 VIVE를 뛰어넘는 듯 하다. 앱이 부족하나 이 부분은 앞으로 크게 문제되지 않을 듯 하다. 번거로운 데이터, 전원 선들이 없어졌고, 무선 방식 앱 설치 후 충전된 장비를 간편하게 들고 다니며 VR을 사용할 수 있다. 비전 기술을 사용해 어떤 장소에서도 룸 스케일을 사용할 수 있다.

오큘러스가 그동안 뒤져 있던 VIVE보다 뛰어난 기술을 구현하기 위해 많은 노력을 한 것이 보이는 장비였다. 혼합 현실 장비의 대표주자인 마이크로소프트 홀로렌즈도 이렇게 개선되면 유용할 듯 하다.




2017년 9월 21일 목요일

BIM VR 모델 뷰어 개발 방법 및 HTC VIVE VR 장단점

몇 년사이에 저렴하고 현실적인 VR기기와 SDK(Software Development Kit)가 출시되면서, BIM과 같은 엔지니어링 분야에도 VR기술이 응용되고 있다. 오늘은 이 기술에 대해 좀 더 깊은 이해를 위해 가상현실(VR. Virtual Reality) 기반 BIM 모델 뷰어 개발 방법을 간략히 요약해 설명한다. 아울러, 활용한 VR기술의 장단점과 BIM과 같은 엔지니어링 분야에 VR기술 적용 시 고려사항을 나눔해 본다.

오토데스크 Revit Live 

1. VR 환경 설정
HTC VIVE(바이브)는 오큘러스 리프트와 같은 VR 장비이다. 가격은 100만원대 초중반이다. VIVE 사이트 메뉴얼에서 알려주는 대로 따라하면 설치하기 그리 어렵지 않다. 홈페이지에 방문해 'VIVE 설정 다운로드' 버튼을 클릭해 프로그램 설치하며 따라하면 된다.

VIVE 설치 단계를 요약하면, 장비를 컴퓨터와 연결하고, HTC VIVE 사이트 및 STEAMVR 사이트를 가입한 후, VIVE 관련 설치파일을 다운로드해 설치해, VR 스페이스 크기 등을 설정한다. 따라하기 어렵다면, 아래 영상을 참고하기를 바란다.
바이브 설정 방법 가이드 영상
 VR 장비 설정
VR room 경계 설정

참고로, 설정 과정에서 몇 가지 문제가 있을 수 있는 데, 대부분 다음과 같은 경우이다.
  1. 바이브에서 지원하지 않는 그래픽카드 인 경우: 참고로 본인 컴퓨터에 설치된 NVIDIA GPU의 경우는 큰 문제가 없었다.
  2. GPU 활성화가 되어있지 않은 경우: VIVE의 Steam 실행 전에 반듯이 GPU 활성화되어 있어야 한다.
  3. 디스플레이 창 모드가 확장 모드가 아닌 경우: 확장 모드로 전환해야 한다. 
  4. 기타: 컴포지터(compositor) 400에러 등 그래픽 출력 모드와 관련된 에러가 발생되는 경우가 많다. 각 에러마다 SteamVR 프로그램 창에 에러 번호가 표시된다. 번호를 구글링하면 해결하는 방법이 나와 있어, 그대로 따라하면 처리 된다. 
VIVE 설정이 제대로 되었다면, SteamVR을 실행하였을 때 다음과 같은 화면을 볼 수 있다.

VIVE 프로그램에서 지시하는 데로, VR 설정을 성공한 후에는 다양한 VR앱을 설치하고, 다른 세계를 포털로 여행할 수 있게 된다. 


2. Simple BIM 모델 뷰어 개발
1. BIM 모델 준비
VR에 BIM 모델을 띄우기 위해 Revit에서 RAC BIM 모델과 Sketchup 에서 구한 3차원 도시 모형을 미리 준비하였다. 이 모델을 FBX과 DAE 모델로 각각 변환하였다.

파일 변환 및 모델을 유니티에 추가하는 방법은 아래 글을 참고하길 바란다.
2. VR BIM 앱 개발
VR기반으로 모델을 띄우기 위해 유니티를 사용한다. 개발 방법은 다음 가이드 영상을 참고한다. 
HTC VIVE 기반 개발 튜토리얼(유니티 엔진)
언리얼(Unreal) 엔진 기반 VR 개발 튜토리얼

이 글에서는 유니티 기반으로 VR 앱을 개발한다. 튜토리얼에서 설명하는 VIVE 앱 개발 순서는 다음과 같다. 
1) 우선 유니티에서 SteamVR Plugin을 다운로드 받아 설치한다.

2) BIM 모델 FBX 및 DAE파일을 유니티에 추가한다.

3) 플레이 버튼이나 Build&Run 메뉴를 실행하면, 바이브에서 VR기반으로 BIM 모델을 관찰할 수 있다. 

4) 만약, 건축 모델과 상호 동작을 하고 싶다면, 기존에 Steam에 설치된 스크립트(C#)을 사용하거나, 다음과 같이 유니티 객체에 스크립트를 새로 만든 후, 원하는 명령을 입력해 컨트롤러나 모델에 적용한다. 
SteamVR에서 제공되는 스크립트 예제
Visual Studio 에서 스크립트 개발

3. 결론
간단한 BIM 뷰어를 VR기반으로 개발해 보았다. 바이브는 오큘러스 리프트 DK 버전을 사용할 때 보다 다음과 같은 장점이 있다. 
  1. 넓은 공간(5미터)을 커버하는 VR장치 추적기와 편리한 설치
  2. 편리한 VR 앱 지원 및 개발 플랫폼과 수많은 VR앱 
  3. 좀 더 가벼워진 HMD
  4. 편리한 개발환경 
특히, 2년전 사용해 보았던 오큘러스 리프트보다 넓은 공간 인식, 좀 더 가벼워진 HMD, 좀 더 정리된 배선, 덜 민감해진 GPU 및 디스플레이 설정 등은 크게 마음에 들었다. 물론 아직까지 다음과 같은 단점은 남아 있다. 참고로 이런 문제들는 기존 오큘러스 리프트도 동일하게 남아 있다.
  1. 고성능 GPU 필요함
  2. 아직은 불편한 HMD
  3. 렌즈 초점 맞추기 어려움
  4. 3차원 어지러움
  5. 픽셀이 보이는 낮은 해상도
  6. 가끔식 발생하는 GPU 및 디스플레이 에러
  7. 장치와 컴퓨터에 연결되는 전선들이 너무 많아 불편함. 무선 지원이 필요함
VR장비도 홀로렌즈 MR과 마찬가지로 개선해야 할 점이 아직 많이 남아 있다. 특히, BIM과 같은 엔지니어링에 필요한 모델을 연계할 경우, 다양한 부분을 신경써야 한다. 간단하게, VR BIM 뷰어 앱을 개발해 보았으나, 다음과 같은 기능은 하나 하나씩 구현해야 한다.
  1. IFC 등 BIM 모델 직접 로딩 및 뷰어 지원
  2. BIM 속성 확인, 필터 및 검색 지원
  3. BIM 모델 정보 수정
  4. BIM 모델 정보 분석
  5. BIM 모델 시뮬레이션
  6. BIM 서버 지원 및 연계
  7. 대용량 BIM 모델 경량화
  8. 이기종 데이터(지형 등) 모델 연계, 로딩 및 가시화
  9. 네트워크 기반 협업 지원
  10. 이외에 BIM 디자인, 시공 간섭 체크 등 다양한 유스케이스에 대한 기능 지원 등 
현재는 VR 기술이 인테리어, 공간 배치, 가상 하우스 모델 등에 활용되고 있으나, 기술이 발전되면, 더욱 많은 활용 사례가 나오리라 예상된다.