diff --git a/sandbox/embed_selfhost_code_url.html b/sandbox/embed_selfhost_code_url.html
index 2c98cac..073706c 100644
--- a/sandbox/embed_selfhost_code_url.html
+++ b/sandbox/embed_selfhost_code_url.html
@@ -29,7 +29,8 @@
camera : new OV.Camera (
new OV.Coord3D (-1.5, 2.0, 3.0),
new OV.Coord3D (0.0, 0.0, 0.0),
- new OV.Coord3D (0.0, 1.0, 0.0)
+ new OV.Coord3D (0.0, 1.0, 0.0),
+ 45.0
),
backgroundColor : new OV.RGBAColor (255, 255, 255, 255),
defaultColor : new OV.RGBColor (200, 200, 200),
diff --git a/source/engine/parameters/parameterlist.js b/source/engine/parameters/parameterlist.js
index 697f107..ccc90b5 100644
--- a/source/engine/parameters/parameterlist.js
+++ b/source/engine/parameters/parameterlist.js
@@ -49,7 +49,8 @@ export let ParameterConverter =
let cameraParameters = [
this.NumberToString (camera.eye.x), this.NumberToString (camera.eye.y), this.NumberToString (camera.eye.z),
this.NumberToString (camera.center.x), this.NumberToString (camera.center.y), this.NumberToString (camera.center.z),
- this.NumberToString (camera.up.x), this.NumberToString (camera.up.y), this.NumberToString (camera.up.z)
+ this.NumberToString (camera.up.x), this.NumberToString (camera.up.y), this.NumberToString (camera.up.z),
+ this.NumberToString (camera.fov)
].join (',');
return cameraParameters;
},
@@ -60,13 +61,20 @@ export let ParameterConverter =
return null;
}
let paramParts = str.split (',');
- if (paramParts.length !== 9) {
+ if (paramParts.length < 9) {
return null;
}
+
+ let fieldOfView = 45.0;
+ if (paramParts.length >= 10) {
+ fieldOfView = this.StringToNumber (paramParts[9]);
+ }
+
let camera = new Camera (
new Coord3D (this.StringToNumber (paramParts[0]), this.StringToNumber (paramParts[1]), this.StringToNumber (paramParts[2])),
new Coord3D (this.StringToNumber (paramParts[3]), this.StringToNumber (paramParts[4]), this.StringToNumber (paramParts[5])),
- new Coord3D (this.StringToNumber (paramParts[6]), this.StringToNumber (paramParts[7]), this.StringToNumber (paramParts[8]))
+ new Coord3D (this.StringToNumber (paramParts[6]), this.StringToNumber (paramParts[7]), this.StringToNumber (paramParts[8])),
+ fieldOfView
);
return camera;
},
diff --git a/source/engine/viewer/camera.js b/source/engine/viewer/camera.js
index 9b44d3f..2ec3804 100644
--- a/source/engine/viewer/camera.js
+++ b/source/engine/viewer/camera.js
@@ -1,12 +1,14 @@
import { CoordIsEqual3D } from '../geometry/coord3d.js';
+import { IsEqual } from '../geometry/geometry.js';
export class Camera
{
- constructor (eye, center, up)
+ constructor (eye, center, up, fov)
{
this.eye = eye;
this.center = center;
this.up = up;
+ this.fov = fov;
}
Clone ()
@@ -14,12 +16,13 @@ export class Camera
return new Camera (
this.eye.Clone (),
this.center.Clone (),
- this.up.Clone ()
+ this.up.Clone (),
+ this.fov
);
}
}
export function CameraIsEqual3D (a, b)
{
- return CoordIsEqual3D (a.eye, b.eye) && CoordIsEqual3D (a.center, b.center) && CoordIsEqual3D (a.up, b.up);
+ return CoordIsEqual3D (a.eye, b.eye) && CoordIsEqual3D (a.center, b.center) && CoordIsEqual3D (a.up, b.up) && IsEqual (a.fov, b.fov);
}
diff --git a/source/engine/viewer/navigation.js b/source/engine/viewer/navigation.js
index a8fe054..9ad2594 100644
--- a/source/engine/viewer/navigation.js
+++ b/source/engine/viewer/navigation.js
@@ -339,7 +339,7 @@ export class Navigation
this.Update ();
}
- GetFitToSphereCamera (center, radius, fov)
+ GetFitToSphereCamera (center, radius)
{
if (IsZero (radius)) {
return null;
@@ -352,7 +352,7 @@ export class Navigation
fitCamera.center = center.Clone ();
let centerEyeDirection = SubCoord3D (fitCamera.eye, fitCamera.center).Normalize ();
- let fieldOfView = fov / 2.0;
+ let fieldOfView = this.camera.fov / 2.0;
if (this.canvas.width < this.canvas.height) {
fieldOfView = fieldOfView * this.canvas.width / this.canvas.height;
}
diff --git a/source/engine/viewer/viewer.js b/source/engine/viewer/viewer.js
index b571392..46653b2 100644
--- a/source/engine/viewer/viewer.js
+++ b/source/engine/viewer/viewer.js
@@ -11,23 +11,27 @@ import * as THREE from 'three';
export function GetDefaultCamera (direction)
{
+ let fieldOfView = 45.0;
if (direction === Direction.X) {
return new Camera (
new Coord3D (2.0, -3.0, 1.5),
new Coord3D (0.0, 0.0, 0.0),
- new Coord3D (1.0, 0.0, 0.0)
+ new Coord3D (1.0, 0.0, 0.0),
+ fieldOfView
);
} else if (direction === Direction.Y) {
return new Camera (
new Coord3D (-1.5, 2.0, 3.0),
new Coord3D (0.0, 0.0, 0.0),
- new Coord3D (0.0, 1.0, 0.0)
+ new Coord3D (0.0, 1.0, 0.0),
+ fieldOfView
);
} else if (direction === Direction.Z) {
return new Camera (
new Coord3D (-1.5, -3.0, 2.0),
new Coord3D (0.0, 0.0, 0.0),
- new Coord3D (0.0, 0.0, 1.0)
+ new Coord3D (0.0, 0.0, 1.0),
+ fieldOfView
);
}
return null;
@@ -322,9 +326,8 @@ export class Viewer
}
let center = new Coord3D (boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z);
let radius = boundingSphere.radius;
- let fov = this.camera.fov;
- let newCamera = this.navigation.GetFitToSphereCamera (center, radius, fov);
+ let newCamera = this.navigation.GetFitToSphereCamera (center, radius);
this.navigation.MoveCamera (newCamera, animation ? this.settings.animationSteps : 0);
}
@@ -513,12 +516,11 @@ export class Viewer
InitNavigation ()
{
- this.camera = new THREE.PerspectiveCamera (45.0, this.canvas.width / this.canvas.height, 0.1, 1000.0);
+ let camera = GetDefaultCamera (Direction.Z);
+ this.camera = new THREE.PerspectiveCamera (camera.fov, this.canvas.width / this.canvas.height, 0.1, 1000.0);
this.scene.add (this.camera);
let canvasElem = this.renderer.domElement;
- let camera = GetDefaultCamera (Direction.Z);
-
this.navigation = new Navigation (canvasElem, camera, {
onUpdate : () => {
this.Render ();
diff --git a/test/tests/parameterlist_test.js b/test/tests/parameterlist_test.js
index 2b4a2a8..416e39d 100644
--- a/test/tests/parameterlist_test.js
+++ b/test/tests/parameterlist_test.js
@@ -10,7 +10,8 @@ describe ('Parameter List', function () {
let camera = new OV.Camera (
new OV.Coord3D (1.0, 1.0, 1.0),
new OV.Coord3D (0.0, 0.0, 0.0),
- new OV.Coord3D (0.0, 0.0, 1.0)
+ new OV.Coord3D (0.0, 0.0, 1.0),
+ 45.0
);
let background = new OV.RGBAColor (4, 5, 6, 7);
let color = new OV.RGBColor (1, 2, 3);
@@ -25,10 +26,10 @@ describe ('Parameter List', function () {
edgeThreshold : 15
}).GetParameterList ();
assert.strictEqual (urlParams1, 'model=a.txt,b.txt');
- assert.strictEqual (urlParams2, 'camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000');
- assert.strictEqual (urlParams3, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000');
- assert.strictEqual (urlParams4, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000$defaultcolor=1,2,3');
- assert.strictEqual (urlParams5, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3');
+ assert.strictEqual (urlParams2, 'camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000');
+ assert.strictEqual (urlParams3, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000');
+ assert.strictEqual (urlParams4, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$defaultcolor=1,2,3');
+ assert.strictEqual (urlParams5, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3');
assert.strictEqual (urlParams6, 'edgesettings=on,1,2,3,15');
});
@@ -37,13 +38,15 @@ describe ('Parameter List', function () {
let camera = new OV.Camera (
new OV.Coord3D (1.0, 1.0, 1.0),
new OV.Coord3D (0.0, 0.0, 0.0),
- new OV.Coord3D (0.0, 0.0, 1.0)
+ new OV.Coord3D (0.0, 0.0, 1.0),
+ 45.0
);
let background = new OV.RGBAColor (4, 5, 6, 7);
let color = new OV.RGBColor (1, 2, 3);
let urlParamsLegacy = 'a.txt,b.txt';
let urlParams1 = 'model=a.txt,b.txt';
let urlParams2 = 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000';
+ let urlParams2b = 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000,60.0000';
let urlParams3 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000';
let urlParams4 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$defaultcolor=1,2,3';
let urlParams5 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3';
@@ -59,6 +62,10 @@ describe ('Parameter List', function () {
assert.deepStrictEqual (parser2.GetModelUrls (), null);
assert.deepStrictEqual (parser2.GetCamera (), camera);
assert.deepStrictEqual (parser2.GetDefaultColor (), null);
+ let parser2b = OV.CreateUrlParser (urlParams2b);
+ assert.deepStrictEqual (parser2b.GetModelUrls (), null);
+ assert.deepStrictEqual (parser2b.GetCamera (), new OV.Camera (new OV.Coord3D (1.0, 1.0, 1.0), new OV.Coord3D (0.0, 0.0, 0.0), new OV.Coord3D (0.0, 0.0, 1.0), 60.0));
+ assert.deepStrictEqual (parser2b.GetDefaultColor (), null);
let parser3 = OV.CreateUrlParser (urlParams3);
assert.deepStrictEqual (parser3.GetModelUrls (), modelUrls);
assert.deepStrictEqual (parser3.GetCamera (), camera);