Skip to main content

Show 3D space

Previous chapter recalls: Beginning

  • You learned how to initialize the environment.
  • And you wrote a code, though you don't know what it does, but you successfully finished loading and displaying a VR.
This chapter can learn to
  • Learn what is working.
  • Learn how the FiveProvider / FiveCanvas component works.

Preparatory work

Like the previous section, we create a new directory (src/1.displaying-workand corresponding html and js or ts files.

js or ts files can first copy the previous chapter.

src/1.displaying-work/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="data:;base64,iVBORw0KGgo=" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Displays space | Display a work</title>
<style>
* {
margin: 0;
padding: 0;
}
html,
body #app {
width: 100%;
height: 100%;
overflow: hidden;
}
</style>
</head>
<body>
<div id="app"></div>
<script type="module" src="./index"></script>
</body>
</html>
src/1.displaying-work/useWindowDimensions.js
import { ref, onBeforeUnmount } from "vue";

function useWindowDimensions() {
const width = ref(window.innerWidth);
const height = ref(window.innerHeight);

const listener = () => {
width.value = window.innerWidth;
height.value = window.innerHeight;
};

window.addEventListener("resize", listener, false);
onBeforeUnmount(() => {
window.removeEventListener("resize", listener, false);
});
return { width, height };
}
export { useWindowDimensions };
src/1.displaying-work/App.vue
<template>
<template>
<FiveProvider :work="work">
<FiveCanvas :width="width" :height="height" />
<ModeController />
</FiveProvider>
</template>

<script setup>
import { FiveProvider, FiveCanvas } from "@realsee/five/vue";
import { parseWork } from "@realsee/five";
import { ref } from "vue";
import { useWindowDimensions } from "./useWindowDimensions";
import ModeController from "./ModeController.vue";

const work = ref();
const workURL =
"https://vrlab-public.ljcdn.com/release/static/image/release/five/work-sample/07bdc58f413bc5494f05c7cbb5cbdce4/work.json";

fetch(workURL)
.then((response) => response.text())
.then((text) => (work.value = parseWork(text)));
const { width, height } = useWindowDimensions();
</script>
</template>
src/1.displaying-work/index.js
import { createApp } from "vue";
import App from "./App.vue";

createApp(App).mount("#app");

Start service npm run dev and jump to the current page "http://localhost:3000/src/1.displaying-work/index.html".

info

Please see your console. The port number will change due to your configuration and current port occupancy, please check the console output. If you use another development build tool, please start the service as required by your own development build tool.

What is Work

Then we pause the hand of writing the code. We come to understand some of the concepts and to rest assured that it is simple.

Work Introduction

We call athree-dimensional spacea Work. So a Work is described through a structure of json known as work.json. Work You can access it vialike the Open Platform Interface. It can also be used as static as this example.

Five provides a method for parseWork for parsing work.json, and then get work objects. Work work objects pass FiveProvider initialize scenes in initialize work attributes.You did the same in the previous chapter.

Use restrictions on work

You need to configure your security domain name and available timeof work data inRealsee Developer Center. Use Five SDK to verify this in the generation environment to protect developers and see data security.

The above restrictions will not be verified in the following cases, which is convenient for development and testing:

  • Domain named localhost
  • Domain named ip address, e.g. 127.0.0.1, 192.168.0.5, 172.30.2.0, 10.33.10.2, etc
  • Access in non-HTTP settings, e.g. file:// Protocol

work.jsondata samples and data description

You do not need to understand the contents of work.json may also use Live SDK. even if you know more about it, it is not a bad thing.

