From 0177635ab570d50161391f16d1036f1128f5608f Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:07:20 +0100 Subject: [PATCH 1/7] Create cameras --- applications/cameras | 1 + 1 file changed, 1 insertion(+) create mode 100644 applications/cameras diff --git a/applications/cameras b/applications/cameras new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/applications/cameras @@ -0,0 +1 @@ + From 222aab0d1935080c35b1ebd520e2e75c5975a551 Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:08:03 +0100 Subject: [PATCH 2/7] Delete cameras --- applications/cameras | 1 - 1 file changed, 1 deletion(-) delete mode 100644 applications/cameras diff --git a/applications/cameras b/applications/cameras deleted file mode 100644 index 8b13789..0000000 --- a/applications/cameras +++ /dev/null @@ -1 +0,0 @@ - From 0785f077b49ca93e65f8dfd3f948d36eae5756cd Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:11:05 +0100 Subject: [PATCH 3/7] camerasp --- applications/cameras/cameras | 1 + 1 file changed, 1 insertion(+) create mode 100644 applications/cameras/cameras diff --git a/applications/cameras/cameras b/applications/cameras/cameras new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/applications/cameras/cameras @@ -0,0 +1 @@ + From a946ce3ddedb8df62e210fe46386ba57e297b3d3 Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:12:01 +0100 Subject: [PATCH 4/7] Add files via upload --- applications/cameras/Camera.fbx | Bin 0 -> 21692 bytes applications/cameras/CameraPos-active.svg | 75 +++++ applications/cameras/CameraPos-inactive.svg | 75 +++++ applications/cameras/CameraPos.html | 86 ++++++ applications/cameras/CameraPositions.js | 323 ++++++++++++++++++++ 5 files changed, 559 insertions(+) create mode 100644 applications/cameras/Camera.fbx create mode 100644 applications/cameras/CameraPos-active.svg create mode 100644 applications/cameras/CameraPos-inactive.svg create mode 100644 applications/cameras/CameraPos.html create mode 100644 applications/cameras/CameraPositions.js diff --git a/applications/cameras/Camera.fbx b/applications/cameras/Camera.fbx new file mode 100644 index 0000000000000000000000000000000000000000..a2092ce63422b904d37f4eef5e23475e8fa85663 GIT binary patch literal 21692 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 + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/applications/cameras/CameraPos-inactive.svg b/applications/cameras/CameraPos-inactive.svg new file mode 100644 index 0000000..0cba5e1 --- /dev/null +++ b/applications/cameras/CameraPos-inactive.svg @@ -0,0 +1,75 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/applications/cameras/CameraPos.html b/applications/cameras/CameraPos.html new file mode 100644 index 0000000..aeb7aac --- /dev/null +++ b/applications/cameras/CameraPos.html @@ -0,0 +1,86 @@ + + + Cameras + + + + + + +
+

Camera position app

+
+
+

This app is used to setup camera positions for streaming or recording. With it you can capture the position of the overte camera

+

Keyboard shortcuts:
+

F1 to F12:

+

go into camera mode, fullscreen, no overlays

+

Shift + F1 to F12:

+

add camera at current viewpoint

+

using Shift + F1 to F12 on existing camera removes it

+

c:

+

change audio mode: avatar - camera

+

n:

+

get out of camera mode

+

l:

+

toggles visibity of the camera entities

+

m:

+

gather cameras on the domain when you loose them

+

4,6:

+

in camera mode, rotate around y-axis

+

8,5:

+

in camera mode, rotate around x-axis