Click to view work.json
{
"_signature": "LLzk2WHDbRfzQ5R+v82uVQqAGWMPfvgQ05hTwxgWKGeXbTPKtoQ8eI6FmCxJjtVjQW+wuZmZfxpzXePv4MGrWidG/05i5RRSELlPLEFZN3qYPykJLEIYhg3Wtvr8XkOI8wdeMgV82CP4Hyi84k/W2g+S+HcFs5oXfbfbFXPL/Gs=",
"allow_hosts": ["*"],
"base_url": "https://vrlab-public.ljcdn.com/release/auto3dhd/9380ce27b46cbc5ba8d47fcf0e4c9e4f/",
"certificate": "-----BEGIN CERTIFICATE-----\nMIIEMzCCAhsCCQDYAS/7ATZRmTANBgkqhkiG9w0BAQsFADCBkzELMAkGA1UEBhMC\nQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWppbmcxFDASBgNVBAoM\nC2xpYW5qaWEuY29tMRAwDgYDVQQLDAdSZWFsc2VlMREwDwYDVQQDDAhIYXJkd2Fy\nZTElMCMGCSqGSIb3DQEJARYWbml1aGFpcWluZ0BsaWFuamlhLmNvbTAeFw0yMTA5\nMTAwNTIwMDBaFw0zMTA5MDgwNTIwMDBaMIGmMQswCQYDVQQGEwJDTjEQMA4GA1UE\nCAwHQmVpSmluZzEQMA4GA1UEBwwHQmVpSmluZzEQMA4GA1UECgwHUmVhbHNlZTEZ\nMBcGA1UECwwQUmVhbHNlZUFwcEdldHdheTEgMB4GA1UEAwwXYXBwLWdhdGV3YXku\ncmVhbHNlZS5jb20xJDAiBgkqhkiG9w0BCQEWFWRldmVsb3BlckByZWFsc2VlLmNv\nbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuv/y3Ezsy/wh3LCA8vomPbgI\nSO9iO5kyR+oAetklD+epMU6J/ZbvTDEomZxuS5iyyKGBupzAh2ZFLIy7tsE71Vx1\nIIvT7Kdyq66lMU4YzdrpKUcxv7oOQnO8DA1orKluNa4jkyXBywHKs/Q+20LVc+RD\ngKXqFGJUdo8mAxEScs0CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAkMxsU4VLPd4J\n0rElBNBIyqPtvnlTs6VkhIK0l4oM58wtDKc1uG9UPSX5j29NguZM6LOe0jCsU2Vg\nEpUseMWQjx4o2yBg7MokQyjWc1zu6PppKhQ+RqHQy/biJ2zsIMpX3oMASXffvnW5\nn4Bjyo1JdDJiLm1fLvLlVVxQoraJD+rtpqWDEYixGVREUo5OIL5Y5dVjkHG2r9RQ\nQuu3yEiyr9gAW8yhz3YR6/sJ6boyGK8NC0v8Jih7NnCdT+9ML+3jn3P5F3TeXdSf\nVeYIm5oWAOTe3AjjKP8ARMb2RYACjg80/AcowD/dvRRjbwQmyucUNug2pXJynXpD\nNfx1IBmUmzSAT1Z5yNuY/f3VRBJvmIQ6Jpmef+g0/wUJpyS4SObguItyYlFPLqRH\nK1oKqNX/uV0GWWEQl6Lml986TzlHxc4ljtHBhjzlKYIYYZLWWipk4JiB8hxJcTK+\ncrgvclEQSxFlmAyoqxYFClrOOsPqZJdBhDTvoUWnnWuJLQt7DLHpyInp+S75Gg3o\n0zgHpt9m26B3YbjQGYMQlYmhl2VLQa+Ey0W8UZQXLcTvoRT4p+8crqr6cNNsxCyZ\nm08vBbEMIMvhBeLQvpM75oaMBmelegipFl2eelxVIHdGJWoyJSZQUdXN0uSidhZp\nI7AIgzhqK1Ku/IXK0OSXJonn+/9X/VI=\n-----END CERTIFICATE-----",
"create_time": "2020-07-29T15:18:06+08:00",
"expire_at": "2132653492169",
"initial": {
"flag_position": [
-1.8683282713225706, -1.1184803014502747, -2.536637882840082
],
"fov": 95,
"heading": 0,
"latitude": 0,
"longitude": 5.58602282229265,
"pano": 4,
"pano_index": 4
},
"model": {
"file_url": "model/auto3d-syVb5hzy8ZL1gZut_VvGDo.at3d",
"material_base_url": "materials/",
"material_textures": [
"texture_0.jpg",
"texture_1.jpg",
"texture_2.jpg",
"texture_3.jpg",
"texture_4.jpg",
"texture_5.jpg",
"texture_6.jpg",
"texture_7.jpg",
"texture_8.jpg"
],
"modify_time": "2020-07-29T15:37:17+08:00",
"type": 0
},
"observers": [
{
"accessible_nodes": [1, 2, 3, 4, 6, 7, 8],
"floor_index": 0,
"index": 0,
"offset_point_count": 551,
"position": [-2.9148900508880615, 0, 1.392490029335022],
"quaternion": {
"w": 0.44238951628615497,
"x": -0.0011834399273419546,
"y": -0.8968221073969266,
"z": -0.00045692663054024737
},
"standing_position": [
-2.9148900508880615, -1.1193245547539874, 1.392490029335022
],
"visible_nodes": [1, 2, 3, 4, 6, 7, 8]
},
{
"accessible_nodes": [0, 2, 3, 4],
"floor_index": 0,
"index": 1,
"offset_point_count": 1382,
"position": [-1.780460000038147, -0.00217098998837173, 4.450079917907715],
"quaternion": {
"w": 0.46776604948048534,
"x": -0.0011699393533674196,
"y": -0.883851410579187,
"z": -0.000490464139922521
},
"standing_position": [
-1.780460000038147, -1.1214462854241507, 4.450079917907715
],
"visible_nodes": [0, 2, 3, 4]
},
{
"accessible_nodes": [0, 1, 3, 4],
"floor_index": 0,
"index": 2,
"offset_point_count": 378,
"position": [
-1.3428200483322144, -0.0028426700737327337, 6.358610153198242
],
"quaternion": {
"w": 0.6069850728938949,
"x": -0.001073151580086956,
"y": -0.7947122170838032,
"z": -0.0006765059598702671
},
"standing_position": [
-1.3428200483322144, -1.1225737228916606, 6.358610153198242
],
"visible_nodes": [0, 1, 3, 4]
},
{
"accessible_nodes": [0, 1, 2, 4, 6, 7, 8],
"floor_index": 0,
"index": 3,
"offset_point_count": 0,
"position": [
-2.554189920425415, -0.005082080140709877, 6.343259811401367
],
"quaternion": {
"w": -0.030997155509175898,
"x": -0.0033666821765646494,
"y": -0.9994984128781037,
"z": -0.005546881036692224
},
"standing_position": [
-2.554189920425415, -1.1224907918710612, 6.343259811401367
],
"visible_nodes": [0, 1, 2, 4, 6, 7, 8]
},
{
"accessible_nodes": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11],
"floor_index": 0,
"index": 4,
"offset_point_count": 941,
"position": [
-2.91471004486084, -0.0003035110130440444, 0.06049229949712753
],
"quaternion": {
"w": 0.0513025987418296,
"x": -0.0012676475973127641,
"y": -0.9986823460816978,
"z": 0.00004879134915086605
},
"standing_position": [
-2.91471004486084, -1.1184803014502747, 0.06049229949712753
],
"visible_nodes": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11]
},
{
"accessible_nodes": [4, 6, 9, 10],
"floor_index": 0,
"index": 5,
"offset_point_count": 863,
"position": [
-1.0017000436782837, -0.005517140030860901, -1.6075899600982666
],
"quaternion": {
"w": -0.0344319061946854,
"x": -0.001258810265919515,
"y": -0.9994062434209862,
"z": 0.0001571970577815824
},
"standing_position": [
-1.0017000436782837, -1.1178040247150276, -1.6075899600982666
],
"visible_nodes": [4, 6, 9, 10]
},
{
"accessible_nodes": [0, 3, 4, 5, 7, 8],
"floor_index": 0,
"index": 6,
"offset_point_count": 1322,
"position": [
-2.846139907836914, -0.001211759983561933, -3.169840097427368
],
"quaternion": {
"w": 0.32066123052403445,
"x": -0.0012332355032137405,
"y": -0.9471930957831524,
"z": -0.00029739399948980815
},
"standing_position": [
-2.846139907836914, -1.1164889512469, -3.169840097427368
],
"visible_nodes": [0, 3, 4, 5, 7, 8]
},
{
"accessible_nodes": [0, 3, 4, 6, 8],
"floor_index": 0,
"index": 7,
"offset_point_count": 2356,
"position": [
-3.0448501110076904, -0.0010134399635717273, -4.505109786987305
],
"quaternion": {
"w": 0.49087982982843503,
"x": -0.001156616652291604,
"y": -0.8712263733357108,
"z": -0.0005211039435373182
},
"standing_position": [
-3.0448501110076904, -1.11562920091362, -4.505109786987305
],
"visible_nodes": [0, 3, 4, 6, 8]
},
{
"accessible_nodes": [0, 3, 4, 6, 7],
"floor_index": 0,
"index": 8,
"offset_point_count": 234,
"position": [
-2.9152801036834717, -0.01438829954713583, -6.370659828186035
],
"quaternion": {
"w": -0.30469427695314993,
"x": 0.0033588028429806095,
"y": -0.952412964681632,
"z": -0.007724194714338225
},
"standing_position": [
-2.9152801036834717, -1.1144715989725875, -6.370659828186035
],
"visible_nodes": [0, 3, 4, 6, 7]
},
{
"accessible_nodes": [4, 5, 10, 11, 12, 13],
"floor_index": 0,
"index": 9,
"offset_point_count": 4886,
"position": [
-4.0423102378845215, 0.003333129920065403, -0.03953389823436737
],
"quaternion": {
"w": -0.18957592794754674,
"x": 0.010895134657991246,
"y": -0.9818002618819436,
"z": -0.0032427031038127978
},
"standing_position": [
-4.0423102378845215, -1.118231507556375, -0.03953389823436737
],
"visible_nodes": [4, 5, 10, 11, 12, 13]
},
{
"accessible_nodes": [4, 5, 9, 11],
"floor_index": 0,
"index": 10,
"offset_point_count": 1773,
"position": [
-4.850550174713135, 0.004613489843904972, 0.1713390052318573
],
"quaternion": {
"w": 0.12768161943121548,
"x": -0.0012676586552423492,
"y": -0.9918143930048722,
"z": -0.00004849317962342722
},
"standing_position": [
-4.850550174713135, -1.1182253683511887, 0.1713390052318573
],
"visible_nodes": [4, 5, 9, 11]
},
{
"accessible_nodes": [4, 9, 10],
"floor_index": 0,
"index": 11,
"offset_point_count": 654,
"position": [
-5.53085994720459, -0.013371099717915058, -0.143778994679451
],
"quaternion": {
"w": -0.0030183054753861976,
"x": -0.00047414000140664293,
"y": -0.9999897553992034,
"z": -0.0033406236879980804
},
"standing_position": [
-5.53085994720459, -1.1179010210789888, -0.143778994679451
],
"visible_nodes": [4, 9, 10]
},
{
"accessible_nodes": [9, 13],
"floor_index": 0,
"index": 12,
"offset_point_count": 1237,
"position": [
-4.178860187530518, -0.013643399812281132, 1.3469799757003784
],
"quaternion": {
"w": 0.06683888675991313,
"x": -0.0047767000805582485,
"y": -0.9977055393311836,
"z": -0.00966420424898995
},
"standing_position": [
-4.178860187530518, -1.1190794461899993, 1.3469799757003784
],
"visible_nodes": [9, 13]
},
{
"accessible_nodes": [9, 12],
"floor_index": 0,
"index": 13,
"offset_point_count": 466,
"position": [
-4.963950157165527, -0.005961719900369644, 3.710700035095215
],
"quaternion": {
"w": -0.19462188396064967,
"x": 0.004454742146828046,
"y": -0.9807853643462634,
"z": -0.012749200565824454
},
"standing_position": [
-4.963950157165527, -1.12043610464341, 3.710700035095215
],
"visible_nodes": [9, 12]
}
],
"panorama": {
"count": 14,
"list": [
{
"back": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_b.jpg",
"down": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_d.jpg",
"front": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_f.jpg",
"index": 0,
"left": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_l.jpg",
"right": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_r.jpg",
"up": "images/cube_2048/0/9bf403506f2bc22eea0a81cdb09a8e22/0_u.jpg"
},
{
"back": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_b.jpg",
"down": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_d.jpg",
"front": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_f.jpg",
"index": 1,
"left": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_l.jpg",
"right": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_r.jpg",
"up": "images/cube_2048/1/cb8db51bc30afdd40cf6e4f3f7341c40/1_u.jpg"
},
{
"back": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_b.jpg",
"down": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_d.jpg",
"front": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_f.jpg",
"index": 2,
"left": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_l.jpg",
"right": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_r.jpg",
"up": "images/cube_2048/2/67cdadb9caa0f844f56fee0aac7bb56d/2_u.jpg"
},
{
"back": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_b.jpg",
"down": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_d.jpg",
"front": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_f.jpg",
"index": 3,
"left": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_l.jpg",
"right": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_r.jpg",
"up": "images/cube_2048/3/791c38edaf6bbcc16e19682543745e9b/3_u.jpg"
},
{
"back": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_b.jpg",
"down": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_d.jpg",
"front": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_f.jpg",
"index": 4,
"left": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_l.jpg",
"right": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_r.jpg",
"up": "images/cube_2048/4/ee318d536c51ef3de38c4aa059d65ef0/4_u.jpg"
},
{
"back": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_b.jpg",
"down": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_d.jpg",
"front": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_f.jpg",
"index": 5,
"left": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_l.jpg",
"right": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_r.jpg",
"up": "images/cube_2048/5/b19d98dc23ec04d86df755dd1a15fdb3/5_u.jpg"
},
{
"back": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_b.jpg",
"down": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_d.jpg",
"front": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_f.jpg",
"index": 6,
"left": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_l.jpg",
"right": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_r.jpg",
"up": "images/cube_2048/6/b8f425e5f8943c38ad1386ab391b54bc/6_u.jpg"
},
{
"back": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_b.jpg",
"down": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_d.jpg",
"front": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_f.jpg",
"index": 7,
"left": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_l.jpg",
"right": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_r.jpg",
"up": "images/cube_2048/7/a05b06a01171babb1aceb5aad8406ab8/7_u.jpg"
},
{
"back": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_b.jpg",
"down": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_d.jpg",
"front": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_f.jpg",
"index": 8,
"left": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_l.jpg",
"right": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_r.jpg",
"up": "images/cube_2048/8/2cd717b9c97f48ae79511855cc7e5138/8_u.jpg"
},
{
"back": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_b.jpg",
"down": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_d.jpg",
"front": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_f.jpg",
"index": 9,
"left": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_l.jpg",
"right": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_r.jpg",
"up": "images/cube_2048/9/0b634fe985df7011472b81c75babfd95/9_u.jpg"
},
{
"back": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_b.jpg",
"down": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_d.jpg",
"front": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_f.jpg",
"index": 10,
"left": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_l.jpg",
"right": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_r.jpg",
"up": "images/cube_2048/10/40c1a6463b8c7462aadfca2a5f80f685/10_u.jpg"
},
{
"back": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_b.jpg",
"down": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_d.jpg",
"front": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_f.jpg",
"index": 11,
"left": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_l.jpg",
"right": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_r.jpg",
"up": "images/cube_2048/11/9663b7885a119f2f06da06212986bc9b/11_u.jpg"
},
{
"back": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_b.jpg",
"down": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_d.jpg",
"front": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_f.jpg",
"index": 12,
"left": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_l.jpg",
"right": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_r.jpg",
"up": "images/cube_2048/12/01f84f2edd8642d0bf5e4874d01a28ac/12_u.jpg"
},
{
"back": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_b.jpg",
"down": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_d.jpg",
"front": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_f.jpg",
"index": 13,
"left": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_l.jpg",
"right": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_r.jpg",
"up": "images/cube_2048/13/e9ce1249af9000a33d566c653560c3d6/13_u.jpg"
}
]
},
"picture_url": "https://vrlab-public.ljcdn.com/release/auto3dhd/9380ce27b46cbc5ba8d47fcf0e4c9e4f/screenshot/1596005211_4/pc0_3aoiit6zp.jpg",
"title_picture_url": "https://vrlab-public.ljcdn.com/release/auto3dhd/9380ce27b46cbc5ba8d47fcf0e4c9e4f/screenshot/1596005211_4/pc1_iQLf2N6a6_1.jpg",
"vr_code": "8054djM0oR6ky3Ey8e"
}
  • _signature / certificate: digital signature of work content

  • expire_at: work expiration time

  • allow_hosts: secure domain for work

  • initial: initialize data, a State data.Description of Work the position of the initial state loaded, also called the initial view of the VR

    • mode: models
    • pano_index: initialize point
    • longitude: Horizontal corner of camera
    • latitude: alpha corner of the camera
    • f: Visible angle in the vertical direction of the camera
  • model: three-dimensional model

    • file_url: resource address of the three-dimensional model, file .at3d for model format as deemed customized
    • material_textures: a map resource address for 3D models
  • panorama: panorama color information

    • list:
      • up / down / left / right / front / back: Global color information is stored and used in cubemap.
  • Observers: Gathering point information

    • visible_nodes: List of visibility between collection points
    • access_nodes: list of connections between collection points
    • quaternon: rotation offset between collection points and model coordinates
    • standing_position: Ground Coordinates of Gathering Points
    • position: collection point coordinates
    • floor_index: Gather Point Layer