+ + diff --git a/applications/cameras/CameraPositions.js b/applications/cameras/CameraPositions.js new file mode 100644 index 0000000..acbba62 --- /dev/null +++ b/applications/cameras/CameraPositions.js @@ -0,0 +1,323 @@ +// +// CameraPositions.js +// +// Created by Basinsky on 5 Mar 2021 +// +// script to setup camera's for an event +// press shift + F1 to F12 on the keyboard to create a camera at the position of the current Overte Camera +// press F1 to F12 to switch between camera points if they exist +// press c to change audi mode (Avatar-Camera) +// press n to quit camera mode +// press l to hide/unhide the camera's +// press m to update the camera list if you crashed or left the domain and come back +// stopping the script will remove the camera's +// using numbers on the keypad (4,6) for the y axis and (8,5) for the x axis you can rotate the camera to adjust it +// for events make sure to put the view on fullscreen from the pulldown menu and disable your audio level meter. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +(function() { + var LOCATION_ROOT_URL = Script.resolvePath("."); + var FORM_URL = "https://htmlpreview.github.io/?" + LOCATION_ROOT_URL + "CameraPos.html?" + Date.now(); + var onForm = false; + var button; + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + var allEntities; + var TOTAL_CAMERAS = 12; + var cameraIDs = []; + var reset = true; + var RESET_TIME = 20; + var cameraCounter = 0; + var isVisible = true; + var isFullscreen = false; + var isOverlays = true; + var isRunning = false; + var isCameraListeningPosition = false; + var HALF_CIRCLE_DEGREE = 180; + + // Fill array + for (var i = 0; i < TOTAL_CAMERAS+1; i++) { + cameraIDs[i] = "X"; + } + + button = tablet.addButton({ + icon: LOCATION_ROOT_URL + "CameraPos-inactive.svg", + activeIcon: LOCATION_ROOT_URL + "CameraPos-active.svg", + text: "CAMERAS" + }); + + function onClicked() { + if (onForm) { + tablet.gotoHomeScreen(); + } else { + onForm = true; + tablet.gotoWebScreen(FORM_URL); + } + } + + function onScreenChanged(type, url) { + print(JSON.stringify(url)); + if (type === "Web" && url.indexOf(FORM_URL) !== -1) { + button.editProperties({ isActive: true }); + } else { + button.editProperties({ isActive: false }); + onForm = false; + } + } + + function generateQuatFromDegreesViaRadians(rotxdeg,rotydeg,rotzdeg) { + var rotxrad = (rotxdeg/HALF_CIRCLE_DEGREE)*Math.PI; + var rotyrad = (rotydeg/HALF_CIRCLE_DEGREE)*Math.PI; + var rotzrad = (rotzdeg/HALF_CIRCLE_DEGREE)*Math.PI; + var newRotation = Quat.fromPitchYawRollRadians(rotxrad,rotyrad,rotzrad); + return newRotation; + } + + function getCameras() { + for (var i = 0; i < TOTAL_CAMERAS; i++) { + cameraIDs[i] = "X"; + } + allEntities = Entities.findEntities(MyAvatar.position, 10000); + for (var j in allEntities) { + var props = Entities.getEntityProperties(allEntities[j]); + if (props.name.slice(0,6) === "Camera") { + print(props.name); + var cameraNumber = parseInt(props.name.slice(6)); + cameraIDs[cameraNumber] = props.id; + } + } + } + + function addCamera(counter) { + var currentCameraRotation = Camera.orientation; + var currentCameraPosition = Camera.position; + var cameraID = Entities.addEntity({ + type: "Model", + name: "Camera" + counter, + position: currentCameraPosition, + rotation: currentCameraRotation, + collisionless: true, + visible: true, + modelURL: LOCATION_ROOT_URL + "Camera.fbx?" + Date.now(), + userData: "{ \"grabbableKey\": { \"grabbable\": true, \"triggerable\": false}}" + }); + Entities.addEntity({ + type: "Text", + name: "TextCamera" + counter, + parentID: cameraID, + collisionless: true, + localPosition: {x: 0,y: 0.16 ,z: 0.32}, + localRotation: generateQuatFromDegreesViaRadians(0,0,0), + text: "F" + counter, + lineHeight: 0.18, + localDimensions: {x: 0.2763 ,y: 0.1817 ,z: 0.01} + + }); + cameraIDs[counter] = cameraID; + } + + function removeCamera(counter) { + Entities.deleteEntity(cameraIDs[counter]); + cameraIDs[counter] = "X"; + } + + function showCameraView(counter) { + isRunning = true; + var isFullscreen = Menu.isOptionChecked("Fullscreen"); + if (!isFullscreen) { + Menu.triggerOption('Fullscreen'); + } + var isOverlays = Menu.isOptionChecked("Show Overlays"); + if (isOverlays) { + Menu.triggerOption('Show Overlays'); + } + Camera.captureMouse = true; + Camera.mode = "entity"; + Camera.cameraEntity = cameraIDs[counter]; + // set listener position to camera position + Script.setTimeout(function () { + MyAvatar.audioListenerMode = MyAvatar.audioListenerModeCustom; + MyAvatar.customListenPosition = Camera.position; + MyAvatar.customListenOrientation = Camera.orientation; + isCameraListeningPosition = true; + }, 100); + + if (isVisible) { + showMessage("F" + counter, 150 , 200); + } + } + + function rotateCamera(xAxis,yAxis) { + var cameraProps = Entities.getEntityProperties(cameraIDs[cameraCounter]); + print(cameraProps.name); + var eulerAngles = Quat.safeEulerAngles(cameraProps.rotation); + eulerAngles.y = eulerAngles.y + yAxis * 0.2; + eulerAngles.x = eulerAngles.x + xAxis * 0.2; + print(JSON.stringify({x: eulerAngles.x,y: eulerAngles.y,z: eulerAngles.z})); + var newRotation = Quat.fromPitchYawRollDegrees(eulerAngles.x, eulerAngles.y, eulerAngles.z ); + Entities.editEntity(cameraIDs[cameraCounter],{rotation: newRotation}); + } + + function toggleVisibility() { + isVisible = !isVisible; + for (var i in cameraIDs) { + if (cameraIDs[i] !== "X") { + Entities.editEntity(cameraIDs[i], {visible: isVisible }); + var childEntities = Entities.getChildrenIDs(cameraIDs[i]); + for (var j in childEntities) { + Entities.editEntity(childEntities[j], {visible: isVisible }); + } + } + } + } + function toggleListeningMethod() { + isCameraListeningPosition = !isCameraListeningPosition; + var modeMessage; + if (isCameraListeningPosition) { + modeMessage = "audio mode:\n\n Camera"; + Script.setTimeout(function () { + MyAvatar.audioListenerMode = MyAvatar.audioListenerModeCustom; + MyAvatar.customListenPosition = Camera.position; + MyAvatar.customListenOrientation = Camera.orientation; + isCameraListeningPosition = true; + }, 100); + } else { + modeMessage = "audio mode:\n\n Avatar"; + Script.setTimeout(function () { + MyAvatar.audioListenerMode = MyAvatar.audioListenerModeHead; + isCameraListeningPosition = false; + }, 100); + + } + showMessage(modeMessage, 30 ,200); + } + + function showMessage(messageText, fontHeight, size) { + var xposition = Window.innerWidth/2; + var yposition = Window.innerHeight/2; + var overlayID = Overlays.addOverlay("text", { + x: xposition - size/2, + y: yposition - size/2, + width: size, + height: size, + leftMargin: 20, + topMargin: 20, + text: messageText, + font: {size: fontHeight}, + backgroundColor: {r: 100,g: 100,b: 100} + }); + Script.setTimeout(function () { + Overlays.deleteOverlay(overlayID); + }, 1000); + } + + Script.setInterval(function () { + reset = true; + }, RESET_TIME); + + function keyPressEvent(event) { + if (reset) { + if (event.text.toLowerCase() === "k" ) { + isFullscreen = Menu.isOptionChecked("Fullscreen"); + if (!isFullscreen) { + Menu.triggerOption('Fullscreen'); + } + isOverlays = Menu.isOptionChecked("Show Overlays"); + if (!isOverlays) { + Menu.triggerOption('Show Overlays'); + } + } + + if (event.text.toLowerCase() === "m" ) { + print("m pressed"); + getCameras(); + } + + if (event.text.toLowerCase() === "n" ) { + isFullscreen = Menu.isOptionChecked("Fullscreen"); + if (isFullscreen) { + Menu.triggerOption('Fullscreen'); + } + isOverlays = Menu.isOptionChecked("Show Overlays"); + if (!isOverlays) { + Menu.triggerOption('Show Overlays'); + } + Camera.mode = "first person"; + Camera.captureMouse = false; + MyAvatar.audioListenerMode = MyAvatar.audioListenerModeHead; + isCameraListeningPosition = false; + isRunning = false; + } + if (event.text.toLowerCase() === "l" ) { + toggleVisibility(); + } + if (event.text === "4" ) { + // left + rotateCamera(0,-1); + } + if (event.text === "5" ) { + // down + rotateCamera(-1,0); + } + if (event.text === "6" ) { + // right + rotateCamera(0,1); + } + if (event.text === "8" ) { + // up + rotateCamera(1,0); + } + if (event.text.toLowerCase() === "c" ) { + if (isRunning) { + toggleListeningMethod(); + } + } + + if (event.text.slice(0,1) === "F" && event.text.length > 1 && event.isShifted) { + cameraCounter = (parseInt(event.text.slice(1))); + print("de cameracounter = " + (parseInt(event.text.slice(1)))); + if (cameraIDs[cameraCounter] === "X") { + print("adding camera " + cameraCounter); + addCamera(cameraCounter); + } else { + removeCamera(cameraCounter); + print("removing camera " + cameraCounter); + } + print(JSON.stringify(cameraIDs)); + } + + if (event.text.slice(0,1) === "F" && event.text.length > 1 && !event.isShifted) { + cameraCounter = parseInt(event.text.slice(1)); + if (cameraIDs[cameraCounter] !== "X") { + print("showing camera " + cameraCounter); + showCameraView(cameraCounter); + } + } + reset = false; + } + } + + Script.scriptEnding.connect(function () { + if (onForm) { + tablet.gotoHomeScreen(); + } + button.clicked.disconnect(onClicked); + tablet.screenChanged.disconnect(onScreenChanged); + if (tablet) { + tablet.removeButton(button); + } + Controller.keyPressEvent.disconnect(keyPressEvent); + for (var j in cameraIDs) { + // Entities.deleteEntity(cameraIDs[j]); + } + Camera.mode = "first person"; + Camera.captureMouse = false; + MyAvatar.audioListenerMode = MyAvatar.audioListenerModeHead; + isCameraListeningPosition = false; + }); + + button.clicked.connect(onClicked); + tablet.screenChanged.connect(onScreenChanged); + Controller.keyPressEvent.connect(keyPressEvent); +}()); \ No newline at end of file From 91ef9e59a8afe24da5d30e35e001d1b3f640f5e1 Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:12:29 +0100 Subject: [PATCH 5/7] Delete cameras --- applications/cameras/cameras | 1 - 1 file changed, 1 deletion(-) delete mode 100644 applications/cameras/cameras diff --git a/applications/cameras/cameras b/applications/cameras/cameras deleted file mode 100644 index 8b13789..0000000 --- a/applications/cameras/cameras +++ /dev/null @@ -1 +0,0 @@ - From 8b1444c265c968dd2d55009bf4c91ee9ebad65fc Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Fri, 13 Jan 2023 21:19:07 +0100 Subject: [PATCH 6/7] Add files via upload --- applications/metadata.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/applications/metadata.js b/applications/metadata.js index fd09428..d6cf584 100644 --- a/applications/metadata.js +++ b/applications/metadata.js @@ -170,6 +170,15 @@ var metadata = { "applications": "jsfile": "tabletCam/tabletCam_app.js", "icon": "tabletCam/appIcons/snap-pro-i.svg", "caption": "SNAP-PRO" + }, + { + "isActive": true, + "directory": "cameras", + "name": "cameras", + "description": "Setup 12 cameras in desktop mode and switch viewpoints using F1 to F12 keys", + "jsfile": "cameras/CameraPositions.js", + "icon": "cameras/CameraPos-inactive.svg", + "caption": "CAMERAS" } ] -}; +}; \ No newline at end of file From 5d93e3af7e8b2438b55fb68086e2c185b9dae651 Mon Sep 17 00:00:00 2001 From: Basinsky <51274563+Basinsky@users.noreply.github.com> Date: Sun, 26 Feb 2023 16:57:37 +0100 Subject: [PATCH 7/7] Add files via upload --- applications/cameras/CameraPos.html | 13 +- applications/cameras/CameraPositions.js | 2 +- applications/cameras/LICENSE | 201 ++++++++++++++++++++++++ applications/cameras/metadata.js | 184 ++++++++++++++++++++++ 4 files changed, 393 insertions(+), 7 deletions(-) create mode 100644 applications/cameras/LICENSE create mode 100644 applications/cameras/metadata.js diff --git a/applications/cameras/CameraPos.html b/applications/cameras/CameraPos.html index aeb7aac..c79cf47 100644 --- a/applications/cameras/CameraPos.html +++ b/applications/cameras/CameraPos.html @@ -3,12 +3,12 @@ Cameras -