Work Object

Compared to the work.jsonabove, you may have used Work Objects, he is the product of the parseWork function. Work object compared to work.json will be highly serialized and you can view the details in Five Five API document.

Learn about FiveProvider and FiveCanvas

Origins of FiveProvider and FiveCanvas

FiveProvider / FiveCanvas was developed through the Vue Provide/Inject API. We can think FiveProvider created a three-dimensional instance.FveCanvas is a canvas displayed in the DOM structure (cnavas).The children in FiveProvider can get information about the three-dimensional space or control the three-dimensional space using Inject available to FiveProvider . We have also developed a series of hooksto make it easier for you to do the above.

Such a description may not be well understood, so we do something at hand.

Add Mode Control Button

Our work done this time is to add a model control button,Five has been built. The default state is displayed as panorama. Like the final results in the previous chapter, we can also showcase the model mode to view the macro state of the three-dimensional space.To switch, we will use the Vue hooks of useCurrentState provided by the Five SDK.About Mode,State, useCurrentState etc. Learn more in the next chapter, and what we want to do in this chapter is:

  • Write a Vue component.
  • Put the component as a subcomponent of FiveProvider
  • Controls three-dimensional space with api provided by Five.

Install ui components

In order to reduce the complexity of the sample code, Bootstrap is used here as the UI library, you can also use Ant Design Fluent UI and so on.

Next start writing code

  1. Add a ModeController file to write components.
  2. First at the head from @realsee/five Reference Live Mode
  3. Mode is model type declaration.
  4. Fve.Mode[string] is a model enumeration.
  5. First at head from @realsee/five/vue Reference useFiveCurrentState
  6. Write ModeController component.
  7. Add UI.
  8. Get and set the pattern (mode) of three-dimensional spaces with useFiveCurrentState.
src/1.displaying-work/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="data:;base64,iVBORw0KGgo=" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Show space | Display a work</title>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css"
rel="stylesheet"
crossorigin="anonymous"
/>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css"
rel="stylesheet"
/>
<style>
* {
margin: 0;
padding: 0;
}

html,
body,
#app {
width: 100%;
height: 100%;
overflow: hidden;
}
</style>
</head>

<body>
<div id="app"></div>
<script type="module" src="./index"></script>
</body>
</html>
src/1.displaying-work/ModeController.vue
<template>
<nav class="navbar fixed-bottom navbar-light bg-light">
<div class="container-fluid justify-content-center">
<div class="btn-group">
<button
:class="
state.mode == 'Panorama'
? 'btn btn-primary active'
: 'btn btn-primary'
"
@click="() => setState({ mode: Five.Mode.Panorama })"
>
Panorama roaming
</button>
<button
:class="
state.mode == 'Panorama'
? 'btn btn-primary'
: 'btn btn-primary active'
"
@click="() => setState({ mode: Five.Mode.Floorplan })"
>
Space overview
</button>
</div>
</div>
</nav>
</template>

<script setup>
import { useFiveCurrentState } from "@realsee/five/vue";
import { Five } from "@realsee/five";

const [state, setState] = useFiveCurrentState();
</script>

Use Mode Control Button Component

Then insert the ModeController component into the App File FiveProvider.

rc/1.displaying-work/App.vue
<template>
<FiveProvider :work="work">
<FiveCanvas :width="width" :height="height" />
<ModeController />
</FiveProvider>
</template>

<script setup>
import { FiveProvider, FiveCanvas } from "@realsee/five/vue";
import { parseWork } from "@realsee/five";
import { ref } from "vue";
import { useWindowDimensions } from "./useWindowDimensions";
import ModeController from "./ModeController.vue";
const work = ref();
const workURL =
"https://vrlab-public.ljcdn.com/release/static/image/release/five/work-sample/07bdc58f413bc5494f05c7cbb5cbdce4/work.json";

fetch(workURL)
.then((response) => response.text())
.then((text) => (work.value = parseWork(text)));
const { width, height } = useWindowDimensions();
</script>

Returning to your browser to view it, you will find control bars at the bottom of your page, Panoramic Roaming space overview allows three-dimensional space to change status.

Good 🥳 !

The next section will be completed by you

Next section will be successful
  • Learn what is State.
  • How to change the directions/position of 3D space observation.
  • Learn how to work with the code just now, such as useCurrentState and other responses.
  • Autoring features via State.